MQL5 (Hedging Modus)

 

Guten Tag,

ich arbeite schon seit längerer Zeit an einem EA, nun aber im Hedging Modus. Und nun habe ich das Problem, dass ich keinen StopLoss mehr für Positionen setzten kann (Fehlercode: Angeblich ist die Position nicht vorhanden) . Woran kann das liegen? 

Des Weiteren ist erwähnenswert, das ich einen TrailingStop einbauen will und deswegen einen Umweg mache.

#include <Trade\Trade.mqh>

#define EXPERT_MAGIC 123456

CTrade m_Trade;

double bid;
double ask;

double Trailing_Stop_Wert=0;
double Trailing_Stop;
input double StopLoss=0.00025;

double Trailing_Stop_Wert2=1000000000000000000;
double Trailing_Stop2;
input double StopLoss2=0.00025;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |    MAXIMAL ERLAUBTER SPREAD
//+------------------------------------------------------------------+
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);
   
   MqlRates rates[];
   
   ArraySetAsSeries(rates,true);
   
   int copied=CopyRates(_Symbol,1,0,10,rates);
   
   if(copied<=0) 
      Print("Fehler beim Kopieren der Preisdaten ",GetLastError()); 
   else Print("Kopiert ",ArraySize(rates)," Bars");
   
   if(PositionSelect(_Symbol)==false)
   {
      if(rates[1].open<rates[1].close)
      {
         int i=1;
         
         while(rates[i].open<rates[i].close)
         {
            i++;
            
            if(i>9)
            {
               i=1;
            }
            
            if(rates[i].open>rates[i].close)
            {
               Comment("Der letzte Bar ist positiv und Barummer ",i," ist negativ");
               
               if(rates[1].close>rates[i].open)
               {
                  static datetime Old_Time;
                  datetime New_Time[1];
                  bool IsNewBar=false;
                  
                  int copied2=CopyTime(_Symbol,1,0,1,New_Time);
                  if(copied2>0)
                  {
                     if(Old_Time!=New_Time[0])
                     {
                        IsNewBar=true;
                        if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time);
                        Old_Time=New_Time[0];
                        
                        m_Trade.Buy(0.01,NULL,0.0,0.0,0.0,NULL);
                  
                        Trailing_Stop_Wert=0;
                     }
                  }
                  else
                  {
                     Print("Error in copying historical times data, error =",GetLastError());
                     ResetLastError();
                     return;
                  }
               }
            }
         }
      }
      if(rates[1].open>rates[1].close)
      {
         int j=1;
         
         while(rates[j].open>rates[j].close)
         {
            j++;
            
            if(j>9)
            {
               j=1;
            }
            
            if(rates[j].open<rates[j].close)
            {
               Comment("Der letzte Bar ist negativ und Barnummer ",j," ist positiv");
               
               if(rates[1].close<rates[j].open)
               {
                  static datetime Old_Time;
                  datetime New_Time[1];
                  bool IsNewBar=false;
                  
                  int copied2=CopyTime(_Symbol,1,0,1,New_Time);
                  if(copied2>0)
                  {
                     if(Old_Time!=New_Time[0])
                     {
                        IsNewBar=true;
                        if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time);
                        Old_Time=New_Time[0];
                        
                        m_Trade.Sell(0.01,NULL,0.0,0.0,0.0,NULL);
                  
                        Trailing_Stop_Wert2=1000000000000000000;
                     }
                  }
                  else
                  {
                     Print("Error in copying historical times data, error =",GetLastError());
                     ResetLastError();
                     return;
                  }
               }
            }
         }
      }
   }
   if(PositionSelect(_Symbol)==true)
   {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
         ulong Ticket=PositionGetTicket(0);
         
         Comment(Ticket);
         
         MqlTradeRequest request;
         ZeroMemory(request);
         request.action=TRADE_ACTION_SLTP;
         request.symbol=Symbol();
         request.magic=EXPERT_MAGIC;
         request.order=Ticket;
         request.sl=NormalizeDouble(1.0,_Digits);
         MqlTradeResult result;
         ZeroMemory(result);
         MqlTradeCheckResult CheckResult;
         if(OrderCheck(request,CheckResult)) {OrderSend(request,result);}
         else
         {
            Print(CheckResult.retcode," -error ");
            Print(__FUNCTION__,":",CheckResult.comment);
         }
      }
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
         
      }
   }
}
//+------------------------------------------------------------------+
 

Schaue mal bitte mit dem Debugger in diese beiden variablen request.order request.sl wenn er da durchläuft. 

request.sl=NormalizeDouble(1.0,_Digits);
request.order=Ticket;

und dann berichte mal

 

request.order=2

request.sl=1.0

 

Hier liegt dein Problem:


 if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
         ulong Ticket=PositionGetTicket(0);

Du prüfst erst ob es eine BUY Position ist 

Und dann wählst du blind mit PositionGetTicket(0) blind eine "andere" Position aus.

Aber der Fehler liegt weiter vorn.

Auf einem Hedge Konto kann es mehrer Positionen von einem Symbol geben

Deswegen funktioniert 

PositionSelect

nicht mehr 

Im Netting Mode (ACCOUNT_MARGIN_MODE_RETAIL_NETTING und ACCOUNT_MARGIN_MODE_EXCHANGE) kann nur eine Position pro Symbol vorhanden sein, die das Ergebnis eines oder mehreren Trades darstellt. Man darf Positionen und aktuelle Pending Orders, die auch im Tab Handel in der Werkzeugleiste angezeigt werden, nicht verwechseln.

Bei einer unabhängigen Verrechnung von Positionen (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) können gleichzeitig mehrere Positionen pro Symbol vorhanden sein. In diesem Fall wählt PositionSelect die Funktion mit dem kleinsten Ticket.

Die Funktion PositionSelect() kopiert die Daten über Position ins Programmumfeld und weitere Aufrufe PositionGetDouble()PositionGetInteger() und PositionGetString() geben die früher kopierten Daten zurück. Das bedeutet, dass die Position selbst nicht mehr sein kann (oder ihr Volumen, ihre Richtung usw. haben sich verändert), aber die Daten dieser Position können erhalten werden. Für bestimmte Erhaltung der frischen Daten über die Position ist es empfehlenswert, die Funktion PositionSelect() aufzurufen, bevor man frische Daten aufruft.

 
Ich wusste schon vorher, dass es am Hedging Modus liegt. Allerdings weiß ich nicht, was ich am Code dafür ändern muss.
 
hausmannjack:
Ich wusste schon vorher, dass es am Hedging Modus liegt. Allerdings weiß ich nicht, was ich am Code dafür ändern muss.


Du müsstest wenn der Code für beide Konto Arten funktionieren soll (was eigentlich kaum Sinn macht) eine Abfrage am Anfang machen welches Konto aktiv ist.

 Der EA wird ja eigentlich grundlegend anders da du ja viel mehr Positionen verwalten kannst und auch möchtest.


Lasse den erstmal so wenn er auf dem Netting Konto läuft und baue einen grundlegend neuen auf . Das ist sinnvoller.

Nicht zu viele Baustellen gleichzeitig ! ...

 

Guck dir mal die Reihe an 

https://www.mql5.com/de/articles/2166

Sind 6 Teile wo auch der Hedge Modus erklärt und eingebaut wird.

Alles mal durcharbeiten.

Aber bitte frage mich nicht warum die Teile nicht miteinander verlinkt sind ..... MQL5 Geheimniss :-) immer fleißig suchen 

Universeller Expert Advisor: Handelsmodi von Strategien (Teil 1)
Universeller Expert Advisor: Handelsmodi von Strategien (Teil 1)
  • 2016.04.07
  • Vasiliy Sokolov
  • www.mql5.com
Jeder Entwickler von Expert Advisors, ungeachtet seiner Programmierfähigkeiten, wird mit den gleichen Aufgaben und algorithmischen Problemen konfrontiert, die für einen sicheren Handelsprozess auf diese oder jene Weise gelöst werden müssen. Dieser Beitrag beschreibt die Möglichkeiten der 'Trading-Engine' CStrategy, die die Lösung dieser Aufgaben übernehmen und dem Nutzer geeignete Mechanismen zur Beschreibung seiner Handelsidee anbieten kann.
 
Vielen Dank!
Grund der Beschwerde: