SuperTrend V.1 - Super Trendlinie-System

Schriftsteller:Predigt, Erstellt: 2020-04-20 22:10:36, aktualisiert: 2023-10-08 19:57:57

img

Erstens, woher die Geschichte kommt.

Mein guter Freund Vago beobachtete diesen Indikator lange und empfahl mir ihn vor dem Neujahrstag, um zu diskutieren, ob er in Quantum umgewandelt werden kann. Leider hat sich die Verzögerung schuldig gemacht und hat es bis jetzt verzögert, ihm zu helfen, seinen Wunsch zu erfüllen. Ich habe mir vorgestellt, dass ich eines Tages einen Pine-Übersetzer schreiben werde. Wir wollen nicht viel Unsinn erzählen, aber wir wollen uns die Supertrendlinie dieser Legende ansehen.

2. Einführung in das System

CMC Markets neue Generation von intelligenten HandelssystemenHier ist ein Artikel über das System.img

In der neuen Generation von intelligenten Handelssystemen in CMC Markets kann die Option, die Supertrend-Linien-Tuning in den technischen Indikatoren auszuwählen, verwendet werden. Wie in der Abbildung gezeigt, kann man die Farbe und die Größe der Farbe und der Größe der Farbe anpassen, je nachdem, was man für das Aufwärtssignal und das Abwärtssignal bevorzugt. Was ist ein Supertrendindikator? Bevor man die Supertrendindikatorformel versteht, ist es notwendig, ATR zu verstehen, da Supertrendindikatoren mit dem ATR-Wert berechnet werden.

Die wichtigsten Algorithmen werden hier unten dargestellt.img

Grob betrachtet, ist die Hauptbeschreibung der HL2 ((k-Linien-Generalpreis) × n mal ATR-Tunnel. Aber der Artikel ist ziemlich einfach. Es gibt keine detaillierten Algorithmen. Dann dachte ich an die beste Community, Tradingview. Das ist nicht verwunderlich.img

Das Bild zeigt, dass es sich um einen Trend handelt. Leider ist es nur ein Alarmsignal von Alert.

3. Lernen Sie Quellcode

Wenn der Code nicht zu lang ist, kommen wir und versuchen es.imgDer vollständige Pine-Code ist hier.

Viertens: Codeumwandlung

Hier haben wir bei FMZ eine neue Strategie entwickelt, SuperTrade genannt.img

Dann setzen wir zwei Parameter, Factor, Pd.img

Um die Bedienung des Codes zu vereinfachen und es einfacher zu verstehen, verwenden Sie hierzu die Advanced Data Extension Package von Python.Pandas

Ich fragte meine Lehrerin, ob FMZ diese Bibliothek unterstützt. Die Lehrer von Dream Dream sind wirklich toll.

1.我们要导入pandas库time库 2.在main函数当中设置使用季度合约(主要跑okex) 3. Setzen Sie einen Kreislauf doTicker für 15 Minuten und testen Sie es einmal.Es läuft in 15-minütigen Zyklen Dann schreiben wir die Hauptstrategie in 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. Wir wollen die OHCLV der K-String abrufen, also benutzen wir GetRecords (). 5. Die Daten, die wir abrufen, werden in pandas M15 = pd.DataFrame (records) importiert 6. Wir möchten die Tabellenheader-Tags ändern. M15.columns = [time-Table,open-Table,high-Table,low-Table,close-Table,volume-Table,OpenInterest-Table]Das ist eine einfache Methode, um die ersten Buchstaben von "open", "high", "low" und "close" in kleine Buchstaben zu schreiben.

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

7. Fügen Sie einer Datensammlung eine Zeile hinzu, hl2 hl2= ((high+low) /2)

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

8.接着我们来计算ATRDa die ATR-Berechnung eine Variablenlänge importieren soll, wird Pd als Wert genommen.

Als nächstes gehen wir zu den folgenden Algorithmen, um die Werte der echten ATR-Spannungen zu ermitteln, indem wir uns die Handbücher der Machen-Sprache ansehen: TR: MAX (MAX) (HIGH-LOW), ABS (REF) (CLOSE, 1) (HIGH)), ABS (REF) (CLOSE, 1) (LOW)); ATR: RMA (TR,N)

Das ist der größte der folgenden drei Abweichungen. 1. HIGH-LOW zwischen dem höchsten und dem niedrigsten Preis des aktuellen Handelstages 2, die Breite zwischen dem Schlusskurs des vorherigen Handelstages und dem höchsten Preis des betreffenden Handelstages REF ((CLOSE, 1) - HIGH) 3 REF (CLOSE, 1-LOW) Breite zwischen dem Schlusskurs des vorherigen Handelstages und dem Mindestpreis des betreffenden Handelstages Also TR: MAX (MAX) (HIGH-LOW), ABS (REF) (CLOSE, 1) (HIGH)), ABS (REF) (CLOSE, 1) (LOW));

In der Python-Berechnung

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

