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

 
cashcube :

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

Bunun güvenilmez olduğu size zaten söylendi

             if (Volume[ 0 ]> 1 ) return ( 0 );

Bu hiçbir şey yapmaz

//+------------------------------------------------------------------+
//| 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
}  

Yeni bir çubuksa geri dönersiniz, değilse de geri dönersiniz, böylece her zaman hiçbir şey yapmadan geri dönersiniz.

Yeni bir çubuk bulduğunuzda, değeri sıfırlamanız gerekir.

void OnTick (){
   datetime timeCur=Time[ 0 ]; 
   static datetime timePre = timeCur;
   bool isNewBar = timeCur != timePre;
   if (isNewBar){ 
     timePre=timeCur;
     //Do what you want at each new bar // Once per bar
   }
   //Do other stuff that you may need to do every tick
   return ; // every tick
}   

Son emri kontrol etme kodunuz, emir geçmişindeki en yüksek endeksin en son kapatılan işlemler olduğunu varsayar. Bunun her zaman doğru olup olmadığından emin değilim.

 

Tamam, kodu uyguladım...ama her yeni çubukta başlat işlevini çağırmaya çalıştığımda...herhangi bir sipariş almıyor...

 void OnTick (){
   datetime timeCur=Time[ 0 ]; 
   static datetime timePre = timeCur;
   bool isNewBar = timeCur != timePre;
   if (isNewBar){ 
     timePre=timeCur;
     //Do what you want at each new bar // Once per bar
start();
   }
   //Do other stuff that you may need to do every tick
   return ; // every tick
}   

Yeni çubuk bölgesi içine buyCall & sellcall işlevini eklesem bile...

 
OnTick() ve start()'a sahip olmamalısınız, bunun ne işe yarayacağını tahmin edemiyorum.
 
İşte EA için tam kod.
 // Init function
int init()
{

int CalcDigits = ( int )MarketInfo( Symbol (),MODE_DIGITS);

if (CalcDigits == 2 || CalcDigits == 4 ) CalcSlippage = SlippagePips;
else if (CalcDigits == 3 || CalcDigits == 5 ) CalcSlippage = SlippagePips * 10 ;      


if (CalcDigits == 2 || CalcDigits == 3 ) CalcPoint1 = 0.01 ;
else if (CalcDigits == 4 || CalcDigits == 5 ) CalcPoint1 = 0.0001 ;
      
UsePoint = CalcPoint;
UseSlippage = ( int ) CalcSlippage; 
return ( 0 );
}
//+------------------------------------------------------------------+

int start()
{

double open = iOpen( NULL , PERIOD_H1 , 0 );         // current candles Open
int CH = TimeHour( TimeCurrent ()); // current hour    
double LO = iOpen( NULL , PERIOD_H1 , 1 );
double LC = iClose( NULL , PERIOD_H1 , 1 );
  
//----------------------------  Calculation
double CalcDigits = MarketInfo( Symbol (),MODE_DIGITS);
      {
       if (CalcDigits == 2 || CalcDigits == 3 ) CalcPoint = 100 ;
       else if (CalcDigits == 4 || CalcDigits == 5 ) CalcPoint = 10000 ;
      }
           
///----------------------------------------------

FS = Split(open);

//-------- 2nd part of Calculation----------------//

S0 = open - ( double (FS)* CalcPoint1);
S1 = open - ( double ((FS* 2 ))* CalcPoint1);
S2 = open - ( double ((FS* 4 ))* CalcPoint1);
S3 = open - ( double ((FS* 8 ))* CalcPoint1); 
S4 = open - ( double ((FS* 16 ))* CalcPoint1);
S5 = open - ( double ((FS* 32 ))* CalcPoint1);
 
R0 = open + ( double (FS)* CalcPoint1);
R1 = open + ( double ((FS* 2 ))* CalcPoint1);
R2 = open + ( double ((FS* 4 ))* CalcPoint1);
R3 = open + ( double ((FS* 8 ))* CalcPoint1); 
R4 = open + ( double ((FS* 16 ))* CalcPoint1); 
R5 = open + ( double ((FS* 32 ))* CalcPoint1);  


//---------2nd part-------------------//
   P1 = Split(S0);
   P2 = Split(S1);
   P3 = Split(S2);
   P4 = Split(S3);
   P5 = Split(S4);
   P6 = Split(S5);
   P7 = Split(R0);
   P8 = Split(R1);
   P9 = Split(R2);
   P10 = Split(R3);
   P11 = Split(R4);
   P12 = Split(R5);

 //--------------------
   if (FS == P1 && LC > LO)  BuyCall(S0);
   if (FS == P2 && LC > LO)  BuyCall(S1);
   if (FS == P3 && LC > LO)  BuyCall(S2);
   if ( FS == P4 && LC > LO) BuyCall(S3);   
   if ( FS == P5 && LC > LO) BuyCall(S4);
   if ( FS == P6 && LC > LO) BuyCall(S5);
   if ( FS == P7 && LC < LO) SellCall(R0);
   if ( FS == P8 && LC < LO) SellCall(R1);
   if ( FS == P9 && LC < LO) SellCall(R2);
   if ( FS == P10 && LC < LO) SellCall(R3);
   if ( FS == P11 && LC < LO) SellCall(R4);                    
   if ( FS == P12 && LC < LO) SellCall(R5);     
 
   //-----------------End of experiment----------

//-------------------Reverse trade for Sell
     for (xxx =OrdersHistoryTotal()- 1 ;xxx >= 0 ;xxx --)
     {
         if ( OrderSelect (xxx, SELECT_BY_POS,MODE_HISTORY))
         {
         if (OrderSymbol()== Symbol () && OrderMagicNumber()== MagicNumber)
          
           //for sell order reverse
           if (OrderType()==OP_SELL && OrderProfit()< 0 )    
          { 
             if (OrderOpenPrice()== R0 || OrderOpenPrice()== R1 ||OrderOpenPrice()== R2 ||OrderOpenPrice()== R3 ||OrderOpenPrice()== R4 ||OrderOpenPrice()== R5 )
               {
      
            BuyStopLoss = Ask - (StopLoss * CalcPoint1);
            BuyTakeProfit = Ask + (TakeProfit * CalcPoint1);
            BuyTicket = OrderSend ( Symbol (),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit, "Buy Reverse Order" ,MagicNumber, 0 ,Green);
          }
           break ; 
          }
          }
          } 
   
   //-------------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 (OrderOpenPrice()== S0 || OrderOpenPrice()== S1 ||OrderOpenPrice()== S2 ||OrderOpenPrice()== S3 ||OrderOpenPrice()== S4 ||OrderOpenPrice()== S5 )
               {         
    
            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 ; 
          }
          }
          }
     } 

