EA schickt im realmode keine Order

 

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
Dateien:
Hammer.2.3.mq5  21 kb
 
Ich würde den EA ganz einfach Debuggen mit historischen Daten. Da kannst Du ihn starten und recht schnell zu den Problemstellen kommen..
 

Habe es mal Debuggen lassen und ist wohl irgenwas mit der SendOrder und deren Rückgabewert, mresult. Ich weiß grade echt nicht mehr weiter schon sehr viel ausprobiert

 

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 Otto
 

Hallo 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

Dateien:
 

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

 
d.kumpf:

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