EA, AL ve SATIŞ siparişlerini karıştırıyor

 
Merhaba,

Bir EA kodlamaya çalışıyorum ve kodumun bir yerinde açık ve bekleyen siparişlerin stoploss'unu güncellemem gerekiyor. Siparişle ilgili bilgileri içeren bir uyarı görüntülüyorum.

Çalıştırdığımda, "Satın alma emri için Sayı: 2 Stoploss 1.44705: 46450421 orderType: 1" gibi bir mesaj alıyorum.

orderType: 1, 46450421 siparişinin bir OP_SELL siparişi olduğu anlamına gelir, öyledir, ancak neden "if ((orderType == OP_SELL) yerine "if ((orderType == OP_BUY || orderType == OP_BUYSTOP))" testini tetikliyor || orderType == OP_SELLSTOP))"?

 int orderType;
   for (cnt = total- 1 ; cnt >= 0 ; cnt--)
   {
       while (! OrderSelect (cnt, SELECT_BY_POS)) { Sleep ( 500 );}
      orderType = OrderType();
       if ( /*OrderMagicNumber()==Magic &&*/ OrderSymbol()== Symbol ())
      {      
         if ((orderType == OP_BUY || orderType == OP_BUYSTOP)) {
             if (!(isSLinTheZone && areBuyOrdersInProfitAt( NormalizeDouble (Low[ 1 ] - NbPipsTolerance* Point * 10 , Digits ))))
               if ( NormalizeDouble (OrderStopLoss(), Digits ) != longSL) { 
                   if (Debug) {
                     Alert ( "LongSL: " + longSL);
                     Alert ( "Order SL: " + NormalizeDouble (OrderStopLoss(), Digits ));
                     Alert ( "Modif required" );
                     Alert ( "Count: " + cnt + " Stoploss " + longSL + " for buy order: " + OrderTicket() + " orderType: " +OrderType());
                  }
                  OrderModify(OrderTicket(), OrderOpenPrice(), longSL, OrderTakeProfit(), 0 , Yellow );
                   //cnt = total-1;
               }
         }
         
         if ((orderType == OP_SELL || orderType == OP_SELLSTOP)) { 
             if (!(isSLinTheZone && areSellOrdersInProfitAt( NormalizeDouble (High[ 1 ] + NbPipsTolerance* Point * 10 + Spread* Point * 10 , Digits ))))
               if ( NormalizeDouble (OrderStopLoss(), Digits ) != shortSL) { 
                   if (Debug) {
                     Alert ( "ShortSL: " + shortSL);
                     Alert ( "Order SL: " + NormalizeDouble (OrderStopLoss(), Digits ));
                     Alert ( "Modif required" );
                     Alert ( "Count: " + cnt + " Stoploss " + shortSL + " for sell order: " + OrderTicket() + " orderType: " +OrderType());
                  }
                  OrderModify(OrderTicket(), OrderOpenPrice(), shortSL, OrderTakeProfit(), 0 , Yellow );
                   //cnt = total-1; 
               }
         }   
      } // end of if
   } // end of for


Lütfen yardım et :-)

Daniel
 

 
ubzen :


Gönderiyi güncelledim.
 

Yeni başlayanlar için Tamsayı temsillerini kullanmayı deneyin ve testi yeniden çalıştırın. Bunun sorununuzu çözüp çözmediğine bakın, o zaman bunun hakkında biraz daha konuşacağız. Düzenleme: Bunun ordertype'ın 0'dan başlayacağı gerçeğiyle bir ilgisi olduğunu düşünüyorum. Ve orderselect son seçilen siparişi yerinde tutacak.

 
ubzen :

Yeni başlayanlar için Tamsayı temsillerini kullanmayı deneyin ve testi yeniden çalıştırın. Bunun sorununuzu çözüp çözmediğine bakın, o zaman bunun hakkında biraz daha konuşacağız.

Hiçbir şeyi değiştirmedi. Anlamadığım şey, uyarı mesajında OrderType() öğesinin 1'e eşit olması, bu da onun bir satış emri olduğu anlamına geliyor. ve bu gerçekten bir satış emridir, ancak alış emrinin kodu yürütülür. Gerçekten kayboldum. Yukarıdaki kodda göründüğü gibi OrderSelect(...) true dönene kadar döngü yapmaya çalıştım. Belki de sırayı seçemeyeceğini düşündüm. Ama onunla ya da onsuz tam olarak aynı şeyi yapar.
 
ubzen :

Düzenleme: Bunun ordertype'ın 0'dan başlayacağı gerçeğiyle bir ilgisi olduğunu düşünüyorum. Ve orderselect son seçilen siparişi yerinde tutacak.

Olabilir . . .

orderType'ı olamayacağı bir şey olarak bildirmeyi deneyin. . . Örneğin

 int orderType = 10 ;

. . . sonra ne olduğunu görün, mesaj almazsanız sipariş seçiminiz çalışmıyor.

 
RaptorUK :

Olabilir . . .

orderType'ı olamayacağı bir şey olarak bildirmeyi deneyin. . . Örneğin

. . . sonra ne olduğunu görün, mesaj almazsanız sipariş seçiminiz çalışmıyor.


İlk bildirdiğimde tamamen aynı şekilde çalışır: int orderType = 10;

Ayrıca bir değişken bildirmek yerine her zaman OrderType() kullanmayı denedim, ancak aynı sorun var.

Ayrıca siparişi değiştirmeden hemen önce OrderSelect'i (...) aramaya çalıştım ama değişiklik olmadı.

 
Bunu arka test cihazında mı yoksa bir demo hesabında mı test ediyorsunuz?
 
ubzen :
Bunu arka test cihazında mı yoksa bir demo hesabında mı test ediyorsunuz?

Canlı test ediyorum. EA'yı bir çizelgeye koydum ve ne yaptığını görüyorum ve "Onay iste" onay kutusunu kullanıyorum.
 

Biraz Print() ekleyin; ifadeler, böylece neyin yanlış gittiğini görebilirsiniz. . . Örneğin

 if ( /*OrderMagicNumber()==Magic &&*/ OrderSymbol()== Symbol ())
      {      
         Print ( "orderType = " ,orderType);
         if ((orderType == OP_BUY || orderType == OP_BUYSTOP)) {

. . . ardından Uzmanlar sekmesine bir göz atın.

 
Sorunun maaşların manuel onayının kullanılmasından kaynaklanması mümkün mü?