Expert Advisor funktioniert nich richtig

 

Hallo Zusammen,

ich arbeite gerade an einem Expert Advisor (MQL5), der die Sure Fire Hedging Strategie verwendet. Dazu müssen immer die Orders abwechselnd laufen (z.B.: Buy Order --> Sell Order --> Buy Order --> Sell Order usw.). Allerding scheint das bei mir nicht richtig zu funktionieren. Es wechselt nicht immer, sondern nur manchmal die Orders ab und manchmal stimmen Stoploss und Takeprofit auch nicht. Würde mich sehr freuen, wenn mir jemand helfen könnte.

Mit freundlichen Grüßen,

Michi

 

Hier der Code:

#include <Trade/Trade.mqh>

CTrade m_Trade;

double Lot;
double bid;
double ask;
double Kaufpreis;
double StopLoss;
double TakeProfit;
bool Buy;
bool Sell;
bool HedgingErlaubt=false;
bool Check=true;
ulong ticket;
int Spread;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   Spread=SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
  
   if(Check==true)
   {    
      double   open_price;
      double   initial_volume;
      datetime time_setup;
      string   symbol;
      string   type;
      long     order_magic;
      long     positionID;
  
      uint     total=OrdersTotal();
  
      for(uint i=0;i<total;i++)
      {  
         if((ticket=OrderGetTicket(i))>0)
         {
            open_price    =OrderGetDouble(ORDER_PRICE_OPEN);
            time_setup    =(datetime)OrderGetInteger(ORDER_TIME_SETUP);
            symbol        =OrderGetString(ORDER_SYMBOL);
            order_magic   =OrderGetInteger(ORDER_MAGIC);
            positionID    =OrderGetInteger(ORDER_POSITION_ID);
            initial_volume=OrderGetDouble(ORDER_VOLUME_INITIAL);
            type          =EnumToString(ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE)));

            printf("#ticket %d %s %G %s at %G was set up at %s",
                   ticket,                 // Orderticket
                   type,                   // Typ
                   initial_volume,         // das gestellte Volumen  
                   symbol,                 // Symbol, für das gestellt ist  
                   open_price,             // der angegebene Eroeffnungspreis  
                   TimeToString(time_setup)// Zeit der Orderstellung  
                  );
         }
      }
   }
   if(PositionSelect(_Symbol)==false)
   {
      m_Trade.OrderDelete(ticket);
      
      if(OrdersTotal()==0)
      {
         if(Spread<=30)
         {
            Lot=0.01;
      
            m_Trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot,ask,ask-0.00090,ask+0.00030,NULL);
      
            Kaufpreis=ask;
            StopLoss=ask-0.00090;
            TakeProfit=ask+0.00030;
      
            Buy=false;
            Sell=true;
         }
      }
   }
   if(OrdersTotal()==0)
   {
      HedgingErlaubt=true;
      
      if(HedgingErlaubt==true)
      {
         if(Buy==true)
         {
            if(Spread<=30)
            {
               Lot=Lot*10;
        
               m_Trade.OrderOpen(_Symbol,ORDER_TYPE_BUY_STOP,Lot,ask,Kaufpreis,StopLoss,TakeProfit,0,0,NULL);
        
               Buy=false;
               Sell=true;
               HedgingErlaubt=false;
            }
         }
      }
      if(HedgingErlaubt==true)
      {
         if(Sell==true)
         {
            if(Spread<=30)
            {
               Lot=Lot*10;
        
               m_Trade.OrderOpen(_Symbol,ORDER_TYPE_SELL_STOP,Lot,bid,Kaufpreis-0.00060,TakeProfit,StopLoss,0,0,NULL);
        
               Buy=true;
               Sell=false;
               HedgingErlaubt=false;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+
 
Tut mir leid, da ich nicht viel über mql5 weiß (macht Unterschied zw. realen und pending Orders,...), kann ich Dir nicht wirklich helfen.
 
Hi,

ich hab deinen Code kurz durchgescehen und dem Metaeditor zum Fraß vorgeworfen ;) - (kompiliert).
Der zeigt viele vermeidbare Warnungen.


possible loss of data.... kannst du durch 'typecasting' beheben. (Zeile 39)
Spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
Die andere Variante wäre Spread nicht als 'int' sondern als 'ulong' zu definieren, das verschiebt die Sache aber nur nach hinten.

Den Hedging/Netting-Mode kannst du abfragen
bool HedgingErlaubt= AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING;
Für einen ausgewachsenen EA wirst du noch mehrere mqh-Dateien einbinden müssen.
#include <Trade\Trade.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
Zu deiner Hauptfarge kann ich dir aber derzeit leider nichts konkretes sagen, ich werde mir aber ein Demokonto im Hedgingmode für den MT5 einrichten

Die Warnung 'declaration of blabla hides ....' Über das habe ich mich schon beim Service-Desk aufgeregt, dass da eine Compilerdirektive eingebaut gehört, aber das sind Sturböcke.

Du kannst es vermeiden indem du deine Variable 'test' halt 'Test' nennst.

Ich hätte noch jede Menge Tips, aber ein Buch zu schreiben ist mir doch zu viel Arbeit.

Bei Interesse schick mir eine PN für Kommunikation via Skype.

Grüße Otto