슈퍼트렌드 V.1 - 슈퍼트렌드 라인 시스템

저자:설교, 2020-04-20 22:10:36, 업데이트: 2023-10-08 19:57:57

img

첫 번째, 이야기의 유래

제 친한 친구인 Vago는 이 지표를 오랫동안 관찰해 왔고 새해를 앞두고 이 지표가 양량화 될 수 있는지에 대해 논의하기 위해 추천했습니다. 하지만, 슬프게도, 지연증의 범인이 되어서, 그는 지금까지 지연을 계속해 왔으며, 실제로 최근에는 알고리즘에 대한 인식이 급격히 증가하고 있다. 어느 날 파이인 번역기를 쓸 수 있을 것 같네요. 모든게 파이썬으로 되어있어요. 이 전설의 슈퍼 트렌드 라인을 소개해 보겠습니다.

2 시스템 소개

CMC 마켓스 새로운 세대의 스마트 거래 시스템 슈퍼 트렌드 라인 (Supertrend)이 시스템에 대한 기사는 여기 있습니다.img

CMC Markets의 새로운 세대의 스마트 거래 시스템에서는 기술 지표에서 초동선 오프닝을 선택할 수 있습니다. 이 그림에서 보이는 것처럼, 자신의 선호도에 따라 상승 신호, 하락 신호의 진색 및 거칠고 세밀한 색상을 조정할 수 있습니다. 그렇다면 초동향 지표는 무엇입니까? 초동향 지표의 공식을 이해하기 전에 ATR을 이해하는 것이 필요합니다. 왜냐하면 초동향은 ATR 값을 사용하여 지표 값을 계산하기 때문입니다.

이 알고리즘의 주요 알고리즘은 아래와 같이 설명되어 있습니다.img

대략적으로 보면, 주요 설명은 HL2 ((k 라인 평균 가격) × n × ATR의 통로이다. 하지만 글은 간단합니다. 자세한 알고리즘은 없습니다. 그 다음에는 가장 우수한 커뮤니티인 트레이딩뷰가 떠올랐습니다. 이 글은 이 글의 한 부분입니다.img

이 그림은 추세에 잘 맞는 것으로 보이지만 아쉽게도 알레르트의 경고 신호일 뿐이다.

세, 소스 코드를 배우세요.

코드가 너무 길지 않았다면 번역해 보도록 하겠습니다.img전체 파인 코드는 아래와 같습니다.

네, 코드 변환

여기 FMZ에서는 새로운 전략을 만들었습니다.img

그리고 다음으로 2개의 매개 변수를 설정합니다.img

더 나은 코드 조작을 단순화하고 이해하기 쉽게 하기 위해, Python의 고급 데이터 확장팩을 사용 합니다.

저는 점심시간에 FMZ가 이 도서관을 지원하는지 물어봤습니다. "이봐요, 이 학생은 정말 멋져요".

1.我们要导入pandas库time库 2.在main函数当中设置使用季度合约(主要跑okex) 3. 15분 동안 1번 검출을 위해 doTicker를 설정한다.15분 주기로 코드를 실행합니다. 그리고 우리는 doTicker에서 주요 전략을 작성했습니다.

import pandas as pd
import time

def main():
    exchange.SetContractType("quarter")
    preTime = 0
    Log(exchange.GetAccount())
    while True:
        records = exchange.GetRecords(PERIOD_M15)
        if records and records[-2].Time > preTime:
            preTime = records[-2].Time
            doTicker(records[:-1])
        Sleep(1000 *60)
        

4. 우리는 k 줄의 OHCLV를 얻으려 합니다. 그래서 우리는 GetRecords를 사용합니다. 5. 우리가 가져온 데이터를 pandas M15 = pd.DataFrame (records) 로 가져옵니다. M15.columns = [time,open,high,low,close,volume,OpenInterest]사실, open, high, low, 'close'의 첫 글자를 소문자로 바꾸는 것이 나중에 코드를 작성하는 데 편리합니다.

def doTicker(records):
    M15 = pd.DataFrame(records)
    M15.columns = ['time','open','high','low','close','volume','OpenInterest']  

7. 데이터 집합에 열을 더합니다. hl2

#HL2
M15['hl2']=(M15['high']+M15['low'])/2

8.接着我们来计算ATRATR의 계산은 변수 길이에 대해 입력하기 때문에 Pd가 값이 됩니다.

다음으로, 우리는 마카어어 설명서를 참조하여, ATR의 실제 진동폭의 평균값을 알아내는 알고리즘의 단계를 다음과 같이 수행합니다. TR: MAX (MAX (HIGH-LOW), ABS (REF (CLOSE, 1) -HIGH)), ABS (REF (CLOSE, 1) -LOW)); ATR: RMA (TR,N)

