Wenn du in's Journal schaust, siehst du was nicht passt.
Verwende die Systemlibrary, das spart viel Arbeit und Ärger
#include <Trade\Trade.mqh> // einbinden der Library CTrade Trade; // erzeugen der Instanz
Du sparst dir damit deine Funktionen zum Öffnen und Schließen der Trades. So verwendest du es:
if(!Trade.Buy (Lots,NULL,NULL,SL,TP)) { // Fehlerbehandlung } if(!Trade.Sell(Lots,NULL,NULL,SL,TP)) { // Fehlerbehandlung } if(!Trade.PositionClose(_Symbol)) { // Fehlerbehandlung } // Berechnung SL / TP für Long double SL = Ask - SL_points * _Points; double TP = Ask + TP_points * _Points; // Berechnung SL / TP für Short double SL = Bid + SL_points * _Points; double TP = Bid - TP_points * _Points;
Für die Berechnung von SL und TP musst du die Eingaben von Points in Preise umrechnen.
LG OttoHallo Otto, habe meine code umgeschrieeb und eine neue Version gemacht, aber im realmode schickt er immer noch nicht die Order in den Markt, und beim Debugging ist auch alles gut.
//+---------------------------------------------------------------------------+ //| LongSignal Senden //+---------------------------------------------------------------------------+ // Berechen des Askpreis double ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); double sl_price = NormalizeDouble(ask - (Body*Faktor_SL*10),_Digits); //Body Größe des Körpers des Hammers double tp_price = NormalizeDouble(ask + (Body*Faktor_TP*10),_Digits); if( Hammer==true && checktime(starttime(),endtime())==true && PositionsTotal()==0 && TimeCurrent() > (OrderOpenTime+60*Wartezeit+Schlieszeit*60) && Kerze2_Test==true && Abstand_SMA < Abstand_zur_SMA ) { // verschicken der Order trade.Buy (HandelsLots,NULL,NULL,sl_price,tp_price,"Hammer.2.4"); // Setzten des Zeitpunktes wann wir die Order geöffnet haben OrderOpenTime = orderopentime(); } //+---------------------------------------------------------------------------+ //| Schlißen über die Zeit //+---------------------------------------------------------------------------+ if( TimeCurrent() > (OrderOpenTime+Schlieszeit*61) && PositionsTotal() != 0) { trade.PositionClose( Symbol(), 200); }
Hallo David,
eventuell erlaubt der Broker keine EAs.
Der Terminalstatus gehört in einem ausgewachsenen EA sowieso überprüft.
Im Anhang schenke ich dir und der Community eines meiner 'Powertools': TerminalExt.mqh
Ist OOP-programmiert und die Instanz wird auch dort definiert, einfach nur #include und schon ist es einsatzbereit.
Ist vielleicht wie 'mit Kanonen auf Spatzen schießen', dafür aber super einfach zu verwenden.
Am besten im Ordner 'MQL5\Include\Trade' ablegen.
Und so wird es verwendet:
#include <trade\TerminalExt.mqh> int OnInit() { /* diverse initialisierungen */ return(Terminal.OnInit()); // als letzten Punkt }
Thats all you need.
Hier der Code zum Ansehen:
//+------------------------------------------------------------------+ //| TerminalExt.mqh | //| Copyright © 2018 Ing. Otto Pauser | //| https://www.mql5.com/de/users/kronenchakra | //| Extension of CTerminalInfo | //+------------------------------------------------------------------+ /* Hinweis: falls die Verbindung zum Broker im laufenden Betrieb ausfällt, muss dies mit einem OnTimer() event überprüft werden, da ja kein OnTick() event mehr ausgelöst wird. TerminalInfoInteger(TERMINAL_CONNECTED) überprüfen. */ #include <Trade\TerminalInfo.mqh> enum ENUM_TERMINAL_STATE // Terminalstate enumeration { ALL_CHECKED_OK, // All checks ok NOT_CONNECTED, // Terminal is not connected NOT_NETTINGMODE, // Terminal is not in nettingmode NOT_TRADE_ALLOWED, // Trading is not allowed NOT_EXPERTS_ALLOWED, // Experts are not allowed NOT_FILLING_FOK, // Fillingmode FOK not available NOT_SYMBOL_FOUND // Symbol was not found }; #define TSTATE ENUM_TERMINAL_STATE // simple abbreviations #define RETCODE ENUM_INIT_RETCODE class CTerminalExt : public CTerminalInfo { private: TSTATE TerminalState; public: void CTerminalExt(void); // constructor void ~CTerminalExt(void) {}; // destructor not needed bool Check(void); string ErrMsg(void); // return a errormessage RETCODE OnInit(void); }; CTerminalExt Terminal; // instanz erzeugen void CTerminalExt::CTerminalExt(void) { TerminalState=NOT_CONNECTED; if(!TerminalInfoInteger(TERMINAL_CONNECTED)) return; TerminalState=NOT_NETTINGMODE; if(!AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_NETTING) return; TerminalState=NOT_TRADE_ALLOWED; if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)) return; TerminalState=NOT_EXPERTS_ALLOWED; if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT)) return; TerminalState=NOT_FILLING_FOK; if(!SymbolInfoInteger(_Symbol,SYMBOL_FILLING_MODE)) return; TerminalState=NOT_SYMBOL_FOUND; if(!SymbolSelect(_Symbol,true)) return; TerminalState=ALL_CHECKED_OK; } bool CTerminalExt::Check(void) // für allgemeine Verwendung { if(TerminalState==ALL_CHECKED_OK) return(true); Alert("*ERROR* ", Terminal.ErrMsg()); return(false); } RETCODE CTerminalExt::OnInit(void) // für die Verwendung in der OnInit { if(Check()) return(INIT_SUCCEEDED); else return(INIT_FAILED); } string CTerminalExt::ErrMsg(void) { switch(TerminalState) { case NOT_CONNECTED : return("Terminal not connected"); case NOT_NETTINGMODE : return("Terminal not in nettingmode"); case NOT_TRADE_ALLOWED : return("Trading not allowed"); case NOT_EXPERTS_ALLOWED: return("Experts not allowed"); case NOT_FILLING_FOK : return("Fillingmode FOK not available"); case NOT_SYMBOL_FOUND : return("Symbol "+_Symbol+" not found"); } return("unknown error"); }
LG, Otto
Im Anhang schenke ich dir und der Community eines meiner 'Powertools': TerminalExt.mqh
Welch Augenschmauß ...top Otto !
Hallo Otto,
danke für dieses coole Werkzeug! Bei mir kommt als Fehlermeldgung "Terminal is not in nettingmode",
was heißt das, und wo könnte ich das ändern in den Eingstellungen ?Liebe Grüße
David
Hallo Otto,
danke für dieses coole Werkzeug! Bei mir kommt als Fehlermeldgung "Terminal is not in nettingmode",
was heißt das, und wo könnte ich das ändern in den Eingstellungen ?Liebe Grüße
David
Hallo David,
das ist prinzipiell nicht so tragisch, das kann vom Broker eingestellt werden, die Programmierung eines EAs wird dann halt aufwändiger.
Das Problem ist, das zu diesem Zeitpunkt, wichtigere Dinge noch nicht abgefragt wurden.
Ändere die Reihenfolge der Abfragen im Code folgendermaßen:
void CTerminalExt::CTerminalExt(void) { TerminalState=NOT_CONNECTED; if(!TerminalInfoInteger(TERMINAL_CONNECTED)) return; TerminalState=NOT_TRADE_ALLOWED; if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)) return; TerminalState=NOT_EXPERTS_ALLOWED; if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT)) return; TerminalState=NOT_FILLING_FOK; if(!SymbolInfoInteger(_Symbol,SYMBOL_FILLING_MODE)) return; TerminalState=NOT_NETTINGMODE; if(!AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_NETTING) return; TerminalState=NOT_SYMBOL_FOUND; if(!SymbolSelect(_Symbol,true)) return; TerminalState=ALL_CHECKED_OK; }
Das ist sicher besser
LG, Otto
@Christian: Danke für die Blumen!
Hallo Otto,
habe jetzt mit meinem Broker telefoniert, aber es gibt den nettingmode bei ihm leider nur beim MT4.
Heißt wohl für mich ich muss wohl neuen Code schreiben, wie oder was würde sich den ändern an meiner funktion LongPositionOpen() ?
Vielen Dank für die Hife!
int LongPositionOpen() { MqlTradeRequest mrequest; // Will be used for trade requests MqlTradeResult mresult; // Will be used for results of trade requests ZeroMemory(mrequest); ZeroMemory(mresult); double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); // Ask price double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); // Bid price if(!PositionSelect(_Symbol)) { mrequest.action = TRADE_ACTION_DEAL; // Immediate order execution mrequest.price = NormalizeDouble(Ask,_Digits); // Lastest Ask price mrequest.sl = NormalizeDouble(Ask - (20),_Digits); // Stop Loss 20 Punkte vom Kurswert mrequest.tp = NormalizeDouble(Ask + (20),_Digits); // Take Profit mrequest.symbol = _Symbol; // Symbol mrequest.volume = HandelsLots; // Number of lots to trade mrequest.magic = Magicnumber; // Magic Number mrequest.type = ORDER_TYPE_BUY; // Buy Order mrequest.type_filling = ORDER_FILLING_FOK; // Order execution type mrequest.deviation=800; // Deviation from current price return(OrderSend(mrequest,mresult)); // Send order } return(false); }
Liebe Grüße
David
Hallo David,
normalerweise ist es umgekehrt. MT4 hedging, MT5 netting.
Am Code ändert sich prinzipiell nichts, im Nettingmode werden die Positionen einfach zusammengefasst,
im Hedgingmode werden neue zusätzliche Positionen eröffnet. Deswegen ist hier das iterieren über alle Positionen erforderlich.
Also ändert sich doch was, aber das würde hier den Rahmen sprengen.
Wichtig ist im MT5 die Unterscheidung zwischen Position, Order und Deal (steht alles in derDokumentation).
Schau doch im Log nach was da los ist, da steht drin warum er eine Order nicht ausführen kann!!!!!!!!!
LG, Otto
- 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 liebe Community,
bin seit ein paar Monaten dabei, und habe ein EA geschrieben der einen Hammer Kerzenfomation im Chart erkennen soll, dieser soll nur zwischen 06-23 Uhr arbeiten.
Das Funktioniert auch alles im Backtesting, aber nicht im Realmode, erschickt einfach nicht die Order raus.
Könntet ihr mir helfen ?Beste grüße
David