EA kollidiert bei Verwendung mehrerer Paare... - Seite 2

 
DomGilberto:
Tut mir leid - das war mein Fehler, dass ich es nicht richtig erklärt habe. Ich schaue auf D1, 4Hr und schließlich 1Hr für die MA's auseinander gefächert werden (unter einer Last von anderen Filtern) - Sobald sie alle aufgereiht, auf der H1 wird es warten, bis jede Bar zieht zurück auf die 21 EMA ONCE, und dann von dort wird es eine Bestellung über die Hochs und einen Stopp unter der 60 EMA - ATR.

Der Pullback zum 21 EMA erfolgt nur einmal. Danach sucht er nicht mehr nach weiteren Rücksetzern auf den 21 EMA. Es sollte jedoch sicherstellen, dass der aktuelle offene PENDING-Auftrag mit den Lots, Stopps und Take Profits NACH jedem Stundenschluss genau auf dem neuesten Stand ist. Ich kann mir jedoch nicht erklären, warum es manchmal einwandfrei funktioniert und die Pending Order nach jedem H1-Schluss aktualisiert, und manchmal nicht? Der Grund, warum die Pending Order sich selbst aktualisiert, ist ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) ".

Wenn das nicht zutrifft, dann nicht - ABER es gibt zahllose Fälle, in denen das zutrifft, und dennoch wird die Order nicht gelöscht und eine neue mit den neuen Werten platziert?

Ich bin mir nicht sicher, ob Sie etwas in dem obigen Code in Bezug auf das Video sehen können? (Erster Code, den Sie korrigiert haben). Ich hoffe, das ist klarer?

Ich denke, Sie müssen es auf die harte und mühsame Art und Weise tun ... drucken Sie die relevanten Variablen, bewegen Sie sich durch die Zeit in der Strategie-Tester, Tick für Tick, wenn nötig, zu überprüfen, was die Variablen sind ... dann, wenn Sie feststellen, dass sie etwas passieren sollte, und sie nicht können Sie in diesem Code zu konzentrieren.

Es ist relativ einfach, einfache Syntaxprobleme im Code eines anderen zu erkennen. Es ist schwieriger und sehr viel zeitaufwändiger, Fehler in der Kodierung der Strategie zu erkennen, denn dazu muss man die Strategie genauso gut, wenn nicht sogar besser verstehen als die Person, die die Kodierung vornimmt.

 
Ja, du hast Recht! Ich werde genau das jetzt tun :) danke Raptor!
 
Eine Sache, die ich brauche, um klar in meinem Kopf ist; dieser Code hier, auf die Schleife, wie stelle ich sicher, dass es die OrderDelete() Funktion ausführt und die Schleife ist Schleife auf jedem H1 schließen? Liegt das daran, dass ich dies am "int start" habe, der anzeigt, ob die Schleife auf einer H1-Basis ausgeführt wird oder nicht? (Die "IsNewCandle()") ?

int start()
 {
   if(IsNewCandle())
      {
      CheckForMaTrade();//signals, deletions and candle trails only need checked on a new candle.
      }

   if(OpenOrdersThisPair(Symbol())>0)
      {
      if(UseMoveToBreakEven)MoveToBreakEven();//Move to b/e, normal trail and MA_trail need to trail on each tick
      if(Use_MA_Trail)MA_Trail();
      }
   
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  
if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{  
            
      if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_SELL)
         {
         CloseHalfOrder1(); 
         }
   
      if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
         {
         CloseHalfOrder(); 
         }   
     }
}
 for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue;
           
         if( OrderType() == OP_BUYSTOP &&
            OrderMagicNumber() == MagicNumber &&
            OrderSymbol() == Symbol() )        
            {
            if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR)  
               {
               Stored_BuyPrice = OrderOpenPrice();   
               DeleteOrder = OrderDelete(OrderTicket()); 
               }

            if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder)  // If there are no open orders = place a new order. 
               {
               int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green);
               if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError());
               }
            }
         }
bool IsNewCandle()
   {
   static datetime  Bar1Time;
   if(Bar1Time == Time[1]) //"Time" used to be "Bars" with no brackets 
      return(false);
      
   Bar1Time = Time[1]; //"Time" used to be "Bars" with no brackets 
   return(true);
   }
 
DomGilberto:
Eine Sache, über die ich mir im Klaren sein muss, ist dieser Code hier, in der Schleife, wie stelle ich sicher, dass er die OrderDelete()-Funktion ausführt und die Schleife bei jedem H1-Schluss ausgeführt wird? Liegt das daran, dass ich dies am "int start" habe, der anzeigt, ob die Schleife auf einer H1-Basis ausgeführt wird oder nicht? (Die "IsNewCandle()") ?


