Guest User

Untitled

a guest
Jul 22nd, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.80 KB | None | 0 0
  1. from numpy import *
  2. from itertools import *
  3. import matplotlib.dates as mdates
  4. import math
  5.  
  6. trendVul = 5
  7. rectVul = 0.03
  8. div = 8
  9.  
  10. def regression(values):
  11.     """Wyznaczamy prosta ktora najlepiej przybliza wykres - y = ax + b"""
  12.     A = vstack([arange(len(values)), ones(len(values))]).T
  13.     a,b = linalg.lstsq(A,values)[0]
  14.     return a,b
  15.  
  16. def trend(a):
  17.     """Na podstawie wskaznika kierunkowego prostej wyznaczamy trend"""
  18.     angle = arctan(a)
  19.     angle = angle*(180.0/pi)
  20.     if (angle > -trendVul and angle < trendVul):
  21.             return 0 # horyzontalny
  22.     if (angle > trendVul and angle < 90):
  23.             return 1 # rosnacy
  24.     if (angle <-trendVul and angle > -90):
  25.             return -1 # malejacy
  26.            
  27. def getChannelLines(array):
  28.     """Wylicza """
  29.     if len(array) < 9:
  30.         return findMaxMin(array, 4)
  31.     else:
  32.         return findMaxMin(array[3*len(array)/4:])
  33.  
  34. def linearFun(array):
  35.     if array.size < 2:
  36.         return 0, 0
  37.     a = (array[1]-array[0])*1.0
  38.     b = array[0]
  39.     return a,b
  40.  
  41. def aInRect(array):
  42.     """Sprawdzamy czy punkty w tablicy naleza do prostej +/- rectVul"""
  43.     a, b = linearFun(array)
  44.     if a == 0:
  45.         return 0
  46.     for i in range(2,array.size):
  47.             y = a*i+b
  48.             if y > (1+rectVul)*array[i] or y < (1-rectVul)*array[i]:
  49.                     return 0
  50.     return 1      
  51.  
  52. def divideArray(array, factor):
  53.     """Dzielimy tablice na #factor tablic, kazda podtablica ma tyle samo elem oprocz ostatniej"""
  54.     factor = min(factor, len(array))
  55.     length = floor(len(array)*1.0/factor)
  56.     res = []
  57.     for i in range(factor - 1):
  58.         res = res + list([array[i*length:(i+1)*length]])
  59.     return asarray(res + list([array[length*(factor - 1):]]))
  60.        
  61. def findMaxMin(array, factor=div):
  62.     """Znajdujemy linie wsparcia i oporu"""
  63.     z = divideArray(asarray(array), factor)
  64.     print "tablica podtablic ", z
  65.     x = asarray(map(lambda x: min(x), z))
  66.     x2 = asarray(map(lambda x: max(x), z))
  67.     print x
  68.     for i in reversed(range(x.size)):
  69.         print i
  70.         y = asarray(list(combinations(x, i+1)))
  71.         z = map(aInRect, y)
  72.         if max(z) == 1:
  73.             sup = y[z.index(max(z))]
  74.             break
  75.     for i in reversed(range(x.size)):
  76.         print i
  77.         y = asarray(list(combinations(x2, i+1)))
  78.         z = map(aInRect, y)
  79.         if max(z) == 1:
  80.             res = y[z.index(max(z))]
  81.             break
  82.     return array, sup, res    
  83.    
  84. def headAndShoulders(values, volumine, maxVal, maxVol):
  85.     print len(values), len(volumine)
  86.     if len(values) != 3 or len(volumine) != 3:
  87.         return 0
  88.     leftArmVal = list(values[0])
  89.     headVal = list(values[1])
  90.     rightArmVal = list(values[2])
  91.     leftArmVol = list(volumine[0])
  92.     headVol = list(volumine[1])
  93.     rightArmVol = list(volumine[2])
  94.     maxLeftArmVal = max(leftArmVal)
  95.     maxLeftArmVol = max(leftArmVol)
  96.     maxHeadVal = max(headVal)
  97.     maxHeadVol = max(headVol)
  98.     maxRightArmVol = max(rightArmVol)
  99.     maxRightArmVal = max(rightArmVal)
  100.     print 'A'
  101.     #Wartosc lewego ramienia < glowy i wartosc wolumenu lewego ramienia ma byc najwieksza
  102.     if maxLeftArmVal > maxHeadVal  or maxRightArmVal > maxHeadVal or maxLeftArmVol < maxHeadVol or maxLeftArmVol < maxRightArmVol:
  103.         return 0
  104.     print 'B'
  105.     #wartosc prawego ramienia nie moze zbyt odbiegac od wartosci lewego
  106.     if maxRightArmVal > 1.2 * maxLeftArmVal or maxRightArmVal < 0.8*maxLeftArmVal:
  107.         return 0
  108.     print 'C'
  109.     #wolumin na formacji ma byc malejacy
  110.     a, b = regression(leftArmVol+headVol + rightArmVol)
  111.     if (trend(a) > -1):
  112.         return 0
  113.     print 'D'
  114.     #wykreslamy linie szyi
  115.     minLeftArmVal = min(leftArmVal[leftArmVal.index(maxLeftArmVal):]) #min z prawej strony max lewego ramienia
  116.     minHeadVal = min(headVal[headVal.index(maxHeadVal):])
  117.     return (1.0*maxHeadVal/maxVal + 1.0*maxLeftArmVol/maxVol)/2    
  118.  
  119. def lookForHeadAndShoulders(values, volumine):
  120.     """Szukamy formacji glowy i ramion"""
  121.     maxVal = max(values)
  122.     maxVol = max(volumine)
  123.     val = asarray(list(combinations(divideArray(values, div), 3)))
  124.     vol = asarray(list(combinations(divideArray(volumine, div), 3)))
  125.     z = map(lambda x, y: headAndShoulders(val, vol, maxVal, maxVol), val, vol)
  126.     if max(z) > 0:
  127.         return val[z.index(max(z))], vol[z.index(max(z))]
  128.     print "nie znaleziono"
  129.     return 0
  130.    
  131. def reversedHeadAndShoulders(values, volumine, maxVal, maxVol):
  132.     print len(values), len(volumine)
  133.     if len(values) != 3 or len(volumine) != 3:
  134.         return 0
  135.     leftArmVal = list(values[0])
  136.     headVal = list(values[1])
  137.     rightArmVal = list(values[2])
  138.     leftArmVol = list(volumine[0])
  139.     headVol = list(volumine[1])
  140.     rightArmVol = list(volumine[2])
  141.     minLeftArmVal = min(leftArmVal)
  142.     maxLeftArmVol = max(leftArmVol)
  143.     minHeadVal = min(headVal)
  144.     maxHeadVol = max(headVol)
  145.     maxRightArmVol = max(rightArmVol)
  146.     minRightArmVal = min(rightArmVal)
  147.     print 'A'
  148.     #Wartosc lewego ramienia > glowy i wartosc wolumenu lewego ramienia ma byc najwieksza
  149.     if minLeftArmVal < minHeadVal  or minRightArmVal < minHeadVal or maxLeftArmVol < maxHeadVol or maxLeftArmVol < maxRightArmVol:
  150.         return 0
  151.     print 'B'
  152.     #wartosc prawego ramienia nie moze zbyt odbiegac od wartosci lewego
  153.     if minRightArmVal > 1.2 * minLeftArmVal or minRightArmVal < 0.8*minLeftArmVal:
  154.         return 0
  155.     print 'C'
  156.     #wolumin na formacji ma byc rosnacy
  157.     a, b = regression(leftArmVol+headVol + rightArmVol)
  158.     if (trend(a) < 1):
  159.         return 0
  160.     print 'D'
  161.     #wykreslamy linie szyi
  162.     maxLeftArmVal = max(leftArmVal[leftArmVal.index(minLeftArmVal):]) #min z prawej strony max lewego ramienia
  163.     maxHeadVal = max(headVal[headVal.index(minHeadVal):])
  164.     #to nie dokonca prawda wolumin w prawym ramieniu moze byc najwiekszy globalnie bo tam juz moze dojsc do wybicia z linii szyi
  165.     return (1.0*minHeadVal/minVal + 1.0*maxLeftArmVol/maxVol)/2
  166.  
  167. def lookForReversedHeadAndShoulders(values, volumine):
  168.     """Szukamy odwroconej formacji glowy i ramion"""
  169.     minVal = min(values)
  170.     maxVol = max(volumine)
  171.     val = asarray(list(combinations(divideArray(values, div), 3)))
  172.     vol = asarray(list(combinations(divideArray(volumine, div), 3)))
  173.     z = map(lambda x, y: reversedHeadAndShoulders(val, vol, minVal, maxVol), val, vol)
  174.     if max(z) > 0:
  175.       return val[z.index(max(z))], vol[z.index(max(z))]
  176.     print "nie znaleziono"
  177.     return 0
  178.  
  179. print findMaxMin(arange(10))    
  180. #values = [[1, 2, 10], [1, 2, 20], [1, 2, 12]]
  181. #values = asarray(values)
  182. #volumin = [[1, 2, 10], [1, 1, 1], [1, 1, 1]]
  183. #volumin = asarray(volumin)
  184. #print values
  185. #print volumin
  186. #print headAndShoulders(values, volumin, 21, 10)
  187. #lookForHeadAndShoulders(arange(10), arange(10))
  188. #lookForReversedHeadAndShoulders(arange(10), arange(10))
Add Comment
Please, Sign In to add comment