Ea birden çok aynı bekleyen/limitli sipariş oluşturuyor [Yardım pls]

 

Merhaba, bir Ea yaptım, ancak teste geri döndüğümde, her bir onayda aynı bekleyen siparişleri oluşturuyor. Bunu nasıl durdurabilirim. Bir seferde sadece bir siparişe ihtiyacım var, onun kopyasına ihtiyacım yok.

Bu EA'yı saatlik grafikte " yalnızca açık fiyat " ile çalıştırırsam, kopya oluşturmaz.

Ayrıca, satın alma limiti başarısız olursa, benim cihazım ters ticaret seçeneğine sahiptir ve ardından satış ticaretini açar. Lütfen ayrıca doğru bir şekilde kurup kurmadığımı da bana bildirin. Herhangi bir yardım takdir edilecektir.

Zaman ayırdığınız için teşekkür ederim.

 // Main function//
if (condition)
   {
     if ( condition )
      {
       if ( BuyTicket == 0 )
      BuyCall(S0);
      }    
     if ( condition)
      {
       if ( BuyTicket == 0 )
      BuyCall(S1);
      }  

   etc etc... // many conditions
}

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
   if ( BuyTicket == 0 )
   {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend ( Symbol (),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit, "Buy limit Order" ,MagicNumber,expiration,Green);
   SellTicket = 0 ;

   // reverse trade//
     if ( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend ( Symbol (),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Order" ,MagicNumber, 0 ,Red);
        BuyTicket = 0 ;
     }    
   }
      
return (BuyTicket);
}
 
cashcube : Bunu nasıl durdurabilirim.
Nasıl düşünüyorsun? Yeni bir tane açmadan önce var olan bir tane var mı diye kontrol edersiniz.
 
WHRoeder :
cashcube : Bunu nasıl durdurabilirim.
Nasıl düşünüyorsun? Yeni bir tane açmadan önce mevcut olanı kontrol edersiniz.

O zaman ne yapmalı? buyticket == 0 & sellticket == 0 kodunu kaldır ?
 
EA'lar kurtarmak için kodlanmalıdır. Güç kesilirse, işletim sistemi çökerse, terminal veya çizelge yanlışlıkla kapatılırsa, bir sonraki tıklamada tüm statik/küresel bilet değişkenleri kaybolmuş olacaktır. Açık bir emriniz olacak ama bunu bilmiyorsunuz, bu yüzden EA asla onu kapatmaya, SL'yi takip etmeye çalışmayacak, vb. Nasıl kurtaracaksınız? Gerekli bilet numaralarını kurtarmak veya kalıcı olarak depolamak (GV/dosya) için bir OrderSelect döngüsü kullanın.
 
WHRoeder :
EA'lar kurtarmak için kodlanmalıdır. Güç kesilirse, işletim sistemi çökerse, terminal veya çizelge yanlışlıkla kapatılırsa, bir sonraki tıklamada tüm statik/küresel bilet değişkenleri kaybolmuş olacaktır. Açık bir emriniz olacak ama bunu bilmiyorsunuz, bu yüzden EA asla onu kapatmaya, SL'yi takip etmeye çalışmayacak, vb. Nasıl kurtaracaksınız? Gerekli bilet numaralarını kurtarmak veya kalıcı olarak depolamak (GV/dosya) için bir OrderSelect döngüsü kullanın.

Merhaba, kodu aşağıdaki şekilde değiştirip ekledim.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true)
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }

Hala her tik ile aynı siparişleri birden çok kez alıyor.

Artı eğer "!" imzala, o zaman herhangi bir işlem yapmıyor.

Son olarak, ana işlevimden buyticket & sellticket kontrolünü kaldırmam gerekir mi?

Teşekkür ederim

 
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
  1. kodu yapıştırma
    Video oynatmak
    Lütfen yayınınızı düzenleyin .
    Büyük miktarda kod için ekleyin.

  2. Asla if( (2+2 == 4) == true) yazmazsın , değil mi? if(2+2 == 4) yeterlidir. Bu nedenle if(bool == true) yazmayın, sadece if(bool) veya if( ! bool) kullanın. bool isLongEnabled gibi anlamlı değişken adları kullandığınızda kod kendi kendini belgeleyen hale gelir. Long_Entry, tetikleyici bir fiyat veya bilet numarası gibi görünür ve "uzun giriş varsa" eksik bir cümledir.
  3. BuyTicket'in kapanıp kapanmadığını nereden kontrol ediyorsunuz? Bilete göre seçim her zaman doğru olacaktır (geçerli bir bilet numarası verildiğinde), sipariş bekleyen, açık, kapalı veya silinmiş olabilir.
  4. OrderSelect döngüsü önerimi tamamen görmezden geldiniz.
 

Merhaba WHReder, cevabınız için teşekkür ederiz.

Evet, bunları SRC koduna ekledim. Ama editlediğimde görünmüyordu.

Önerdiğiniz gibi == doğru terimleri kaldırdım.

Lütfen beni yanlış anlama, bu orderselect döngüsünü anlamakta zayıf bir noktam var. göz ardı etmedim. Eklemeyi denedim, çok karmaşık olsa da, çalıştırırken 16 hata ve 2 uyarı gösteriyor. Bu kodda MN.Count nedir?

 // extern int     Magic.Number.Base          = ...
// int      magic.number.max;                   // Export to OpenOrder/MySelect
// string   market.pair;                        // Export to OpenOrder/MySelect
// int init(){
//    market.pair       = Symbol();
//    magic.number.max  = Magic.Number.Base + MN.COUNT - 1;

Satın alma biletini kontrol etme hakkında kapalı. Kontrol etmedim çünkü mevcut fiyatın buystoploss'un altında olup olmadığını kontrol ettim ve ardından alım satım kapandı. böylece satış emri açıldı.

 Bid < BuyStopLoss 

Saygılarımızla

 

Kodu biraz böyle düzenliyorum...Ama şimdi 2 hata gösteriliyor.."Myselect" & "MyOrdersTotal" sadece global kapsamda bildirilebilir.

 int BuyCall( double BC)
{  
//-----------code
bool MySelect( int iWhat, int eSelect, int ePool=MODE_TRADES){
   if (! OrderSelect (iWhat, eSelect, ePool) )   return ( false );
   int       mn = OrderMagicNumber();
   if (mn < MNB1              )   return ( false );
   if (mn > MNB2               )   return ( false );
   if (OrderSymbol()      != Pair   )   return ( false );
   if (ePool != MODE_HISTORY               )   return ( true );
   return (OrderType() <= OP_SELL); 
                                   
                                   
}
int MyOrdersTotal( int op=- 1 , int ePool=MODE_TRADES){   #define OP_ALL - 1
   if (ePool == MODE_TRADES)            iPos = OrdersTotal ()        - 1 ;
   else                                 iPos = OrdersHistoryTotal() - 1 ;
   for (nOrders= 0 ; iPos >= 0 ; iPos--) if (
      MySelect(iPos, SELECT_BY_POS, ePool)) if (
      op == OP_ALL || op == OrderType()
   )  nOrders++;
   return (nOrders);
}

   if (! OrderSelect (BuyTicket, SELECT_BY_TICKET))
    {      
   if ( BuyTicket == 0 )
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend ( Symbol (),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit, "Buy limit Order" ,MagicNumber,expiration,Green);
   SellTicket = 0 ;
   // counter trade//
     if ( Bid < BuyStopLoss && SellTicket == 0 )
     {  
         if (! OrderSelect (SellTicket, SELECT_BY_TICKET))
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend ( Symbol (),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Order" ,MagicNumber, 0 ,Red);
        BuyTicket = 0 ;
        }
     }    
  }
 }
      
return (BuyTicket);
}
 
Başka bir işlevin içinde bir işlev bildiremezsiniz
 
GumRai :
Başka bir işlevin içinde bir işlev bildiremezsiniz

O zaman bunu nasıl yapabilirim. Yani bir alım/satım emri açmak için tek tek kontrol etmem gereken birçok şartım var.

Bu yüzden kodu kolaylaştırmak için bir buycall/sellcall işlevi yaptım.

Onun sadece EA pek çok aynı esnaf alıyor. Bunu nasıl durduracağımı bilmiyorum.

 
GumRai :
Başka bir işlevin içinde bir işlev bildiremezsiniz

nakit küpü :

O zaman bunu nasıl yapabilirim. Yani bir alım/satım emri açmak için tek tek kontrol etmem gereken birçok şartım var.

Bu yüzden kodu kolaylaştırmak için bir buycall/sellcall işlevi yaptım.

Onun sadece EA pek çok aynı esnaf alıyor. Bunu nasıl durduracağımı bilmiyorum.

Her şeyden önce, başka bir işlevin içinde bir işlev bildirmeye çalışmayın.

Gönderdiğiniz koda bakarak ne yapmaya çalıştığınızı çözemiyorum. Bu yüzden sana yardım edemem.

Neden: