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

 
GumRai :

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.

Hızlı cevabınız için teşekkürler GumRai. Programımın aşağıdaki gibi birçok koşulu var. P12'ye kadar kontrol ettim. Pivot gibi. Koşullar uygunsa, P1, P2,..... seviyelerinde limitli işlemler açar, çünkü sayısı 12'dir. Her durumda alım/satım kodu yazmak istemedim. Bu nedenle ayrı buycall/sellcall işlevleri yapılmıştır. Satmak için eski kodumun altında.

     if ( P1 == 1 || P1 == 5 || P1 == 7 )
      {
       if ( BuyTicket == 0 )
      BuyCall(S0);
      }    
     if ( P2 == 1 || P2 == 5 || P2 == 7 )
      {
       if ( BuyTicket == 0 )
      BuyCall(S1);
      }  
         .......................many more
 
int SellCall( double SC)
{

if (! OrderSelect (SellTicket, SELECT_BY_TICKET))
  {    
   if ( SellTicket == 0 )
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend ( Symbol (),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Limit Order" ,MagicNumber,expiration,Red);
   BuyTicket = 0 ; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0 )
   {   if (! OrderSelect (BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend ( Symbol (),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit, "Buy Order" ,MagicNumber, 0 ,Green);
       SellTicket = 0 ;
       }
   }
  } 
 }
   return (SellTicket);
}
 

Bu örnek. Her kene üzerinde aynı ticaret yerleştirme. Bunu her saat başı yerleştirmem gerekiyor. Saatlik bir pivot olarak.

 
int SellCall( double SC)
{

if (! OrderSelect (SellTicket, SELECT_BY_TICKET))
  {    
   if ( SellTicket == 0 )
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend ( Symbol (),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Limit Order" ,MagicNumber,expiration,Red);
   BuyTicket = 0 ; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0 )
   {   if (! OrderSelect (BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend ( Symbol (),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit, "Buy Order" ,MagicNumber, 0 ,Green);
       SellTicket = 0 ;
       }
   }
  } 
 }
   return (SellTicket);
}

Bir satış limiti açtığınızda BuyTicket'i 0 olarak ayarlarsınız.

Sonra BuyTicket==0 olup olmadığını kontrol edin, tabii ki öyle, şimdi ayarladınız.

Ardından SellTicket'i 0'a ayarlarsınız.

Sonraki tik, Sellticket==0 böylece bir satış limiti açar ve BuyTicket'i tekrar 0'a ayarlarsınız.

Ve benzeri vb............

 
GumRai :

Bir satış limiti açtığınızda, BuyTicket'i 0'a ayarlarsınız.

Sonra BuyTicket==0 olup olmadığını kontrol edin, tabii ki öyle, şimdi ayarladınız.

Ardından SellTicket'i 0'a ayarlarsınız.

Sonraki tik, Sellticket==0 böylece bir satış limiti açar ve BuyTicket'i tekrar 0'a ayarlarsınız.

Ve benzeri vb............

O zaman vurguladığın iki satırı kaldırmalı mıyım? Ben bunu yaptım. Şimdi 2 aylık veri geri testi için sadece bir saatlik sonuç gösteriliyor.

Fark ettiğim başka bir şey, satış çağrımda satın almada ters ticaretim var. Satış ticareti durdurulursa, alım ticareti açılacaktır. Şimdi sellcall işlevi için döner (Selltickets), yani tamam mı?

Teşekkür ederim

 

 int SellCall( double SC)
{

if (! OrderSelect (SellTicket, SELECT_BY_TICKET))
  {    
   if ( SellTicket == 0 )
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend ( Symbol (),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Limit Order" ,MagicNumber, 0 ,Red);
   
   // reverse tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0 )
   {   if (! OrderSelect (BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend ( Symbol (),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit, "Buy Order" ,MagicNumber, 0 ,Green);
       
       }
   }
 } 
 }
   return (SellTicket);

Şimdi bu kodda anlıyorum, önce satış biletini kontrol ediyor == 0 evet bariz, sonra satış emri verdi, sonraki buyticket == 0 evet, sonraki yerler satın alma emri...ama geri döndüğünde...tekrar satış biletini kontrol et == 0 , hayır şimdi değil... bu yüzden Ea bir set aldıktan sonra durdu. Ama bu sorun nasıl kaldırılır. EA'mda, etkin olmayan bekleyen siparişler, başlangıç saatinden itibaren her 59 dakikada bir silinir. Ben o şekilde ayarladım.

 

Şimdi kodu şu şekilde değiştirdim, tüm destek ve dirençleri okuyor.

Bir saat boyunca maksimum 6 desteğim ve 6 direncim var. Bu 6'sı şartları sağlıyorsa, o zaman o 6'da limit emirleri açar. Algo bu.

Bu yüzden fonksiyon çağrısı için kodu aşağıdaki şekilde ayarladım.

 int BuyCall( double BC)
{  
      
if ( BuyTicket >= 0 && BuyTicket <= 5 )
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend ( Symbol (),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit, "Buy limit Order" ,MagicNumber, TimeCurrent ()+ 3540 ,Green);
    
   }   
return ( 0 );
}

int SellCall( double SC)
{
  
 if ( SellTicket >= 0 && SellTicket <= 5 )
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend ( Symbol (),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Limit Order" ,MagicNumber, TimeCurrent ()+ 3540 ,Red);
  
   } 
   return ( 0 );
}

Şimdi bir saat çalışır ve her alım/satım için 6 seviyeyi kontrol eder. Ama sadece bir saat çalışır. Tam veri seti için mükemmel bir şekilde çalıştırmak için burada yapılması gerekenler.

 
if ( BuyTicket >= 0 && BuyTicket <= 5 )

Bu sadece strateji test cihazında çalışacak ve ilk 6 sipariş açıldıktan sonra başka bir şey yapmayacak.

Bu şekilde bir test için bilet numarası kullanamazsınız

 
GumRai :

Bu sadece strateji test cihazında çalışacak ve ilk 6 sipariş açıldıktan sonra başka bir şey yapmayacak.

Bu şekilde bir test için bilet numarası kullanamazsınız

Cevabın için teşekkürler.

O zaman ne yapmalıyım. BuyTicket =>0 veya herhangi bir BuyTicket koşulunu kaldırırsam. Sonra EA her tik ile aynı esnaf alıyor .....Bana 148 sipariş sonu hatası veriyor.

 
cashcube : O zaman ne yapmalıyım.
Daha önce cevaplandı.
 
cashcube :

Cevabın için teşekkürler.

O zaman ne yapmalıyım. BuyTicket =>0 veya herhangi bir BuyTicket koşulunu kaldırırsam. O zaman EA her tik ile aynı işlemleri yapıyor.....Bana 148'lik emir sonlandırma hatası veriyor.

ne yapmaya çalıştığını bilmiyoruz

Bir seferde yalnızca bir açık işlem istiyorsanız, yeni bir tane göndermeden önce açık emir olup olmadığını kontrol edin .

Çubuk başına yalnızca bir ticaret istiyorsanız, çubuk başına yalnızca bir kez test edin

Koşulların bir kombinasyonunu istiyorsanız, kombinasyonu test edin.

Neden: