EA kollidiert bei Verwendung mehrerer Paare...

 
Zunächst einmal weiß ich, Raptor, dass Sie dieses Problem mit mir vor angesprochen haben, aber ich kann mich nicht erinnern, wo Sie es geschrieben haben, und, was noch wichtiger ist, verstehen, wo ich falsch gehe?

Soweit ich weiß, habe ich es richtig geschrieben, so dass der EA, der an ein entsprechendes Paar angehängt ist, immer nur auf diesem Paar arbeiten kann. Im Moment habe ich bemerkt, dass GBPCAD und GBPUSD scheinen nicht auf, was bedeutet, dass die GBPCAD Stoploss denkt, dass es die Berechnung durch das GBPUSD-Paar getan wird... so, wenn eine schwebende Bestellung ausgelöst wird, flackert der Stop Loss von GBPCAD Werte zu Kabel....

Ich verwende magicnumber==1234;

Irgendwelche Vorschläge oder Bereiche, in denen ich mich wie ein Idiot verhalte, können Sie gerne hervorheben :(

//+-------------------------------------------------------------------------------------+
//| Order Buy Function                                                                  |
//+-------------------------------------------------------------------------------------+   

//Place a pending buystop if no orders exists.. pending or otherwise.
if(direction==0)
{ 
      double btp=buy_takeprofit_price;
      
      double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);

      double Lot_Step = MarketInfo(Symbol(),MODE_LOTSTEP);

      double BuyLotSize =(RiskedAmount/(pips_to_bsl/pips))/10;
      double Lots = NormalizeDouble(BuyLotSize,2);
      LotSize = MathFloor(Lots/Lot_Step)*Lot_Step;

  
      static double Stored_BuyPrice;

      if(OpenOrdersThisPair(Symbol())==0)
         {
         int BuyTicketOrder= OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);  >>>>// I am not sure if its this part? There is no way for this first OrderSend to tell what pair it is?
         if(BuyTicketOrder == -1)Print("First Buy Order Last Error = ",GetLastError());
         } 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(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==True)// 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());
            }
      }
} 
 
DomGilberto:
Zunächst einmal weiß ich, Raptor, dass Sie dieses Problem schon einmal mit mir besprochen haben, aber ich kann mich nicht erinnern, wo Sie es geschrieben haben, und, was noch wichtiger ist, ich verstehe nicht, was ich falsch mache.

Soweit ich weiß, habe ich es richtig geschrieben, so dass der EA, der an ein entsprechendes Paar angehängt ist, immer nur auf diesem Paar arbeiten kann. Im Moment habe ich bemerkt, dass GBPCAD und GBPUSD scheinen nicht auf, was bedeutet, dass die GBPCAD Stoploss denkt, dass es die Berechnung durch das GBPUSD-Paar getan wird... so, wenn eine schwebende Bestellung ausgelöst wird, flackert der Stop Loss von GBPCAD Werte zu Kabel....

Ich verwende magicnumber==1234;

Irgendwelche Vorschläge oder Bereiche, in denen ich mich wie ein Idiot verhalte, können Sie gerne hervorheben :(

Ihr Problem ist klar, aber kann ein wenig schwer zu sehen, weil die Art und Weise Sie Klammern Einrücken und Bedingungen verwenden. . Sie tun dies:

      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())                                  // if the symbol matches do . . . 
                   if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR)   //  . . . .  this
                        {
                        Stored_BuyPrice = OrderOpenPrice();                 // and this
                        DeleteOrder = OrderDelete(OrderTicket());           // and this
                        }

         if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order.   //  this happens even if the symbol didn't match . . .
            {
            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());
            }
      }

Ich glaube, Sie meinten dies...

     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());
               }
            }
         }
 
Ah ok - so eine kleine Sache habe ich da übersehen. Auch, wenn die erste OrderSend() Funktion aufgerufen wird, mache ich dort etwas falsch? Ich frage das, weil ich versuche, logisch darüber nachzudenken, ob es zu diesem Zeitpunkt weiß, an welches Paar die Bestellung gesendet werden soll? Das mag eine dumme Frage sein, aber ich mache doch nichts falsch mit diesem Teil, oder? Der Teil der "BuyTicketOrder"-Sendefunktion?

Danke, dass Sie diesen Teil für mich entdeckt haben :)
 
DomGilberto:
Ah ok - so eine kleine Sache habe ich da übersehen. Auch, wenn die erste OrderSend() Funktion aufgerufen wird, mache ich dort etwas falsch? Ich frage das, weil ich versuche, logisch darüber nachzudenken, ob es zu diesem Zeitpunkt weiß, an welches Paar die Bestellung gesendet werden soll? Das mag eine dumme Frage sein, aber ich mache doch nichts falsch mit diesem Teil, oder? Der Teil der "BuyTicketOrder"-Sendefunktion?

Danke, dass Sie diesen Teil für mich entdeckt haben :)
Symbol() ist das Symbol des Charts, auf dem der EA läuft ... er kann sich nicht irren, es kann nur ein Symbol sein
 
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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);

//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.
   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_BUY)
               {
                 if(OrderStopLoss() > BuyStopPrice)break; 
                  if(OrderStopLoss() < BuyStopPrice)
                    bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(BuyModify < 0)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.     
   for(int s=OrdersTotal()-1; s>=0; s--)
     {
      if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_SELL)
               {
                 if(OrderStopLoss() < SellStopPrice)break; 
                   if(OrderStopLoss() > SellStopPrice)
                    bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(SellModify < 0)Print(" Sell Trailing Stop Failed: ", GetLastError());
               }   
     }

  }
Ok - ich denke, das ist, was das Problem verursacht wurde. Ich habe soeben den Code auf diesem Teil aktualisiert und es scheint jetzt gestoppt zu haben Flicking auf jeden Tick von Kabel zu GBPCAD Preise... Es ist jetzt auf einem Stop-Preis stecken, bis es sich auf dieser stündlichen schließen aktualisieren wird ... so werde ich bestätigen.

Scheint das ok für Sie? Auch, weil ich diese partielle Bestellung schließt, ich nehme an, ich muss wahrscheinlich doppelt überprüfen, dass die geschweiften Klammern in der richtigen Position relativ zu "OrderSymbol()==Symbol())" sind?
 
if(OpenOrdersThisPair(Symbol()) == 0
Wie oft wollen Sie dies aufrufen? Für jede Bestellung (Ihr Code)? Für jede schwebende Order auf dem aktuellen Chart (RaptorUKs Code)? Oder EINMAL, NACHDEM Sie die Pending-Order gespeichert und gelöscht haben?
 
DomGilberto:
Ok - ich glaube, das war die Ursache des Problems. Ich habe soeben den Code in diesem Teil aktualisiert und es scheint nun nicht mehr bei jedem Tick von Cable zu GBPCAD Kursen zu flicken... Es ist jetzt auf einem Stop-Preis stecken, bis es sich auf dieser stündlichen schließen aktualisieren wird ... so werde ich bestätigen.

Scheint das ok für Sie? Auch, weil ich diese partielle Bestellung schließt, ich nehme an, ich muss wahrscheinlich doppelt überprüfen, dass die geschweiften Klammern in der richtigen Position relativ zu "OrderSymbol()==Symbol())" sind?

Es sieht gut aus, ja, überprüfen Sie immer Ihre Klammern, und machen Sie sich das Leben leichter, wo immer Sie können, wenn das bedeutet, Klammern hinzuzufügen, dann tun Sie das, aber versuchen Sie, mit Klammern und Einrückungen konsistent zu sein.

Sie brauchen nicht zwei Schleifen, eine reicht aus.

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//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());
                  }
               }   
     }

OrderModify() gibt ein bool zurück, true oder false, nicht einen int . . . so SellModify wird nie kleiner als 0 sein . . . Das Gleiche habe ich gestern bei ForexFactory geschrieben.

 

Jedes Mal, wenn die Order gelöscht wurde - ich möchte, dass die schwebende Order JEDEN 1-Stunden-Balkenschluss gelöscht wird und dann eine neue Order entweder mit denselben Parametern ODER, falls zutreffend, mit neuen Stopps, Zielen und Losgrößen basierend auf "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "

Das Einzige, was ich für die NEUE schwebende Order (nach dem Löschen) speichern muss, ist der anfängliche Einstiegskurs für dieses bestimmte Set-up.(Gespeicherter_BuyPrice = OrderOpenPrice();)


Es ist witzig, denn der erste Teil des obigen Codes steht auch im Zusammenhang mit einem anderen Thema, das ich gerade veröffentlichen wollte. Anstatt ein neues Thema mit einer ähnlichen Frage zu eröffnen, werde ich sie hier stellen, wenn das ok ist? Schauen Sie sich den Link unten - nur ein paar Minuten Video erklärt das Problem, das ich habe und finde es schwer zu lösen ...

Ich habe so viel Code geschrieben, aber ich beginne jetzt zu erkennen, dass es ein Fall von Ineffizienz ist, den ich reparieren muss...

Video: http://screencast.com/t/4nl8AaH8Sag

Wenn ich mich mit dem wenigen Code, den ich zur Verfügung gestellt habe, nicht ganz klar ausgedrückt habe, werde ich etwas mehr hinzufügen.

 
Danke Raptor - Ja, das ist mir gerade aufgefallen. Ich habe einige Zeit damit verbracht, meinen Code zu bereinigen, da es ein Chaos war. Amateur-Fehler wie der Versuch, Prints wie das Beispiel, das Sie oben lol gab zu verwenden.
 
DomGilberto:

Jedes Mal, wenn die Order gelöscht wurde - ich möchte, dass die schwebende Order JEDEN 1-Stunden-Balkenschluss gelöscht wird und dann eine neue Order entweder mit denselben Parametern ODER, falls zutreffend, mit neuen Stopps, Zielen und Losgrößen basierend auf "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "

Das Einzige, was ich für die NEUE schwebende Order (nach dem Löschen) speichern muss, ist der anfängliche Einstiegskurs für dieses bestimmte Set-up.(Gespeicherter_BuyPrice = OrderOpenPrice();)


Es ist witzig, denn der erste Teil des obigen Codes steht auch im Zusammenhang mit einem anderen Thema, das ich gerade veröffentlichen wollte. Anstatt ein neues Thema mit einer ähnlichen Frage zu eröffnen, werde ich sie hier stellen, wenn das ok ist? Schauen Sie sich den Link unten - nur ein paar Minuten Video erklärt das Problem, das ich habe und finde es schwer zu lösen ...

Ich habe so viel Code geschrieben, aber ich beginne jetzt zu erkennen, dass es ein Fall von Ineffizienz ist, den ich reparieren muss...

Video: http://screencast.com/t/4nl8AaH8Sag

Wenn ich mich mit dem wenigen Code, den ich zur Verfügung gestellt habe, nicht ganz klar ausgedrückt habe, werde ich etwas mehr hinzufügen.

Korrigieren Sie mich, wenn ich falsch verstanden habe ... aber für die meisten der Bars im Video haben Sie keinen Pullback zum 21 EMA bekommen
 
Sorry - Das ist 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 zu den 21 EMA EINMAL, und dann von dort wird es eine Bestellung über die Hochs und ein Stop unter dem 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). Hoffe, das ist klarer?