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

 
GumRai :

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.

burada açıklıyorum:

Her saat için maksimum 6 desteğim ve 6 direncim var. Her saat için 2 destek ve 2 direnç veya maksimum 6 destek ve 6 direnç dışında herhangi bir şey olabilir.

Her saat başında bu S/R seviyelerini limit emrini açmak istiyorum.

Toplam 12 S/R seviyesi için aynı alış/satış kodunu yazmama gerek kalmaması için bir satın alma işlevi ve bir satış işlevi oluşturdum.

Şimdi. bu aşağıdaki kodu kullandığımda:

 int SellCall( double SC)
{
   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 );
}

Birden çok aynı sipariş oluşturur:

Ben de WHRoeder kodunu kullandım. Ayrı bir fonksiyonda. Bir fonksiyon içinde fonksiyon ilan edemediğim için.

 

Sorununuz gönderdiğiniz işlev değil, sorununuz işlevi çağıran kodda.

Açıkçası, siparişlerin daha önce verilip verilmediğini görmek için bir kontrol yok.

 
GumRai :

Sorununuz gönderdiğiniz işlev değil, sorununuz işlevi çağıran kodda.

Açıkçası, siparişlerin zaten verilmiş olup olmadığını görmek için bir kontrol yok.

arama işlevi için kod (anlık görüntü)

 if (FS == 1 || FS == 5 || FS == 7 )
   {
     if ( P1 == 1 || P1 == 5 || P1 == 7 )
      {
      
      BuyCall(S0);
      }    
     if ( P2 == 1 || P2 == 5 || P2 == 7 )
      {
      
      BuyCall(S1);
      }  
     if ( P3 == 1 || P3 == 5 || P3 == 7 )
      {
  
      BuyCall(S2);
      }  
     if ( P4 == 1 || P4 == 5 || P4 == 7 )
      {
      
      BuyCall(S3);
      }      
          
     if ( P5 == 1 || P5 == 5 || P5 == 7 )
      {
     
      BuyCall(S4);
      }      
     if ( P6 == 1 || P6 == 5 || P6 == 7 )
      {
     
      BuyCall(S5);
      }  
     if ( P7 == 1 || P7 == 5 || P7 == 7 )
      {
      
      SellCall(R0);
      } 
     
       if ( P8 == 1 || P8== 5 || P8 == 7 )
      {
    
      SellCall(R1);
      }  
      
     if ( P9 == 1 || P9== 5 || P9 == 7 )
      {
      
      SellCall(R2);
      }          
          
     if ( P10 == 1 || P10== 5 || P10 == 7 )
      {
     
      SellCall(R3);
      }   
     if ( P11 == 1 || P11== 5 || P11 == 7 )
      {
     
      SellCall(R4);
      }                       
     if ( P12 == 1 || P12== 5 || P12 == 7 )
      {
       
      SellCall(R5);
      }            
          
    }
   

Siparişlerin verilip verilmediğini nasıl kontrol edebilirim? buyticket > 0 koşuluyla mı?

 
cashcube :

arama işlevi için kod (anlık görüntü)

Siparişlerin verilip verilmediğini nasıl kontrol edebilirim? buyticket > 0 koşuluyla mı?

Saatin sonunda tetiklenmemiş siparişlerle ne yaptığınızı ve tetiklenmiş siparişleri nasıl yönettiğinizi bilmediğim için tavsiye vermek zor.

Global olarak bildirilen bir dizi (veya 2) oluşturabilir ve açık siparişler için bilet numaralarını saklayabilirsiniz. Yeni bir sipariş açmadan önce, >0 değeri için düzeye karşılık gelen dizi öğesini kontrol edin.

Elbette bilet numaralarını da kontrol etmeniz gerekecek ve tetiklenmemiş siparişleri silerseniz dizi öğesini 0'a ayarlayın. Ayrıca siparişin kapanıp kapanmadığını kontrol etmeniz ve mantığınıza bağlı olarak yeniden ayarlamanız gerekebilir. 0

 
GumRai :

Saatin sonunda tetiklenmemiş siparişlerle ne yaptığınızı ve tetiklenmiş siparişleri nasıl yönettiğinizi bilmediğim için tavsiye vermek zor.

Global olarak bildirilen bir dizi (veya 2) oluşturabilir ve açık siparişler için bilet numaralarını saklayabilirsiniz. Yeni bir sipariş açmadan önce, >0 değeri için düzeye karşılık gelen dizi öğesini kontrol edin.

Elbette bilet numaralarını da kontrol etmeniz gerekecek ve tetiklenmemiş siparişleri silerseniz dizi öğesini 0'a ayarlayın. Ayrıca siparişin kapanıp kapanmadığını kontrol etmeniz ve mantığınıza bağlı olarak yeniden ayarlamanız gerekebilir. 0

Tetiklenmeyen siparişlerin son kullanma seviyelerini belirlediğimde, 0:59 veya 59. dakikada sona eriyor. Tetiklenmiş sipariş için SL & TP ayarlanır.

Daha önce saatte bir alım veya satım emri alan Ea'yı tasarlamıştım.. hiçbir problem kodu basit değildi. Ama burada çok zor görünüyor.

Tamam, dediğin gibi kodlamaya çalışacağım. Sorun çıkarsa buraya yazarım. Ayrıca bilet numarası saymak için basit bir kod örneği de paylaşırsanız iyi olur.

Öneriniz için teşekkür ederiz.

 

Aşağıdaki kodla sorunumu geçici olarak çözdüm ve onu Saatlik grafikte çalıştırdım. Basit

 //--- go trading only for first tiks of new bar
   if (Volume[ 0 ]> 1 ) return ( 0 );
 
Çubuklar güvenilmezdir (yenileme/yeniden bağlanma, çizelgedeki çubukların sayısını değiştirebilir) hacim güvenilmezdir (kayıp tikler) Daima süreyi kullanın. Yeni mum - MQL4 forumu
 
WHRoeder :
Çubuklar güvenilmezdir (yenileme/yeniden bağlanma, çizelgedeki çubukların sayısını değiştirebilir) hacim güvenilmezdir (kayıp tikler) Daima süreyi kullanın. Yeni mum - MQL4 forumu

Kod için teşekkürler. Tick fonksiyonuna ekledim. Ama şimdi benim EA herhangi bir işlem almıyor. Bekleyen emirler vermek için al/sat çağrısı işlevini kullandığım için. Bu işlevi işlevin içine ekleyemedim.

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{     
              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)
{ 
   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 );
}
       
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick (){
   static datetime timeCur; datetime timePre = timeCur; timeCur=Time[ 0 ];
   bool isNewBar = timeCur != timePre;
   if (isNewBar){ 
     return ; // Once per bar
   }
   return ; // every tick
}  

Herhangi bir fikir?

 

Ayrıca durdurulan siparişlerde ters ticaret de çalışmıyor.

 //-------------Reverse trade for buy
     for(xx =OrdersHistoryTotal()-1;xx >=0;xx --)
     {
         if ( OrderSelect (xx, SELECT_BY_POS,MODE_HISTORY))
         {
         if (OrderSymbol()== Symbol () && OrderMagicNumber()== MagicNumber)
           {
           //for buy order reverse
           if (OrderType()==OP_BUY && OrderProfit()< 0 ) // if last buy closed with loss
          { 
             //--- go trading only for first tiks of new bar
             if (Volume[ 0 ]> 1 ) return ( 0 );
            SellStopLoss = Bid + (StopLoss * CalcPoint1);
            SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
            SellTicket = OrderSend ( Symbol (),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit, "Sell Reverse Order" ,MagicNumber, 0 ,Red);
          }
         break ; 
          }
          }
     } 
 

Ters kodda herhangi bir vurgu var mı? neden çalışmıyor?

Teşekkür ederim.

Neden: