Wenn Du OnTick() und OnStart() verwendest, solltest Du Dich erst einmal informieren:
Hier mal, was für einen Anfänger sehr sinnvoll ist (MQL unterscheidet ich etwas von C und C++):
1. Broker: https://www.mql5.com/de/forum/446736
2. MQL5:
Wenn Du den Cursor auf eine MQL-Funktion setzt und F1 drückst, siehst Du direkt die Referenz, viele mit Beispielen zum Kopieren und Einfügen der schnellsten Form des Programmierens.
https://www.mql5.com/de/articles/496
https://www.mql5.com/de/articles/100
https://www.mql5.com/de/articles/599
und zur Fehlersuche, wenn das Programm nicht tut, was es soll: https://www.metatrader5.com/de/metaeditor/help/development/debug
Es gibt fast nichts, das nicht schon für MT4/5 programmiert wurde!
=> 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)
https://www.mql5.com/de/search#!keyword=kochbuch
3. Indikatoren: siehe diese Artikelserie:
https://www.mql5.com/de/users/m.aboud/publications
Jeder Artikel erklärt einen (im MT5 integrierten) Indikator und, was er einem sagt, und wie man ihn in einem EA verwenden könnte.
4. Foundations of Computer Science: http://i.stanford.edu/~ullman/focs.html
MQL5: https://www.mql5.com/files/pdf/mql5_german.pdf, https://www.mql5.com/files/docs/mt5/mql5/chm/mql5_german.chm
5. Installiern & nutzen des Markets: https://www.mql5.com/en/forum/366161
- 2023.05.03
- www.mql5.com
Hallo. Danke für deine Hilfe un die hilfreichen Links. Habe in meinem Code die On Start gesucht und dabei gesehen das ich die falsche Gepostet hatte. Hänge die richtige noch einmal an.
#include <Trade/Trade.mqh> input double Lots = 0.2; input double RiskPercent = 2.0; input string TimeStart = "07:00"; input string TimeEnd = "18:30"; input int OrderDistPoints = 200; input int TpPoints = 200; input int SlPoints = 200; input int TslPoints = 5; input int TslTriggerPoints = 10; input int Magic = 111; input ENUM_TIMEFRAMES Timeframe = PERIOD_CURRENT; input int ExpirationHours = 50; int handle; int barsTotal; CTrade trade; ulong posTicket; ulong buyPos, sellPos; int OnInit() { handle = iFractals(_Symbol,PERIOD_CURRENT); barsTotal = iBars(_Symbol,PERIOD_CURRENT); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick() { datetime timeEnd = StringToTime(TimeEnd); datetime timeStart = StringToTime(TimeStart); double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); int bars = iBars(_Symbol,Timeframe); if(barsTotal != bars && TimeCurrent() > timeStart && TimeCurrent() < timeEnd){ barsTotal = bars; double fracUpper[]; double fracLower[]; CopyBuffer(handle,UPPER_LINE,2,1,fracUpper); CopyBuffer(handle,LOWER_LINE,2,1,fracLower); bool sellPos = false; bool buyPos = false; if(fracUpper[0] != EMPTY_VALUE){ Print("sell signal..."); sellPos = true; if(posTicket > 0){ if(PositionSelectByTicket(posTicket)){ if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY){ if(trade.PositionClose(posTicket)); if (posTicket = 0) { double SL = fracUpper[0] - TslPoints * _Point; trade.PositionModify(posTicket, SL, 0); } } }else{ } { posTicket = 0; } } } if(fracLower[0] != EMPTY_VALUE){ Print("buy signal..."); buyPos = true; if(posTicket > 0){ if(PositionSelectByTicket(posTicket)){ if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL){ if(trade.PositionClose(posTicket)); if (posTicket = 0) { double SL = fracLower[0] + TslPoints * _Point; trade.PositionModify(posTicket, SL, 0); } } }else{ } { posTicket = 0; } } } if(posTicket <=0){ if(sellPos && !buyPos){ if(trade.Sell(0.1)){ posTicket = trade.ResultOrder(); } } if(buyPos && !sellPos){ if(trade.Buy(0.1)){ posTicket = trade.ResultOrder(); } } } } } void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { if (trans.type == TRADE_TRANSACTION_ORDER_ADD) { COrderInfo order; if (order.Select(trans.order)) { if (order.Magic() == Magic) { if (order.OrderType() == ORDER_TYPE_BUY) { buyPos = order.Ticket(); } else if (order.OrderType() == ORDER_TYPE_SELL) { sellPos = order.Ticket(); } } } } } void processPos(ulong & posTicket) { if (posTicket <= 0) return; if (OrderSelect(posTicket)) return; CPositionInfo pos; if (!pos.SelectByTicket(posTicket)) { posTicket = 0; return; } else { if (pos.PositionType() == POSITION_TYPE_BUY) { double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); if (bid > pos.PriceOpen() + TslTriggerPoints * _Point) { double sl = bid - TslPoints * _Point; sl = NormalizeDouble(sl, _Digits); if (sl > pos.StopLoss()) { trade.PositionModify(pos.Ticket(), sl, pos.TakeProfit()); } } } else if (pos.PositionType() == POSITION_TYPE_SELL) { double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); if (ask < pos.PriceOpen() - TslTriggerPoints * _Point) { double sl = ask + TslPoints * _Point; sl = NormalizeDouble(sl, _Digits); if (sl < pos.StopLoss() || pos.StopLoss() == 0) { trade.PositionModify(pos.Ticket(), sl, pos.TakeProfit()); } } } } } void executeBuy(double entry) { entry = NormalizeDouble(entry, _Digits); double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); if (ask > entry - OrderDistPoints * _Point) return; double tp = entry + TpPoints * _Point; tp = NormalizeDouble(tp, _Digits); double sl = entry - SlPoints * _Point; sl = NormalizeDouble(sl, _Digits); double lots = Lots; if (RiskPercent > 0) lots = calcLots(entry - sl); datetime timeEnd = StringToTime(TimeEnd); datetime expiration = iTime(_Symbol, Timeframe, 0) + ExpirationHours * PeriodSeconds(PERIOD_H1); if (expiration < timeEnd) { trade.BuyStop(lots, entry, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, expiration); } else { trade.BuyStop(lots, entry, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, timeEnd); } Print(expiration); buyPos = trade.ResultOrder(); } void executeSell(double entry) { entry = NormalizeDouble(entry, _Digits); double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); if (bid < entry + OrderDistPoints * _Point) return; double tp = entry - TpPoints * _Point; tp = NormalizeDouble(tp, _Digits); double sl = entry + SlPoints * _Point; sl = NormalizeDouble(sl, _Digits); double lots = Lots; if (RiskPercent > 0) lots = calcLots(sl - entry); datetime timeEnd = StringToTime(TimeEnd); datetime expiration = iTime(_Symbol, Timeframe, 0) + ExpirationHours * PeriodSeconds(PERIOD_H1); if (expiration < timeEnd) { trade.SellStop(lots, entry, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, expiration); } else { trade.SellStop(lots, entry, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, timeEnd); } sellPos = trade.ResultOrder(); } double calcLots(double slPoints) { double risk = AccountInfoDouble(ACCOUNT_BALANCE) * RiskPercent / 100; double ticksize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); double tickvalue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE); double lotstep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP); double moneyPerLotstep = slPoints / ticksize * tickvalue * lotstep; double lots = MathFloor(risk / moneyPerLotstep) * lotstep; lots = MathMin(lots, SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX)); lots = MathMax(lots, SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN)); return lots; }
Gut!
Und jetzt setzt Du einen Breakpoint (siehe oben 'Debugger') an den ifs for OrderModify() und prüfe im bzw. mit den Debugger, warum Dein Programm nicht zu diesem Befehl kommt.
- 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.
Hallo. Habe mich an einem Code Versucht bekomme es aber irgendwie nicht hin das er weder meinen Trailing Stop noch meinen Stop Loss oder Take Profit ausführt. Für Hilfe wäre ich Dankbar.
Hier der Code: