Du brauchst globale veränderbare Variablen für Kauf und Verkauf, die bei einer neuen Position auf = gestellt wird und dann beim Trailing um 1 erhöht und dann gegen den Maximalwert getestet wird.
Ungetestet(!):
input int TslTriggerSteps = 2; int _TslTriggerStepsBUY; // globale veränderbare Variable ... OnTick() { ... if (_TslTriggerSteps < TslTriggerSteps) { if(posType == POSITION_TYPE_BUY){ if(bid >= posOpenPrice + TslTriggerPoints * _Point){ _TslTriggerStepsBUY++; ... } } } ... if (open new buy position) { ... _TslTriggerStepsBUY = 0 // rücksetzen auf 0 } }
Carl Schreiber #:
++
Besten Dank für deine Antwort. ich habe Dein " if (_TslTriggerSteps < TslTriggerSteps) {" zu " if (_TslTriggerStepsBUY < TslTriggerSteps) {" umgeschrieben weil es das sonst nicht gefunden hätte .
so wie ich den Code jetzt habe (und auch wenn ich das rücksetzen auf 0 rauslassen würde) setzt er mir einmalig den SL auf einstiegspreis und das war es dann mit den Schritten des nachziehens (2x, 3x oder 5x beispielsweise Ignoriert er dabei total)
Was mach ich falsch?
#include <Trade/Trade.mqh> input int TslPoints = 4000; input int TslTriggerPoints = 4000; input int TslTriggerSteps = 3; int _TslTriggerStepsBUY; CTrade trade; void OnTick(){ for(int i = PositionsTotal()-1; i >=0; i--){ ulong posTicket = PositionGetTicket(i); if (PositionSelectByTicket(posTicket) && PositionGetString(POSITION_SYMBOL) == _Symbol){ ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); double posOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN); double posTp = PositionGetDouble(POSITION_TP); double posSl = PositionGetDouble(POSITION_SL); double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); if (_TslTriggerStepsBUY < TslTriggerSteps) { if(posType == POSITION_TYPE_BUY){ if(bid >= posOpenPrice + TslTriggerPoints * _Point){ double sl = bid - TslPoints * _Point; sl = NormalizeDouble(sl,_Digits); _TslTriggerStepsBUY++; if(sl > posSl){ if (trade.PositionModify(posTicket,sl,posTp)){ Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl..."); _TslTriggerStepsBUY = 0; // rücksetzen auf 0 } } } }else if(posType == POSITION_TYPE_SELL){ if(ask <= posOpenPrice - TslTriggerPoints * _Point){ double sl = ask + TslPoints * _Point; sl = NormalizeDouble(sl,_Digits); if(sl < posSl || posSl == 0){ if (trade.PositionModify(posTicket,sl,posTp)){ Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl..."); } } } } } } } }
Also, wenn ein Programm ohne Fehler kompiliert, aber nicht macht, was es soll, verwendet man den Debugger, um durch das zeilenweise Verfolgen des Programmablaufs herauszufinden, warum und wo es schief läuft: https://www.metatrader5.com/de/metaeditor/help/development/debug.
Du musst wissen, es gibt fast nichts, das nicht schon für MT4/5 programmiert wurde! Also Suchen statt programmieren:
=> Suchen in den Artikeln: https://www.mql5.com/de/articles
=> Suchen in der Codebase: https://www.mql5.com/de/code
=> Suchen allgemein: https://www.mql5.com/de/search oder über Google mit: "site:mql5.com .." (verzeiht Schreibfehler)
Hier ist eine Zusammenstellung für Neulinge: https://www.mql5.com/de/forum/455957#comment_50048608
- www.metatrader5.com
Ja ohne fehler kompiliert es aber da ich mich selbst mit dem Coden auf dieser Plattform auskenne, weiß ich noch nicht so recht ob der fehler dennoch hinter der Tastatur sitzt ;-)
ich habe schon alles mögliche durchgeschaut und ausprobiert, nur finde ich entweder was komplett falsches oder nur Schnipsel, die ich nicht zusammenbekomme aufgrund des aktuellen Wissenstandes.
ich versuche es mal mit dem Debugger
#include <Trade/Trade.mqh> input int TslPoints = 4000; input int TslTriggerPoints = 4000; CTrade trade; void OnTick(){ for(int i = PositionsTotal()-1; i >=0; i--){ ulong posTicket = PositionGetTicket(i); if (PositionSelectByTicket(posTicket) && PositionGetString(POSITION_SYMBOL) == _Symbol){ ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); double posOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN); double posTp = PositionGetDouble(POSITION_TP); double posSl = PositionGetDouble(POSITION_SL); double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); if(posType == POSITION_TYPE_BUY){ if(bid >= posOpenPrice + TslTriggerPoints * _Point){ double sl = bid - TslPoints * _Point; sl = NormalizeDouble(sl,_Digits); if(sl > posSl){ if (trade.PositionModify(posTicket,sl,posTp)){ Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl..."); } } } }else if(posType == POSITION_TYPE_SELL){ if(ask <= posOpenPrice - TslTriggerPoints * _Point){ double sl = ask + TslPoints * _Point; sl = NormalizeDouble(sl,_Digits); if(sl < posSl || posSl == 0){ if (trade.PositionModify(posTicket,sl,posTp)){ Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl..."); } } } } } } }
Hallo,
wieso machen Sie es nicht mit "return" Befehl?
input int TslTriggerSteps = 2; #include <Trade/Trade.mqh> input int TslPoints = 4000; input int TslTriggerPoints = 4000; CTrade trade; void OnTick(){ for(int i = PositionsTotal()-1; i >=0; i--){ ulong posTicket = PositionGetTicket(i); if (PositionSelectByTicket(posTicket) && PositionGetString(POSITION_SYMBOL) == _Symbol){ ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); double posOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN); double posTp = PositionGetDouble(POSITION_TP); double posSl = PositionGetDouble(POSITION_SL); double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); if(posType == POSITION_TYPE_BUY){ if(bid > posOpenPrice + (TslTriggerPoints * TslTriggerSteps)*_Point){ return; } if(bid >= posOpenPrice + TslTriggerPoints * _Point){ double sl = bid - TslPoints * _Point; sl = NormalizeDouble(sl,_Digits); if(sl > posSl){ if (trade.PositionModify(posTicket,sl,posTp)){ Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl..."); } } } }else if(posType == POSITION_TYPE_SELL){ if(ask < posOpenPrice - (TslTriggerPoints * TslTriggerSteps)*_Point){ return; } if(ask <= posOpenPrice - TslTriggerPoints * _Point){ double sl = ask + TslPoints * _Point; sl = NormalizeDouble(sl,_Digits); if(sl < posSl || posSl == 0){ if (trade.PositionModify(posTicket,sl,posTp)){ Print(__FUNCTION__," > Pos #",posTicket," was modified by tsl..."); } } } } } } }
Gruß Igor
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
wie bekomme ich es hin das ich diesen z.b. nur 2x ausführen lassen kann? also gewisse hinzufügen kann, das er nach den eingegebenen 2 mal das nachziehen stoppt?
habe schon alles mögliche versucht, bekomme es aber nicht hin.
Bin für jede Hilfe Dankbar.