CheckForMATrade() wird einmal pro neuem Balken aufgerufen, wenn Sie auf einem H1-Chart laufen, wird das einmal zu Beginn des neuen H1-Balkens sein ... der Rest wird jeden Tick ausgeführt.

Berechnen Sie den korrekten ATR-Wert für den Beginn des neuen Balkens? wenn man bedenkt, dass Sie gerade erst mit Bar 0 begonnen haben, wollen Sie wirklich den MA auf der Grundlage von Bar 0 erhalten? Indikatoren sind nicht mein Ding, also gehen Sie nicht davon aus, dass ich sage, dass Sie falsch liegen, ich frage nur

 
Ja, ich habe gerade einen Ausdruck gemacht, um die MA-ATR-Rechnung zu überprüfen. Sie ist korrekt. Ich tue es auf Bar 1 (die zuletzt geschlossenen H1 bar). Die Mathematik ist richtig, ich glaube nur nicht, dass die Berechnungen konsequent auf JEDEN H1 Bar schließen getan werden...
 
DomGilberto:
Ja, ich habe gerade einen Ausdruck gemacht, um die MA-ATR-Mathematik zu überprüfen. Sie ist korrekt. Ich tue es auf Bar 1 (die zuletzt geschlossenen H1 bar). Die Mathematik ist richtig, ich glaube nur nicht, dass die Berechnungen konsequent auf JEDEN H1 Bar schließen getan werden...

Der MA liegt aber nicht auf Takt 1...

iMA(NULL, 60, MA_Period, 0, 1, 0, 0   ) - ATR)  
 
Gut erkannt - danke :) Ich glaube, ich weiß, warum es die Order nicht löscht... WENN der OrderStopLoss NICHT > als der MA-ATR ist, dann wird es nichts tun... Es macht also Sinn... Nur manchmal schaue ich es mir an, und es ist, als ob es die Order nicht löschen und eine neue platzieren will, obwohl es das sollte?

Eine letzte Frage, wenn es Ihnen nichts ausmacht - ich bekomme immer noch diesen blöden Order Modify error 1! Es stellt sich heraus, dass er von hier kommt, wenn ich ihn ausdrucke? Irgendwelche Ideen?

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

{

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               //buy order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.
               if(OrderType()==OP_BUY)
                  {
                  if(OrderStopLoss() > BuyStopPrice) break; 
                  if(OrderStopLoss() < BuyStopPrice)
                     bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                   if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
                   }     

               // sell order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.     
               if(OrderType()==OP_SELL)
                  {
                  if(OrderStopLoss() < SellStopPrice) break; 
                  if(OrderStopLoss() > SellStopPrice)
                     bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                  if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
                  }
               }   
     }
}
 
DomGilberto:
Guter Punkt - danke :) Ich glaube, ich weiß, warum die Order nicht gelöscht wird... WENN der OrderStopLoss NICHT > als der MA-ATR ist, dann tut er nichts... Es macht also Sinn... Nur manchmal schaue ich es mir an, und es ist, als ob es die Order nicht löschen und eine neue platzieren will, obwohl es das sollte?

Eine letzte Frage, wenn es Ihnen nichts ausmacht - ich bekomme immer noch diesen blöden Order Modify error 1! Es stellt sich heraus, dass er von hier kommt, wenn ich ihn ausdrucke? Irgendeine Idee?

Das ist das Problem... (ähnlich für OP_SELL)

if( OrderStopLoss() < BuyStopPrice )

. . . und wenn Sie eine Fehlermeldung 1 erhalten, liegt das daran, dass OrderStopLoss() == BuyStopPrice ist, so dass Sie die Order so ändern, dass sie denselben StopLoss-Wert hat, daher Fehlermeldung 1, und jetzt fragen Sie sich, wie einerseits OrderStopLoss() == BuyStopPrice und andererseits OrderStopLoss() < BuyStopPrice

Sind Sie dem Link im Beitrag gefolgt und haben ihn gelesen, bis Ihnen die Augen bluteten? Ich wette, das haben Sie nicht... https://www. mql5.com/en/forum/146380 wenn Sie dieses Problem weiterhin ignorieren, wird es Sie immer wieder einholen und Sie werden weiterhin Zeit verschwenden... setzen Sie sich damit auseinander, verstehen Sie es, leiden Sie nicht länger darunter, seien Sie glücklich

 