TR값은 아래의 3개의 값의 가장 큰 값입니다. 1, 현재 거래일의 최고 가격과 최저 가격 사이의 파장이 HIGH-LOW 2, 전날의 거래점 종점 가격과 해당 거래점 최고 가격 사이의 파장이 REF ((CLOSE, 1) -HIGH) 3, 전날의 거래 close price와 그 날의 최저 가격 사이의 파장이 REF ((CLOSE, 1) -LOW) 그래서 TR: MAX (MAX (HIGH-LOW), ABS (REF (CLOSE, 1) -HIGH)), ABS (REF (CLOSE, 1) -LOW));

Python 계산에서

M15['prev_close']=M15['close'].shift(1)

먼저 prev_close를 설정하면, 마지막 줄의 close 데이터를 얻을 수 있습니다. 즉, close를 오른쪽으로 1로 이동하여 새로운 매개 변수를 만듭니다.

ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]

그 다음 중간 변수를 정의합니다. TR의 3개의 대조값의 배열을 기록합니다.

M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)

우리는 데이터 세트에 정의한 새로운 열을 TR로 명명합니다. TR의 값은 중간 변수의 절대값의 최대값을 Abs () 과 Max () 함수로 가져옵니다.

    alpha = (1.0 / length) if length > 0 else 0.5
    M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()

마지막으로 우리는 ATR의 값을 계산해야 합니다. ATR: RMA (TR,N) 는 RMA 알고리즘이 고정값 변수의 EMA 알고리즘이라는 것을 보여줍니다. N는 우리가 가져온 변수이고, 여기서 ATR의 기본 변수는 14이다. 여기 우리는 alpha=length의 분수를 가져왔다.

===

그리고 ewm 알고리즘으로 eima를 계산합니다전체 ATR 계산 과정은 다음과 같습니다.

    #ATR(PD)
    length=Pd
    M15['prev_close']=M15['close'].shift(1)
    ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
    M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
    alpha = (1.0 / length) if length > 0 else 0.5
    M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()

9 시작 계산Up와Dn

    M15['Up']=M15['hl2']-(Factor*M15['atr'])
    M15['Dn']=M15['hl2']+(Factor*M15['atr'])

Up=hl2 - ((Factor * atr) Dn=hl2 + ((faktor * atr)) 이 모든 것은 매우 간단합니다.

아래는 TV의 15-21 줄의 핵심 코드입니다.

TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn

Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl = Trend==1? TrendUp: TrendDown

linecolor = Trend == 1 ? green : red

이 구절의 주된 의미는, 만약 파우치 단계에 있다면, 트렌드업 = max (트렌드업, 트렌드업[1]) 하락 단계에 있는 경우, (올라선) TrendDown=min (Dn, TrendDown[1])즉, 트렌드 중 하나인 ATR의 값은 항상 해적 브린 전략과 유사한 기술을 사용했습니다. 다른 쪽으로 갈수록 좁아집니다.

트렌드업과 트렌드다운의 모든 계산은 자기 반복이 필요합니다. 이 모든 것은 우리가 할 수 있는 모든 것들의 결과입니다. 그래서 데이터 세트를 순환적으로 탐색해야 합니다.

여기서는 트렌드업, 트렌드다운, 트렌드, 라인컬러 등의 새로운 필드를 데이터 집합에 추가하여 초기 값을 부여합니다. 다음 Fillna ((0) 문법을 사용하여 이전에 계산된 결과에서 빈 값이 있는 데이터를 0으로 채울 수 있습니다.

    M15['TrendUp']=0.0
    M15['TrendDown']=0.0
    M15['Trend']=1
    M15['Tsl']=0.0
    M15['linecolor']='Homily'
    M15 = M15.fillna(0)

For 루프를 활성화합니다. 루프에서 파이썬 3번째 연산을 사용함

    for x in range(len(M15)):

트렌드업 계산트렌드업 = MAX ((Up,TrendUp[-1]) if close[-1]>트렌드업[-1] else Up 대략적인 의미로는, 만약 마지막 close> 마지막 TrendUp, 세트업업과 마지막 TrendUp 중 가장 큰 값을 세트업하지 않고 현재 TrendUp에 전달한다면

        M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]

동법적으로, 트렌드다운을 계산합니다.트렌드다운=min(Dn, 트렌드다운[-1]) if close[-1]<트렌드다운[-1] else Dn 대략적인 의미로는, 만약 마지막 close < 마지막 TrendDown, 세트업 Dn와 마지막 TrendDown 중 가장 작은 값을 세트업 Dn값을 세트업하지 않고 현재 TrendDown에 전달한다면

        M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]

아래는 제어 방향을 계산하는 깃발입니다.트렌드= 1 if (close > TrendDown[-1]) else (x) x = -1 if (close

즉, 만약 마감값이 <지난 트렌드다운>이라면 1 (더 보기) 을 취하면 x를 취하지 않습니다. 만약 마감값이 <지난 트렌드업>이라면 -1 (空) 을 취하면 트렌드를 취하 (변화되지 않는 것을 의미합니다) 이미지 언어로 번역하면, 위 경로 전환 플래그를 넘어서고, 아래 경로 전환 플래그를 넘어서고, 다른 시간은 변하지 않습니다.

        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]

Tsl와 Linecolor를 계산합니다.Tsl= rendUp if (Trend==1) else 트렌드다운 tsl는 이미지에서 슈퍼트렌드 값을 표시하는 데 사용됩니다. 이것은 더 많이 볼 때 차트에 경로를 표시하고, 볼 때 차트에 경로를 표시하는 것을 의미합니다. linecolor= green if (Trend==1) else red linecolor의 의미는 더 많이 보시면 녹색을 표시하고, 빈색을 보시면 빈색을 표시하는 것입니다.

        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
        M15['linecolor'].values[x]= 'green' if ( M15['Trend'].values[x]==1) else  'red'

다음 23-30 줄의 코드는 주로 플롯 매핑입니다.

마지막으로, 두 줄의 코드도 있습니다.트레이딩뷰에서 그의 의미는 플래그를 뒤집어 신호를 주는 것입니다. 조건 문장을 python로 변환합니다. 만약 마지막 트렌드 플래그가 -1에서 1로 바뀌면, 상단 저항을 뚫을 수 있습니다. 만약 마지막 트렌드 플래그가 1에서 -1로 바뀌면, 그것은 해체를 의미합니다.

    if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
        Log('SuperTrend V.1 Alert Long',"Create Order Buy)
    if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
        Log('SuperTrend V.1 Alert Long',"Create Order Sell)

이 부분의 전체 코드는 다음과 같습니다.

    M15['TrendUp']=0.0
    M15['TrendDown']=0.0
    M15['Trend']=1
    M15['Tsl']=0.0
    M15['linecolor']='Homily'
    M15 = M15.fillna(0)
    
    for x in range(len(M15)):
        M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
        M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
        M15['Trend'].values[x] = 1 if (M15['close'].values[x] > M15['TrendDown'].values[x-1]) else ( -1 if (M15['close'].values[x]< M15['TrendUp'].values[x-1])else M15['Trend'].values[x-1] )
        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
        M15['linecolor'].values[x]= 'green' if ( M15['Trend'].values[x]==1) else  'red'
        
    if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):
        Log('SuperTrend V.1 Alert Long',"Create Order Buy)
        Log('Tsl=',Tsl)
    if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
        Log('SuperTrend V.1 Alert Long',"Create Order Sell)
        Log('Tsl=',Tsl)

img img

다섯째, 모든 코드

저는 전체 코드 구조를 조정했습니다. 또한, 더 많은 공직을 하는 것과 관련한 명령이 전략에 통합될 것이다. 아래는 전체 코드입니다.

'''backtest
start: 2019-05-01 00:00:00
end: 2020-04-21 00:00:00
period: 15m
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
'''

import pandas as pd
import time

def main():
    exchange.SetContractType("quarter")
    preTime = 0
    Log(exchange.GetAccount())
    while True:
        records = exchange.GetRecords(PERIOD_M15)
        if records and records[-2].Time > preTime:
            preTime = records[-2].Time
            doTicker(records[:-1])
        Sleep(1000 *60)

       
def doTicker(records):
    #Log('onTick',exchange.GetTicker())
    M15 = pd.DataFrame(records)

    #Factor=3
    #Pd=7
    
    M15.columns = ['time','open','high','low','close','volume','OpenInterest']  
    
    #HL2
    M15['hl2']=(M15['high']+M15['low'])/2

    #ATR(PD)
    length=Pd
    M15['prev_close']=M15['close'].shift(1)
    ranges= [M15['high'] - M15['low'],M15['high']-M15['prev_close'],M15['low']-M15['prev_close']]
    M15['tr'] = pd.DataFrame(ranges).T.abs().max(axis=1)
    alpha = (1.0 / length) if length > 0 else 0.5
    M15['atr']=M15['tr'].ewm(alpha=alpha, min_periods=length).mean()


    M15['Up']=M15['hl2']-(Factor*M15['atr'])
    M15['Dn']=M15['hl2']+(Factor*M15['atr'])
    
    M15['TrendUp']=0.0
    M15['TrendDown']=0.0
    M15['Trend']=1
    M15['Tsl']=0.0
    M15['linecolor']='Homily'
    M15 = M15.fillna(0)

    for x in range(len(M15)):
        M15['TrendUp'].values[x] = max(M15['Up'].values[x],M15['TrendUp'].values[x-1]) if (M15['close'].values[x-1]>M15['TrendUp'].values[x-1]) else M15['Up'].values[x]
        M15['TrendDown'].values[x] = min(M15['Dn'].values[x],M15['TrendDown'].values[x-1]) if (M15['close'].values[x-1]<M15['TrendDown'].values[x-1]) else M15['Dn'].values[x]
        M15['Trend'].values[x] = 1 if (M15['close'].values[x] > M15['TrendDown'].values[x-1]) else ( -1 if (M15['close'].values[x]< M15['TrendUp'].values[x-1])else M15['Trend'].values[x-1] )
        M15['Tsl'].values[x] = M15['TrendUp'].values[x] if  (M15['Trend'].values[x]==1) else M15['TrendDown'].values[x]
        M15['linecolor'].values[x]= 'Long' if ( M15['Trend'].values[x]==1) else  'Short'
 

    linecolor=M15['linecolor'].values[-2]
    close=M15['close'].values[-2]
    Tsl=M15['Tsl'].values[-2] 


    if(M15['Trend'].values[-1] == 1 and M15['Trend'].values[-2] == -1):

        Log('SuperTrend V.1 Alert Long','Create Order Buy')
        Log('Tsl=',Tsl)
        position = exchange.GetPosition()
        if len(position) > 0:
            Amount=position[0]["Amount"]
            exchange.SetDirection("closesell")
            exchange.Buy(_C(exchange.GetTicker).Sell*1.01, Amount);
        
        exchange.SetDirection("buy")
        exchange.Buy(_C(exchange.GetTicker).Sell*1.01, vol);

    if(M15['Trend'].values[-1] == -1 and M15['Trend'].values[-2] == 1):
        Log('SuperTrend V.1 Alert Long','Create Order Sell')
        Log('Tsl=',Tsl)
        position = exchange.GetPosition()
        if len(position) > 0:
            Amount=position[0]["Amount"]
            exchange.SetDirection("closebuy")
            exchange.Sell(_C(exchange.GetTicker).Buy*0.99,Amount);
        exchange.SetDirection("sell")
        exchange.Sell(_C(exchange.GetTicker).Buy*0.99, vol*2);

공개 전략 연결 https://www.fmz.com/strategy/200625

6. 재검토와 요약

우리는 거의 1년의 데이터를 선택하여 재검토했습니다. 15분 사이클을 사용하는okex 분기 계약 이 문서는 이 모든 것을 설명합니다. 3가 됩니다. Pd는 45입니다. vol=100 (당 주문 100개) 이 경우 연간 수익률은 약 33%입니다. 이 사건은 전두환 대통령의 대통령직에서 물러나고, 전두환 대통령의 대통령직에서 물러나고 있습니다. 이 중 312의 큰 추락이 시스템에 큰 충격을 주었고, 312가 없으면 수익이 더 좋아질 것입니다.

img

6번, 마지막에 쓰세요

슈퍼트렌드는 매우 좋은 거래 시스템입니다.

슈퍼트렌드 시스템의 주요 원리는 ATR 통로를 돌파하는 전략 (트 통로를 닮은) 을 사용하는 것입니다. 그러나 그 변화는 주로 강도 브린의 축소 전략, 즉 역동 도치안 원칙이 사용되었다는 것입니다. 이 지점에서 판매가 늘어나면서 상하이 통로가 좁아지고 있다. 통로를 돌파하는 회전 동작을 달성하기 위해.

제가 트레이딩뷰에서 트렌드Up 트렌드Dn를 이 전략에 대한 이해가 더 쉬워집니다.한눈에 보시면img

또한 github에 js 버전이 있습니다. js는 잘 모르겠지만 if 문장에서 보면 문제가 있습니다. 주소는https://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js

저는 이 글을 읽으며, 이 글을 읽으며, 이 글을 읽으며, 이 글을 읽으며, 이 글을 읽으며, 이 글을 읽으며, 이 글을 읽으며 살아가고 있습니다. 2013년 5월 29일에 공개되었습니다. 저자: 라잔드란 R. C++ 코드는 Mt4 포럼에 게시되었습니다.https://www.mql5.com/en/code/viewcode/10851/128437/Non_Repainting_SuperTrend.mq4저는 C++의 의미를 거의 이해했고, 다시 한 번 쓸 기회를 얻었습니다.

이 글의 핵심은 여러분들이 배울 수 있을 것으로 기대합니다. 젠장, 젠장!


관련

더 많은

zdg4484YYDS!

글리즈2010만약 이 전략을 직접 OK 거래소에서 사용한다면 거래소와 연결하는 방법을 어떻게 해야 하는지 알 수 없습니다

여기에 312의 파동이 시장에서 먹히지 않았다면 파라미터에도 많은 조정 공간이 있어야 합니다. 왜냐하면 슈퍼 트렌드는 주로 트렌드 목록을 잡는 것이기 때문에, 312은 놓치지 말아야 합니다. 또한 lz의 파인 번역기가 조만간 등장하기를 기대합니다.

이비그러나 다양한 주기와 매개 변수들에 의해 재검토 효과가 좋지 않은데 다른 사람들이 어떻게 최적화했는지 모르겠습니다.

다.네, 준비됐습니다.

다.사용이 안되면, 이렇게 표시됩니다:Traceback (most recent call last): File "", line 1473, in Run File "", line 8, in ImportError: No module named pandas

펑91파인의 번역가, 기대

은 문화는 단지 "강인하다!"라고 말할 수 있습니다.

프랭크131419은 어느 날 파이인의 번역기를 쓸 것이라고 추측합니다. 모든 것이 파이썬입니다.

Kmeans이 리코딩 엔진의 코드가 오픈 소스 되는지 확인해보고, 리코딩을 구현하고, SVM를 사용하여 가장 좋은 매개 변수를 찾아보고 싶습니다.

다시이 시스템은 마치 수익률이 가장 높은 10위권에 속하는 선물 전략이었다는 것 같습니다.

가벼운 구름안녕하세요, PD는 ATR의 길이가 아닙니다. 예를 들어 ATR ((14) 는 PD의 길이가 14입니다.

작은 꿈찬송

오블파인은 정말 잘 읽지 않고, 수업도 거의 없습니다.

설교파다스 패키지가 없는 것을 의미합니다.

Ant_Sky어떻게 처리되었는지 궁금합니다.

설교아하하, 감사합니다, 사장님.

작은 꿈잠시만요, 공개합니다.

외로운 사람JS 버전!

설교恩啊. ◎ 배우기 위한 핵심 ◎

가벼운 구름좋아요, 감사합니다! 이쪽은 mq4도 빼고, 감사합니다.

설교네, 완전히 맞습니다.

설교찬미하라

작은 꿈저는 JS 버전도 썼습니다.

설교감사합니다, 선생님.