Um die Daten in der vorherigen Zeile von close zu erhalten, müssen Sie zuerst einen prev_close einrichten, d.h. ein neues Parameter erstellen, indem Sie das Gerät um 1 nach rechts schieben.

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

Dann definiert man eine Zwischenvariable, die die Array der 3 Vergleichswerte von TR aufzeichnet.

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

Wir definieren in der Datensammlung eine neue Spalte, die TR genannt wird, und nehmen den Wert von TR, der der absolute Wert der mittleren Variablen ist, mit den Funktionen abs (()) und max (())

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

Letztendlich müssen wir den Wert von ATR berechnen, ATR: RMA ((TR,N), wobei der Algorithmus von RMA eine EMA-Algorithmus mit einer Festwertvariante ist. N ist die Variable, die wir importieren, wobei der Standardparameter für ATR 14 ist. Hier importieren wir den Faktor für alpha = length.

===

Dann berechnen wir die Ema mit dem Ewm-Algorithmus.Die vollständige ATR-Berechnung ist wie folgt:

    #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 Startberechnung Up und Dn

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

Up=hl2 - ((Faktor * atr) Dn = hl2 + ((Faktor * atr)) Ich bin der Meinung, dass es einfach ist.

Hier ist ein Kerncode aus den 15 bis 21 Zeilen des Fernsehgeräts.

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

Ich möchte Ihnen sagen, dass ich nicht auf die Art und Weise bin, wie ich es tue. Wenn man sich in der Bilanzphase befindet, ist der TrendUp = max (Up, TrendUp[1]) Wenn es in der Fallphase ist, wird der TrendDown = min (Dn, TrendDown[1])Das bedeutet, dass ATR-Werte in einem Trend eine Technik verwenden, die ähnlich wie die Robber-Bring-Strategien ist. Die andere Seite des Weges wird immer kleiner.

Hier müssen sich TrendUp und TrendDown bei jeder Berechnung selbst wiederholen. Ich habe mir vorgestellt, dass man bei jedem Schritt den letzten selbst berechnen muss. Das ist eine Art Kreislaufdurchsuchung der Datensätze.

Hier müssen Sie die neuen Felder TrendUp, TrendDown, Trend, Linecolor erstellen und ihnen einen Anfangswert geben. Dann wird mit der Fillna ((0) -Symmetrie die Daten mit dem Leerwert aus den vorher berechneten Ergebnissen mit 0 gefüllt.

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

Ein For-Loop aktivieren Mit Python-Third-Operations im Loop

    for x in range(len(M15)):

Berechnung von TrendUpTrendUp = MAX ((Up, TrendUp[-1]) if close [-1]>TrendUp[-1] else Up Grob gemeint ist, dass, wenn der letzte close> der letzte TrendUp, der größte Wert zwischen dem letzten TrendUp und dem letzten TrendUp, nicht aufgenommen wird und an den aktuellen TrendUp weitergegeben wird.

        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]

Das gleiche gilt für die Berechnung des TrendDown.TrendDown=min ((Dn, TrendDown[-1]) if close[-1]

        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]

Hier ist die Flagge, die die Steuerung berechnet, und ich habe einen vereinfachten Pseudo-Code.Trend= 1 wenn (Schließen > TrendDown[-1]) andernfalls (x) x = -1 wenn (nahe< TrendUp[-1]) andernfalls Trend[-1]

Das bedeutet, wenn der Schlusskurs > ein letzter TrendDown ist, wird 1 ((mehr lesen) nicht verwendet, um x zu nehmen Wenn der Schlusskurs < ein letzter TrendUp ist, nimmt man -1 ((leere) nicht ein und nimmt einen Trend (was bedeutet, dass er sich nicht ändert). Übersetzt in Bildersprache bedeutet das, dass man die Fahrbahn überschreitet, die Fahrbahn überschreitet, die Fahrbahn überschreitet, die Fahrbahn überschreitet, die Fahrbahn überschreitet, die Fahrbahn überschreitet, die Fahrbahn überschreitet, die Fahrbahn überschreitet, die Fahrbahn überschreitet, die Fahrbahn überschreitet.

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

Berechnung von Tsl und LinecolorTsl = rendUp if (Trend==1) else TrendDown Tsl ist ein Symbol für den Wert eines SuperTrends in einem Bild. linecolor= green if (Trend==1) else red Die Bedeutung von linecolor ist, wenn mehr gelesen wird, grün markiert, wenn nichts gesehen wird, weiß markiert (hauptsächlich für den Einsatz in der Tradingview-Anzeige)

        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'

Die nächsten 23-30 Zeilen Code sind hauptsächlich Plot-Mapping.

Und schließlich gibt es noch zwei Codezeilen, die für die Kauf- und Verkaufssignalkontrolle verwendet werden.In Tradingview bedeutet er, dass er nach dem Umdrehen der Flagge ein Signal gibt. Verwandeln Sie die Bedingungssätze in python. Wenn die letzte Trendflagge von -1 zu 1 ist, dann bedeutet das, dass wir den Widerstand überwunden haben. Wenn die letzte Trend-Flagge von 1 zu -1 ist, dann bedeutet das, dass sie die Unterstützung durchbrechen wird.

    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)

Der vollständige Code für diesen Abschnitt ist:

    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

Fünf, der gesamte Code.

Ich habe die gesamte Code-Struktur angepasst. Die Strategie wird auch die Anweisungen für mehr Arbeitsplätze in die Strategie einbeziehen. Hier ist der vollständige Code.

'''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);

Öffentliche Strategie-Verbindung http://www.fmz.com/strategy/200625

6. Nachprüfung und Zusammenfassung

Wir haben Daten aus fast einem Jahr für eine Rückprüfung ausgewählt. Benutzt okx Quartalsverträge für 15-Minuten-Zyklen. Die Parameter, die gesetzt werden, sind: Der Faktor ist 3. Pd ist 45. Vol = 100 (je 100 Aufträge) Die jährliche Ertragsquote beträgt etwa 33%. Der Rückzug war im Großen und Ganzen nicht groß. Der größte Schlag auf das System war der Fall von 312. Wenn es 312 nicht gäbe, wäre die Ertragslage besser.

img

6. Schreiben Sie am Ende

SuperTrend ist ein sehr gutes Handelssystem.

Der Hauptprinzip des SuperTrend-Systems ist die Anwendung von ATR-Tunnel-Breakthrough-Strategien (ähnlich dem Kent-Tunnel) Aber die Veränderung liegt vor allem in der Verwendung der Verengungsstrategie von Robber Brin, also der umgekehrten Dongjian-Prinzipien. Die Türen sind immer schmaler, und es gibt immer weniger Zugang zu den Geschäften. Um die Operation zu erreichen, die einen Tunnel-Break-Turn ermöglicht. ((Sobald der Tunnel-Break-Turn erfolgt, kehrt der Auf- und Ablauf zurück zu seinem ursprünglichen Wert.)

Ich habe in der TradingView das TrendUp TrendDn aufgeschlüsselt Das ist eine einfache Strategie, um das zu verstehen.Das ist klar.img

Außerdem gibt es eine Version von js auf Github. Die Adresse ist:https://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js

Schließlich habe ich mir das Original angeschaut. Es wurde am 29.05.2013 veröffentlicht. Schriftsteller: Rajandran R. Der C++-Code wurde im Mt4-Forum veröffentlicht.https://www.mql5.com/en/code/viewcode/10851/128437/Non_Repainting_SuperTrend.mq4Ich verstehe C++ im Großen und Ganzen und habe Gelegenheit, ein weiteres zu schreiben.

Ich hoffe, ihr könnt etwas daraus lernen. Das ist nicht einfach.


Verwandt

Mehr

ZDG4484Das ist YYDS!

Ich bin glydz2010Wenn Sie direkt mit dieser Strategie auf OK-Börsen handeln müssen, wie man die Börse zu verbinden, weiß ein nicht Python, sieht nicht verständlich

BamsmenHier sollte es viel Spielraum für Anpassungen geben, wenn die 312-Welle nicht auftritt, da der Supertrend hauptsächlich die Trendliste erfasst.

Zhang WeiweiIch bin der Meinung, dass es nicht so einfach ist, die Ergebnisse zu analysieren, aber ich bin der Meinung, dass es nicht so einfach ist, die Ergebnisse zu analysieren.

Wo ist der Fett?Ja, ich habe es geschafft, danke für Ihre Unterstützung.

Wo ist der Fett?Wenn nicht, zeigt dies:Traceback (most recent call last): File "", line 1473, in Run File "", line 8, in ImportError: No module named pandas

Zunfeng91Ich bin der Übersetzer von Pine, ich warte darauf.

ZeiträumeDie Kultur der Ungläubigen sagt nur: "Das ist arrogant!"

Frank131419Ich denke, ich werde eines Tages einen Pine-Übersetzer schreiben.

KmeansIch möchte die Wiederholung umsetzen und dann mit svm die besten Parameter finden.

Siehe auchEs scheint, als wäre dieses System auch eine der zehn besten Futures-Renditenstrategien.

Leichte WolkenHallo, bitte, PD ist die Länge von ATR, oder?

Kleine TräumeIch danke dir.

OvelsIch habe mir vorgestellt, dass Pine wirklich nicht so gut versteht, und es gibt nur wenige Tutorials.

PredigtDas bedeutet, dass Pandas fehlt.

Ant_SkyWie geht das? Vielen Dank.

PredigtAch ja, danke, mein Herr.

Kleine TräumeEine Sekunde, öffentlich.

Ein einsamer MannBitte um die JS-Version!

PredigtIch bin ein junger Mann und ich bin ein junger Mann.

Leichte WolkenDas ist gut, danke! Ich habe auch mq4 abgezogen, danke.

PredigtJa, das stimmt.

PredigtGepriesen sei Allah!

Kleine TräumeZufälligerweise habe ich auch eine JS-Version geschrieben.

PredigtIch danke dir, Traumlehrer.