Probleme mit Code; “Highest” bzw “Lowest”

Viewing 15 posts - 1 through 15 (of 15 total)
  • Author
    Posts
  • #186959 quote
    Stefan Sticker
    Participant
    New

    Hallo alle zusammen!

    Ich habe vor wenigen Wochen einen Testaccount mit PRT V11 abgeschlossen.

    Meine in der Zeit erstellten Algo-Codes liefen schon ganz gut im Probebetrieb.

    Nun habe ich kürzlich ein Konto bei IG eröffnet und mit der Premium-Version von PRT verknüpft.

    Beim Upload meiner Codes stellte ich (nach mühsamen Trial&Error) fest, daß es wohl Probleme gibt mit meinen “Highest” und “Lowest”-Codestücken.

    ZB

    “IF Close < Lowest[2] AND … THEN …” lief vorher (im Backtest) einwandfrei.
    “IF Close > Highest[5] AND … THEN …” ebenso.

    Alles jeweils im Tick-by-Tick-Mode.

    Nun stelle ich beim Backtest desselben Codes via IG/PRT fest, daß ALLE meine HIGHEST/LOWEST Bedingungen offenbar als “nicht erfüllt” gelten und meine Einstiegs-(Buy/Sell)codes daher auch keine Einstiege mehr generieren.

    Sobald ich exakt diese Bedingungen lösche funktioniert der Rest technisch einwandfrei – wenn auch das Ergebnis nicht wie gewünscht aussieht.
    Ich habe leider keine Ahnung, woran das liegt.
    Zeitzonen sind korrekt eingestellt, Datenfeed ist da.

    Gibt es jemanden, der ähnliche Erfahrungen gemacht hat und mir da vielleicht aushelfen kann?

    Vielen vielen Dank im Voraus!

    Beste Grüße

    Stefan

    #186977 quote
    robertogozzi
    Moderator
    Master

    Sie sollten Ihren Code und Informationen über das gehandelte Instrument/Vermögenswert und den Zeitrahmen veröffentlichen, um Ihre Trades replizieren zu können.

    #186988 quote
    Stefan Sticker
    Participant
    New

    Handelwert: ALLE (konkret aktuell “Deutschland 40 Kassa 1€”)

    Zeitrahmen: ALLE (Backtest und Live)

    DEFPARAM PreLoadBars = 5000
    // Festlegen der Code-Parameter
    DEFPARAM CumulateOrders = False // Kumulieren von Positionen deaktiviert
    // Das Handelssystem wird um 0:00 Uhr alle pending Orders stornieren und alle Positionen schließen. Es werden vor der "FLATBEFORE"-Zeit keine neuen Orderaufträge zugelassen.
    DEFPARAM FLATBEFORE = 080000
    // Stornieren aller pending Orders und Schließen aller Positionen zur "FLATAFTER"-Zeit
    DEFPARAM FLATAFTER = 220000
    
    // Verhindert das Platzieren von neuen Ordern zum Markteintritt oder Vergrößern von Positionen vor einer bestimmten Uhrzeit
    noEntryBeforeTime = 080000
    timeEnterBefore = time >= noEntryBeforeTime
    
    // Verhindert das Platzieren von neuen Ordern zum Markteintritt oder Vergrößern von Positionen nach einer bestimmten Uhrzeit
    noEntryAfterTime = 220000
    timeEnterAfter = time < noEntryAfterTime
    
    // Verhindert das Trading an bestimmten Wochentagen
    Tradeday = OpenDayOfWeek > 0 OR OpenDayOfWeek < 6
    
    PositionSizeLong = 1
    PositionSizeShort = 1
    ForbiddenLong = 0
    ForbiddenShort = 0
    
    //*************************************************************************//
    //allgemeines Daytrading                                  M/W/D: o/o/o     //
    //*************************************************************************//
    // Bedingungen zum Einstieg in Short-Positionen  //
    //***********************************************//
    IF NOT LongOnMarket AND NOT ForbiddenShort AND TradeDay AND Time >= 091500 AND Time <= 214500 AND TRADEON THEN
    //TrendDown1
    IF Close < Close[1] AND Close[1] < Close[2] AND Average[50] < Average[100] AND Average[100] < Average[200] AND Average[2500] < Average[4500] AND Aroondown Crosses over Aroonup AND Aroondown < 80 AND RSI < 50 AND MACD < 0 THEN
    TrailingFlag = 0
    SellShort PositionSizeShort CONTRACTS AT MARKET
    ENDIF
    //SwingDown1
    IF Close < Open AND Close < Close[1] AND Close < Lowest[3] AND Close < Average[50] AND Average[50] < Average[100] AND Average[100] < Average[200] AND Close > Average[2500] AND Close > Average[4500] AND Aroondown Crosses over Aroonup AND Aroondown < 80 THEN
    TrailingFlag = 0
    SellShort PositionSizeShort CONTRACTS AT MARKET
    ENDIF
    //SwingDown2
    IF Close < Open AND Close < Close[1] AND Close < Lowest[2] AND Close > Average[2500] AND Close < Average[4500] AND Aroondown Crosses over Aroonup AND Aroondown < 40 AND Aroonup < 80 THEN
    TrailingFlag = 0
    SellShort PositionSizeShort CONTRACTS AT MARKET
    ENDIF
    //SwingDown3
    IF Close < Open AND Close < Close[1] AND Close < Lowest[2] AND Close > Average[1000] AND Close > Average[4500] AND Aroondown Crosses over Aroonup AND Aroondown < 40 AND Aroonup < 80 THEN
    TrailingFlag = 0
    SellShort PositionSizeShort CONTRACTS AT MARKET
    ENDIF
    //50Cross200down
    IF Close < Open AND Close < Close[1] AND Close < Lowest[2] AND Close < Average[50] AND Average[50] crosses under Average[200] AND MACD < 0 AND Close < Pivot THEN
    TrailingFlag = 2
    SellShort PositionSizeShort CONTRACTS AT MARKET
    ENDIF
    ENDIF
    
    //**********************************************//
    // Bedingungen zum Einstieg in Long-Positionen //
    //*********************************************//
    IF NOT ShortOnMarket AND NOT ForbiddenLong AND TradeDay AND Time >= 091500 AND Time <= 214500 AND TRADEON THEN
    IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close > Average[50] AND Average[50] > Average[100] AND Average[100] > Average[200] AND Aroonup Crosses over Aroondown AND Aroondown < 30 AND Aroonup < 70 AND Close > Supertrend AND RSI > 60 THEN
    TrailingFlag = 0
    Buy PositionSizeLong CONTRACTS AT MARKET
    ENDIF
    //TrendUp2
    IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close > Average[50] AND Close > Average[4500] AND Aroonup Crosses over Aroondown  AND Aroondown < 30 AND Aroonup < 50 AND Close > Supertrend AND RSI > 60 THEN
    TrailingFlag = 0
    Buy PositionSizeLong CONTRACTS AT MARKET
    ENDIF
    //TrendUp3: Open>Highest löschen für Turbo
    IF Close > Open AND Close > Close[1] AND Close > Highest[4] AND Close < Average[200] AND Aroonup Crosses over Aroondown  AND Aroondown < 20 AND Aroonup < 50 AND RSI < 30 THEN
    TrailingFlag = 0
    Buy PositionSizeLong CONTRACTS AT MARKET
    ENDIF
    //SwingUp1
    IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close < Average[2500] AND Close > Average[4500] AND Aroonup Crosses over Aroondown AND Aroonup < 70 AND RSI < 30 THEN
    TrailingFlag = 0
    Buy PositionSizeLong CONTRACTS AT MARKET
    ENDIF
    //SwingUp2
    IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close > Average[200] AND Close < Average[2500] AND Close < Average[4500] AND Aroonup Crosses over Aroondown AND Aroonup < 70 THEN
    TrailingFlag = 0
    Buy PositionSizeLong CONTRACTS AT MARKET
    ENDIF
    //SwingUp3
    IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close < Average[2500] AND Close < Average[4500] AND Aroonup Crosses over Aroondown AND Aroonup < 70 THEN
    TrailingFlag = 0
    Buy PositionSizeLong CONTRACTS AT MARKET
    ENDIF
    //50Cross200up
    IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close > Average[50] AND Average[50] crosses over Average[200] AND MACD > 0 AND Close > Pivot THEN
    TrailingFlag = 2
    Buy PositionSizeLong CONTRACTS AT MARKET
    ENDIF
    ENDIF
    
    //*************************************************************************//
    //Xetra-Korrektur High Low Close, Pivot, Resistance, Support               //
    //*************************************************************************//
    if Time = 220000 AND OPENDAYOFWEEK <6 AND OPENDAYOFWEEK >0 then
    DayClose = Close
    DayHigh = Highest[840]
    DayLow = Lowest[840]
    ENDIF
    
    Pivot= (DayHigh + DayLow + DayClose) / 3
    ResR1 = Pivot + (Pivot - DayLow)
    ResR2 = Pivot + (Dayhigh - Daylow)
    ResR3 = Dayhigh + (2 * (Pivot - Daylow))
    SupS1 = Pivot - (Dayhigh - Pivot)
    SupS2 = Pivot - (Dayhigh - Daylow)
    SupS3 = Daylow - (2 * (Dayhigh - Pivot))
    
    //*************************************************************************//
    //Moving-Average-Clustering-FilterCode (optional)                          //
    //*************************************************************************//
    ClusterSave = 1                //1=ON, 0=OFF
    x     = 15*pipsize             //15-pip range
    ma5   = average[5,0](close)
    ma50  = average[50,0](close)
    ma100 = average[100,0](close)
    ma200 = average[200,0](close)
    MaxMA = max(ma5,max(ma50,max(ma100,ma200)))
    MinMA = min(ma5,min(ma50,min(ma100,ma200)))
    
    IF (MaxMA - MinMA) <= x AND ClusterSave = 1 THEN
    Tradeon = 0
    ELSIF (MaxMA - MinMA) > x OR (ClusterSave = 0) THEN
    Tradeon = 1
    ENDIF
    
    //*************************************************************************//
    //trailing stop function      Risk, Long, Short                            //
    //*************************************************************************//
    trailingstartL = 35     //LONG  trailing will start @trailinstart points profit
    trailingstartS = 35      //SHORT trailing will start @trailinstart points profit
    trailingL = 20           //trailing step to move the "stoploss"
    trailingS= 20           //trailing step to move the "stoploss"
    trailingR= 15           //trailing start+step to move the "stoploss" for risky positions
    SaveDistanceL = 10      //Minimum Stop-Abstand 10 lt IG
    SaveDistanceS = 10    //Minimum Stop-Abstand 10 lt IG
    SaveDistanceR = 10     //Minimum Stop-Abstand 10 lt IG
    MinimumPlus = 3       //Anzahl Pips zum Breakeven inkl. Spread+Gebühren
    SET TARGET pProfit 80
    
    //reset the stoploss value
    IF NOT ONMARKET THEN
    TrailingFlag = 0
    NewSL = 0
    FailsaveSL = 0
    ENDIF
    
    //************************//
    //manage long positions   //
    //***********************//
    IF LOngONMarket AND TrailingFlag = 0 THEN
    newSL = tradeprice(1)-(trailingstartL*pipsize)
    FailsaveSL = newSL-(trailingstartL*pipsize)
    ENDIF
    //breakeven
    IF (close-tradeprice(1)) >= ((MinimumPlus+SaveDistanceL)*pipsize) AND TrailingFlag = 0 THEN
    TrailingFlag = 1
    newSL = tradeprice(1)+(3*pipsize)
    FailsaveSL = newSL-(trailingstartL*pipsize)
    ENDIF
    IF (close-newSL) >= ((trailingL)*pipsize) AND TrailingFlag = 1 THEN
    newSL = close-(trailingL*pipsize)
    FailsaveSL = newSL-(trailingstartL*pipsize)
    ENDIF
    
    IF LongOnMarket AND TrailingFlag = 2 THEN
    newSL = tradeprice(1)-(trailingR*pipsize)
    FailsaveSL = newSL-(trailingR*pipsize)
    //breakeven
    IF (close-tradeprice(1)) >= ((MinimumPlus+SaveDistanceR)*pipsize) THEN
    newSL = tradeprice(1)+(3*pipsize)
    FailsaveSL = newSL-(trailingR*pipsize)
    TrailingFlag = 3
    ENDIF
    IF (close-newSL) >= (trailingR*pipsize) AND TrailingFlag = 3 THEN
    newSL = close-(trailingR*pipsize)
    FailsaveSL = newSL-(trailingR*pipsize)
    ENDIF
    ENDIF
     
    //************************//
    //manage Short positions  //
    //************************//
    IF ShortONMarket AND TrailingFlag = 0 THEN
    newSL = tradeprice(1)+(trailingstartS*pipsize)
    FailsaveSL = newSL+(trailingstartS*pipsize)
    ENDIF
    //breakeven
    IF (tradeprice(1)-close) >= ((MinimumPlus+SaveDistanceS)*pipsize) AND TrailingFlag = 0 THEN
    TrailingFlag = 1
    newSL = tradeprice(1)-(3*pipsize)
    FailsaveSL = newSL+(trailingstartS*pipsize)
    ENDIF
    IF (newSL-close) >= (trailingS*pipsize) AND TrailingFlag = 1 THEN
    newSL = close+(trailingS*pipsize)
    FailsaveSL = newSL+(trailingstartS*pipsize)
    ENDIF
    
    IF ShortOnMarket AND TrailingFlag = 2 THEN
    newSL = tradeprice(1)+(trailingR*pipsize)
    FailsaveSL = newSL+(trailingR*pipsize)
    ENDIF
    //breakeven
    IF (tradeprice(1)-close) >= ((MinimumPlus+SaveDistanceR)*pipsize) THEN
    newSL = tradeprice(1)-(3*pipsize)
    FailsaveSL = newSL+(trailingR*pipsize)
    TrailingFlag = 3
    ENDIF
    IF (newSL-close) >= (trailingR*pipsize) AND TrailingFlag = 3 THEN
    newSL = close+(trailingR*pipsize)
    FailsaveSL = newSL+(trailingR*pipsize)
    ENDIF
    
    //stop order to exit the positions
    IF newSL>0 THEN
    SELL AT newSL STOP
    EXITSHORT AT newSL STOP
    ENDIF
    
    //failsaveSL if rejected SL
    IF LongOnMarket AND close <= FailsaveSL THEN
    SELL AT Market
    ENDIF
    IF ShortOnMarket AND close >= FailsaveSL THEN
    EXITSHORT AT Market
    ENDIF
    
    #187002 quote
    Stefan Sticker
    Participant
    New

    Addendum:
    gehandelte Timeframe 1 Minute

    #187020 quote
    GraHal
    Participant
    Master

    Ich würde gerne sehen, dass es nach all Ihrem Programmieraufwand gut funktioniert! Das hast du gut gemacht!

    Ich schätze, es gibt zu viele Bedingungen, um gleichzeitig übereinstimmend / wahr zu sein und somit die Eröffnung von Trades zu ermöglichen.

    Kreuze über / unter können oft ein Killer sein, wenn sie zu oft verwendet oder mit vielen anderen Bedingungen kombiniert werden.

    Ich bekomme 90 Trades, wenn ich alle Kreuze auf > ändere … wünschte, ich hätte 2 oder 3 Kreuze gleichzeitig gemacht (nicht alle auf einmal).

    Ein paar Ideen, die Sie trotzdem berücksichtigen sollten. 

    Stefan Sticker thanked this post
    #187038 quote
    Stefan Sticker
    Participant
    New

    Danke für den Tip! 🙂

    #187039 quote
    Stefan Sticker
    Participant
    New

    Im Testaccount hatte ich mit exakt diesem Code (plus einen weiteren Code-Teil für Tagesschluss-Rally und einen Simple-Range-BreakOut-Code, optional ein Money-Management-Code und ein Schutzcode gg hohe Volatilität (Kurs über R2 oder unter S2)) bei kleinsten Änderungen im Backuptest in 10,5 Monaten (01.02.2021 bis ca 20.12.2021) ca 120-130 Trades bei Win/Loose-Rate von 62%, Gain/Lost-Ratio von 3,5.
    Jetzt 0,0. Nada. Niente. Gleicher Code, gleicheer Backtest. Und das scheint NUR an den “Highest” bzw “Lowest”-Bedingungen zu liegen. Wahrscheinlich ist der Grund ganz banal und ich habe irgend etwas in den Einstellungen bei PRT oder IG übersehen?

    #187053 quote
    GraHal
    Participant
    Master

    Erhalten Sie bei einem Backtest über 100.000 Balken auch nur 1 Trade?

    Können Sie über 100.000 Balken backtesten? Wenn ja … wie viele Trades erhalten Sie?   

    #187054 quote
    robertogozzi
    Moderator
    Master

    Zeile 18 sollte AND anstelle von OR verwenden, um die Tage von 1 bis 5 zu begrenzen:   Tradeday = OpenDayOfWeek > 0 AND OpenDayOfWeek < 6

    Ich konnte keinen Trade eröffnen!

    #187056 quote
    GraHal
    Participant
    Master

    Ich bekomme 1 Trade beim Backtest von 100.000 Balken auf DAX M1.

    Wenn ich alle Kreuze auf Kreuze unter ändere (kein Sinn, nur um Trades zu bekommen), dann bekomme ich 7 Trades über 100.000 Balken.

    Ich sage immer noch, die zahlreichen Bedingungen sind zusammen zu restriktiv … die Bedingungen sind selten zusammen wahr.

    Probieren Sie Rollback-Versionen aus, wenn Sie sagen, dass es gut funktioniert hat, und führen Sie dann jeweils einen Rollforward durch?

    Lass uns bitte wissen, wie es dir geht. Ich werde weiter daran denken, Bruch- oder Bust-Tests zu beantragen! 🙂

    #187066 quote
    Stefan Sticker
    Participant
    New

    Ich kann bis 1 Millionen backtesten. der Trade kommt aus Zeile 32, wo ich keine “Highest”/”Lowest”-Vergleiche eingefügt habe.
    Bei Backtest vom 01.02. bis 20.12.2021 habe ich immer ca 120 Trades (ungefähr 80 Wins/45 Losses; Ratio 3,5, MaxDrawdown 735,- bei 5,-€/Pip, Gewinn insgesamt 20.000,-€) erhalten.
    Entwickelt habe ich die Regeln bei 200.000 Ticks Anzeige (ca Mai bis Dezember war das bei mir).
    Es hat alles im Demo-Account einwandfrei funktioniert.
    Das gehandelte Produkt war vom Demo-Account die Eurex-Micro-Dax 1,-€.

    Nun handele ich via IG den Deutschland 40 Kassa 1€.

    Ich vermute, es könnte ein anderes Problem sein – nicht im Code, sondern im Daten-Feed zB bei IG?

    #187067 quote
    GraHal
    Participant
    Master

    Bingo … vielleicht! 🙂

    Alle Ihre höchsten und niedrigsten Werte müssen wie folgt sein

    Close < Lowest[3](Close[1]) // deine Code ist Close < Lowest[3] 

    #187068 quote
    robertogozzi
    Moderator
    Master

    Gut entdeckt GraHal !

    GraHal thanked this post
    #187074 quote
    Stefan Sticker
    Participant
    New

    WOW!
    Ja, DAS ist es!
    VIELEN VIELEN VIELEN Dank!
    Da wäre ich nie drauf gekommen!
    Ich hatte keine Idee, und das Handbuch und alle anderen Sources haben mir keinen Hinweis gegeben!
    Ich werde jetzt den Code anpassen, noch ein paar Änderungen für Eleganz und Lesbarkeit einfügen.
    Ist es okay, wenn ich meine gesamte Strategie als Dank für die Hilfe öffentlich zur Verfügung stelle !?

    Liebe Grüße
    Stefan

    GraHal thanked this post
    #187078 quote
    robertogozzi
    Moderator
    Master

    Ja bitte 🙂

Viewing 15 posts - 1 through 15 (of 15 total)
  • You must be logged in to reply to this topic.

Probleme mit Code; “Highest” bzw “Lowest”


ProOrder: Automatischer Handel & Backtesting

New Reply
Author
Summary

This topic contains 14 replies,
has 3 voices, and was last updated by robertogozzi
4 years ago.

Topic Details
Forum: ProOrder: Automatischer Handel & Backtesting
Language: German
Started: 01/29/2022
Status: Active
Attachments: 1 files
Logo Logo
Loading...