Python Parabolic SAR実施

17178 ワード

Parabolic計算式に従ってParabolicを計算するにはすべてのデータが必要です.
しかし、分封のような場合は、データ全体を受信するのに時間がかかるため、Parabolicの計算は難しい.しかし、以前のParallic値を知っていれば、この問題は解決します.
そこで,初期パラメータ値を手動で設定する際に,パラメータ値を解くコードを記述した.
#global variable for psar
psar_low = 0 # current lowest value 
psar_high = 0 # current highest value
psar_trend = (0,0) # psar trend start value
psar_accel = 0
psar_max = 0
def psar_init(df, start, idx, acceleration, maximum):
    global psar_trend, psar_accel, psar_max
    psar_trend = (df['datetime'][len(df)-idx],start)
    psar_accel = acceleration
    psar_max = maximum

def psar_next(df):
    global psar_low, psar_high, psar_trend
    start_idx = -1
    psar = []
    for i in range(len(df)):
        if df['datetime'][i] == psar_trend[0]:
            start_idx = i
            break
    for i in range(len(df)):
        psar.append(0)
    if start_idx == -1: #check it initialized
        print('[!] You must call psar_init method first.')
        exit()
    if psar_trend[1] >= df['high'][start_idx]:
        trend = 'down'
        psar_low = df['low'][start_idx]
    else:
        trend = 'up'
        psar_high = df['high'][start_idx]
    af = 0.02
    psar[start_idx] = psar_trend[1]
    for i in range(start_idx+1, len(df)):
        if df['high'][i] > psar_high: #update highest value
            psar_high = df['high'][i]
            if trend == 'up':
                af += psar_accel
        if df['low'][i] < psar_low: #update lowest value
            psar_low = df['low'][i]
            if trend == 'down':
                af += psar_accel
        af = psar_max if af >= psar_max else af #check af is higher than max value
        if trend == 'up':
            psar[i] = af * psar_high + (1-af) * psar[i-1]
        else:
            psar[i] = af * psar_low + (1-af) * psar[i-1]
        #check psar trend change
        if trend == 'up' and psar[i-1] != 0:
            if psar[i-1] >= df['low'][i]:
                trend = 'down'
                psar[i] = psar_high
                psar_trend = (df['datetime'][i], psar[i]) #update psar trend
                psar_low = df['low'][i]
                psar_high = df['high'][i]
                af = 0.02
        elif trend == 'down' and psar[i-1] != 0:
            if psar[i-1] <= df['high'][i]:
                trend = 'up'
                psar[i] = psar_low
                psar_trend = (df['datetime'][i], psar[i]) #update psar trend
                psar_low = df['low'][i]
                psar_high = df['high'][i]
                af = 0.02
        psar[i] = round(psar[i],2)
    return psar
使用方法は以下の通りです.psar_initが先に行われた後、psar_nextがコールされ続ける.
if not isInit:
	psar_init(df,37449.4 ,22, 0.02, 0.2)
    isInit = True
print(psar_next(df))
初期パラメータ値はトレンドの開始部分である必要があります.次の図では、左端のParabolic値は37449.4で、現在の22番目の下位にあります.したがって、因子で22を加える.実は4を置いても大丈夫です

バイナンス取引所のTradingViewと完全に一致していることを確認した.
これは私がやりたいことなので、利便性などは気にしません.一度価格を追加してくれれば、更新してあげます.