//------WHODER CODE for Order Close/Delete in every hour -------

for ( int pos = OrdersTotal ()- 1 ; pos >= 0 ; pos--) 
if ( OrderSelect (pos, SELECT_BY_POS)  &&  OrderMagicNumber() == MagicNumber &&  OrderSymbol() == Symbol () )
{   
     if (OrderType()==OP_SELL && OrderMagicNumber() == MagicNumber &&  OrderSymbol() == Symbol ())
     {
     int k = (TimeHour(( int )OrderOpenTime())* 60 ) + TimeMinute(( int )OrderOpenTime()); 
     int m = (TimeHour(( int ) TimeCurrent ())* 60 ) +  TimeMinute(( int ) TimeCurrent ());    
     if (m >= k+ 59 )
       bool closed = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(),UseSlippage,Blue);
     }
     //--------------
       if (OrderType()==OP_BUY && OrderMagicNumber() == MagicNumber &&  OrderSymbol() == Symbol ())
     {
     int k1 = (TimeHour(( int )OrderOpenTime())* 60 ) + TimeMinute(( int )OrderOpenTime()); 
     int m1 = (TimeHour(( int ) TimeCurrent ())* 60 ) +  TimeMinute(( int ) TimeCurrent ());    
     if (m1 >= k1+ 59 )
     bool closed = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(),UseSlippage,Blue);
    }        
}   

   
return ( 0 );
}

Bu başlatma işleviyle birlikte... ana işlevde çağrılan aşağıdaki ekstra işleve sahibim.

int bölme(çift x)

geçersiz BuyCall(çift BC)

geçersiz SellCall(çift SC)

& son olarak void onTick işlevi hakkında kafam karıştı...bunu bir şekilde nasıl ayarlayabilirim..bekleyen siparişleri tık tık tekrar etmeyecek

..her saat içinde yalnızca bir dizi bekleyen sipariş...artı bekleyen herhangi bir siparişin durdurulup durdurulmadığını kontrol eder

..sonra ters yönde başka bir işlem açılacaktır..ama saatte sadece bir sıra.

Lütfen aynı alanda tekrar tekrar takılıp kalmaya yardım edin...ama belli ki öğrenmek istiyor...böylece gelecekte aptalca sorular sormama gerek kalmaz

...kavramımı temizlemek istiyorum.. :(

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

 
Bu, her onay için bir değer atamaz, yalnızca yükte bir kez.
 static datetime timePre = timeCur;
basitleştirmek
 void OnTick (){
   static datetime timeCur;
   datetime timePre = timeCur; timeCur=Time[ 0 ]; 
   bool isNewBar = timeCur != timePre;