Ok, ich werde durch alle, dass wieder zu lesen - zurück zu dem Problem mit dem Video angehängt, wie ich denke, ich habe es gelöst ist unten, ABER es funktioniert nicht auf der Buy-Seite? Aus irgendeinem Grund werden überhaupt keine Trades ausgelöst. Auf der Verkaufsseite funktioniert es jedoch GENAU so, wie ich es haben möchte.

Auf der Kaufseite ist alles genau umgekehrt. All diese if-Anweisungen sind nur gleitende Durchschnitte. Die spezifische Zeile, die ich geändert habe, ist "triggerBarTime+H1_high>= ema21". Auf der Kaufseite würde sie wie folgt aussehen: "triggerBarTime+H1_low<= ema21" - Wenn ich "triggerBarTime" herausnehme, funktioniert es sowohl bei Kauf- als auch bei Verkaufsaufträgen. Wenn ich jedoch "triggerBarTime" eintrage, funktioniert es perfekt auf der Verkaufsseite (d.h., die Aufträge werden auf JEDEM Balken geschlossen, perfekt neu berechnet und ein neuer Auftrag mit angepassten Parametern platziert). ABER es werden keine Aufträge platziert und es wird auch nicht versucht, etwas auf der Kaufseite zu tun? Dies ist eine wirklich wichtige Änderung, die ich vornehmen muss...

Schauen Sie sich dieses Video an: http: //screencast.com/t/uJu3nlNxAXDF - Hoffentlich wird es hier wirklich gut erklärt!! :D


Keine Sorge, wenn Sie nicht helfen können :)

     // Check for Moving Averages Fanned up ON THE DAILY TIME FRAME, creating an UP bias.   
    if(D1_Bias=="None") 
      if(Daily_3<Daily_5)
         if(Daily_5<Daily_8)
            if(Daily_8<Daily_10)
               if(Daily_10<Daily_12)
                  if(Daily_12<Daily_15)
                     if(Daily_15<Daily_30)
                        if(Daily_30<Daily_35)
                           if(Daily_35<Daily_40)
                              if(Daily_40<Daily_45)
                                 if(Daily_45<Daily_50)
                                    if(Daily_50<Daily_60)
                                       {
                                       D1_Bar=Time[1];
                                       D1_Bias="Daily is Down";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   // Check for Moving Averages Fanned up ON THE 4 HOUR TIME FRAME, creating an UP bias.  
    if(H4_Bias=="None") 
      if(Hour4_3<Hour4_5)
         if(Hour4_5<Hour4_8)
            if(Hour4_8<Hour4_10)
               if(Hour4_10<Hour4_12)
                  if(Hour4_12<Hour4_15)
                     if(Hour4_15<Hour4_30)
                        if(Hour4_30<Hour4_35)
                           if(Hour4_35<Hour4_40)
                              if(Hour4_40<Hour4_45)
                                 if(Hour4_45<Hour4_50)
                                    if(Hour4_50<Hour4_60)
                                       {
                                       H4_Bar=Time[1];
                                       H4_Bias="4 Hour is Down";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   // Check for Moving Averages Fanned down creating an DOWN bias.  
   if(D1_Bias=="Daily is Down" && H4_Bias=="4 Hour is Down" && H1_Bias=="None")
      if(CurrentSmallFish1<CurrentSmallFish2)
         if(CurrentSmallFish2<CurrentSmallFish3)
            if(CurrentSmallFish3<CurrentSmallFish4)
               if(CurrentSmallFish4<CurrentSmallFish5)
                  if(CurrentSmallFish5<CurrentSmallFish6)
                     if(CurrentSmallFish6<CurrentBigFish1)
                        if(CurrentBigFish1<CurrentBigFish2)
                           if(CurrentBigFish2<CurrentBigFish3)
                              if(CurrentBigFish3<CurrentBigFish4)
                                 if(CurrentBigFish4<CurrentBigFish5)
                                    if(CurrentBigFish5<CurrentBigFish6)
                                       {
                                       triggerBarTime=Time[1];
                                       H1_Bias="Down";
                                       Comment("Bias is: "+H1_Bias+" since: "+TimeToStr(triggerBarTime,TIME_DATE|TIME_MINUTES));
                                       H4_Bias="4 Hour is Down";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       D1_Bias="Daily is Down";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   ///////////////////////////////////////////////////////////////////////////////////////
   
   H1_high  = iHigh(NULL, PERIOD_H1, 1);
   H1_close = iClose(NULL, PERIOD_H1, 1);
   if(H1_Bias=="Down" && H4_Bias=="4 Hour is Down" && D1_Bias=="Daily is Down" && triggerBarTime+H1_high >= ema21 && H1_close < CurrentBigFish6)
      {
      OrderEntry(1); // Sell function is called.
      }
 
Irgendwelche Ideen?