MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 612

 
Sipariş tipini taik değeri ile kontrol ediyorsunuz, böylece her şey doğru ve koşul asla yerine getirilmeyecek.
 

Herhangi bir emir kapandığında diğer tüm bekleyen emirleri kapatan bir kod yazdım ama sorun şu ki 4 emir 2, 3, 4, 5 sırayla yazdım yani bir sonraki emirler 6, 7, 8, vb. Açılacak. sonra kapanmazlar. Kırmızı renkte vurgulanan sipariş sayıları, bekleyen tüm siparişlerin kapatılacağı siparişlerle değiştirilmelidir.

geçersiz başlangıç(){

//----

double Take1 = Sor+20 *Puan;

double Take2 = Sor+0 *Puan;

double Take3 = Sor-20 *Puan;

double Take4 = Sor-40 *Puan;

çift Al5 = 60 sor *Puan;

double Stop = Bid-StopLoss*Point;

if(OrdersTotal()==0){

OrderSend(Symbol(),0,0.01,Sor,30,Dur,Al1,"",0,0,CLR_NONE);

OrderSend(Symbol(),2,0.02,Sor-20*Puan,30,Dur,Al2,"",0,0,CLR_NONE);

OrderSend(Symbol(),2,0.04,Sor-40*Puan,30,Dur,Al3,"",0,0,CLR_NONE);

OrderSend(Symbol(),2,0.08,Ask-60*Puan,30,Dur,Al4,"",0,0,CLR_NONE);

OrderSend(Symbol(),2,0.16,Ask-80*Puan,30,Dur,Al5,"",0,0,CLR_NONE);

}


if(SiparişToplam()==4)

{

SiparişSil( 2 );

}

if(SiparişToplam()==3)

{

SiparişSil( 3 );

}

if(SiparişToplam()==2)

{

SiparişSil( 4 );

}

if(SiparişToplam()==1)

{

SiparişSil( 5 );

dönüş(0);

}

 
SanNneK :

Herhangi bir emir kapandığında diğer tüm bekleyen emirleri kapatan bir kod yazdım ama sorun şu ki 4 emir 2, 3, 4, 5 sırayla yazdım yani bir sonraki emirler 6, 7, 8, vb. Açılacak. sonra kapanmazlar. Kırmızı renkte vurgulanan sipariş sayıları, bekleyen tüm siparişlerin kapatılacağı siparişlerle değiştirilmelidir.

İlk olarak, OrdersHistoryTotal'a ihtiyacımız olan pozisyonun yakın zamanda kapatılıp kapatılmadığını döngüde kontrol ediyoruz. Pozisyon kapatma zamanını kontrol ettiğimiz yerde OrderCloseTime , değişkendeki sondan büyükse, tüm açık OrdersTotal arasında döngü yapın. Ve onları kapatıyoruz.

PS Kodu Alt + S veya simge aracılığıyla girin

örneğin bu

   // retrieving info from trade history
   int i,accTotal= OrdersHistoryTotal ();
   for (i= 0 ;i<accTotal;i++)
    {
     //---- check selection result
     if ( !OrderSelect (i, SELECT_BY_POS , MODE_HISTORY ))
       {
         Print ( "Ошибка при доступе к исторической базе (" , GetLastError (), ")" );
         break ;
       }
     // работа с ордером ...
    }
 
extern string TimeStart    = "04:00" ;   //Время начала контрольного периода
extern string TimeEnd      = "09:00" ;   //Время окончания контрольного периода
extern string TimeCloseOrder = "23:30" ; //Время в которое происходит закрытие всех ордеров
extern double LOT          = 0.1 ;
extern int     Magic        = 777 ;
extern double K_martin     = 2 ;
extern bool    No_Loss      = true ;
int slippage = 3 ;
double marga,Lot,SL,TP;
int tip,Orders,tipOrders,TradeDey;
//-------------------------------------------------------------------+
int init()
{
   if ( Digits == 5 || Digits == 3 ) slippage = 30 ;
}
int start()
{
   datetime Time_Start      = StrToTime ( StringConcatenate ( Day (), "." , Month (), "." , Year (), " " ,TimeStart,     ":00" ));
   datetime Time_End        = StrToTime ( StringConcatenate ( Day (), "." , Month (), "." , Year (), " " ,TimeEnd,       ":00" ));
   datetime Time_CloseOrder = StrToTime ( StringConcatenate ( Day (), "." , Month (), "." , Year (), " " ,TimeCloseOrder, ":00" ));

   if (Time_CloseOrder>Time_End) if ( CurTime ()>=Time_CloseOrder) CLOSEORDERS();

   int tip;
   if (Orders> OrdersTotal ()) tip=CloseOrder();
   Orders= OrdersTotal ();

   if (ORDERS( 0 )== 0 && tip== 0 && ( CurTime ()<Time_CloseOrder || Time_CloseOrder<=Time_End) && TradeDey!= TimeDay ( CurTime ()))
   {
       int BarStart = iBarShift ( NULL , 0 ,Time_Start, false );
       int BarEnd   = iBarShift ( NULL , 0 ,Time_End  , false );
       double Max_Price= iHigh ( NULL , 0 , iHighest ( NULL , 0 , MODE_HIGH ,BarStart-BarEnd,BarEnd));
       double Min_Price= iLow ( NULL , 0 , iLowest ( NULL , 0 , MODE_LOW , BarStart-BarEnd,BarEnd));
   
       if ( TimeCurrent ()>Time_End && ObjectFind ( "bar0" +Time_End)==- 1 )
      {
         ObjectCreate ( "bar0" +Time_End, OBJ_RECTANGLE , 0 , 0 , 0 , 0 , 0 );
         ObjectSet    ( "bar0" +Time_End, OBJPROP_STYLE , STYLE_SOLID );
         ObjectSet    ( "bar0" +Time_End, OBJPROP_COLOR , Blue);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_BACK ,   true );
         ObjectSet    ( "bar0" +Time_End, OBJPROP_TIME1 ,Time_Start);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_PRICE1 ,Max_Price);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_TIME2 ,Time_End);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_PRICE2 ,Min_Price);
      }
      
       if ( Bid >Max_Price) OrderSend ( Symbol (), OP_BUY ,LOT, Bid ,slippage,Min_Price,
         NormalizeDouble ( Ask + Max_Price-Min_Price, Digits ), "BreakdownLevel" ,Magic,Blue);
       if ( Bid <Min_Price) OrderSend ( Symbol (), OP_SELL ,LOT, Bid ,slippage,Max_Price,
         NormalizeDouble ( Bid - Max_Price+Min_Price, Digits ), "BreakdownLevel" ,Magic,Blue);
       return ;
   }
   if (No_Loss) No_Loss();
   if (tip== 1 && TradeDey!= TimeDay ( CurTime ()))
   {
      Lot=Lot*K_martin;
       if (tipOrders== 0 ) OrderSend ( Symbol (), OP_SELL ,Lot, Bid ,slippage,SL,TP, "Nevalyashka" ,Magic,Blue);
       if (tipOrders== 1 ) OrderSend ( Symbol (), OP_BUY ,Lot, Ask ,slippage,SL,TP, "Nevalyashka" ,Magic,Blue);
   }
   return ( 0 );
}
//-------------------------------------------------------------------+
int CloseOrder()
{
   string txt;
   double loss;
   int i= OrdersHistoryTotal ()- 1 ;
   if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )== true )
   {                                     
       if ( OrderSymbol ()== Symbol () && Magic== OrderMagicNumber ())
      {
         tipOrders= OrderType ();
         Lot= OrderLots ();
         loss = MathAbs ( OrderProfit ()/ MarketInfo ( Symbol (), MODE_TICKVALUE )/Lot/K_martin);
         if (tipOrders== 0 )
         {
            TP= NormalizeDouble ( Bid - loss* Point , Digits );
            SL= NormalizeDouble ( Ask + loss* Point , Digits );
         }
         if (tipOrders== 1 )
         {
            SL= NormalizeDouble ( Bid - loss* Point , Digits );
            TP= NormalizeDouble ( Ask + loss* Point , Digits );
         }
         if ( OrderClosePrice ()== OrderTakeProfit () || OrderProfit ()>= 0 ) TradeDey= TimeDay ( CurTime ());
         if ( OrderClosePrice ()== OrderStopLoss ()) return ( 1 );
      }
   }  
   return ( 0 );
}
//+-----------------------------------------------------------------+
int ORDERS( int tip)
{
   int N_Sell,N_Buy;
   for ( int i= 0 ; i< OrdersTotal (); i++)
   {                                               
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true )
      {
         if ( OrderSymbol ()== Symbol () && Magic== OrderMagicNumber ())
         {
             if ( OrderType ()== OP_BUY ) N_Buy++;
             if ( OrderType ()== OP_SELL ) N_Sell++;
         }
      }   
   }
if (tip== 0 ) return (N_Buy+N_Sell);
if (tip== 1 ) return (N_Buy);
if (tip==- 1 ) return (N_Sell);
}                  
//-------------------------------------------------------------------+
void No_Loss()
{
   int tip;
   double TP,OOP;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) 
   {
       if ( OrderSelect (i, SELECT_BY_POS )== true )
      {
         tip = OrderType ();
         if (tip< 2 && OrderSymbol ()== Symbol ())
         {
             if ( OrderMagicNumber ()!=Magic) continue ;
            TP = OrderTakeProfit ();
            OOP = OrderOpenPrice ();
             if (tip== 0 ) //Bay               
            {  
               if ( OrderStopLoss ()> OrderOpenPrice ()+ Ask - Bid ) return ;
               if ((TP-OOP)/ 2 +OOP<= Bid )
               OrderModify ( OrderTicket (),OOP, NormalizeDouble (OOP+ Ask - Bid , Digits ),TP, 0 ,White);
            }                                         
             if (tip== 1 ) //Sell               
            {                                         
               if ( OrderStopLoss ()< OrderOpenPrice ()- Ask + Bid ) return ;
               if (OOP-(OOP-TP)/ 2 >= Ask )
               OrderModify ( OrderTicket (),OOP, NormalizeDouble (OOP- Ask + Bid , Digits ),TP, 0 ,White);
            } 
         }
      }
   }
}
//------------------------------------------------------------------+
void CLOSEORDERS()
{
   bool error;
   int err;
   while ( true )
   {  error= true ;
       for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
      {                                               
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true )
         {
             if ( OrderSymbol ()!= Symbol ()||Magic!= OrderMagicNumber ()) continue ;
             if ( OrderType ()== OP_BUY )
               error= OrderClose ( OrderTicket (), OrderLots (), Bid , 3 ,CLR_NONE);
             if ( OrderType ()== OP_SELL )
               error= OrderClose ( OrderTicket (), OrderLots (), Ask , 3 ,CLR_NONE);
         }   
      }
       if (!error) {err++; Sleep ( 2000 ); RefreshRates ();}
       if (error || err > 5 ) return ;
   }
}
//-------------------------------------------------------------------+
Buradaki soru, artan lotla açılan siparişlerde, bazı nedenlerden dolayı TP ve SL'nin değişmesiyle, kar al ve zararı durdur ile ilgili bir sorun var. Ve lotları arttırır ve TP ile kapatmak, kayıp miktarını iade etmenize izin vermez. Bu neden oluyor, yanlış olan ne?
 
Merhaba, fonksiyonu yazmadım. Robot, ArraySort işlevi için bir hata yanlış başlangıç konumu 0 yazıyor. Düzeltmeme ve işlevi açıklamama yardım ederseniz minnettar olurum.
 void MaxMinProfit()
{
int i, N, MaxTic, MinTic;
double    MinProf= 0 , MaxProf= 0 , OP, g, a[][ 2 ];
string MinSym, MaxSym;
ArrayResize (a, 0 );
 
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) 
  {    
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) 
    { 
     if ( OrderType ()== OP_SELL ||   OrderType ()== OP_BUY )
      {
       OP = NormalizeDouble ( OrderProfit ()+ OrderSwap ()+ OrderCommission (), 2 );
       
       if (MinProf>OP) 
      {
       
          MinProf=OP;
          MinTic= OrderTicket ();
          MinSym= OrderSymbol ();
          
         }
         
       if (OP> 0 ) 
      {
       
          N++;
             ArrayResize (a, N);
            a[N- 1 ][ 0 ]=OP;
            a[N- 1 ][ 1 ]= OrderTicket ();
          
         }
         
         }
         }
         
         }
         
       ArraySort (a, WHOLE_ARRAY , 0 , MODE_DESCEND ); //MODE_ASCEND);
      
       for (i= 0 ; i<Level; i++) 
       {
     
     g+=a[i][ 0 ];
     //int ti=a[i-2][1];
     }
         
         
     
     if (MinProf < 0 && (g+MinProf)>=ProcMax)
      {
       for (i= 0 ; i<Level; i++) 
       {
       if ( OrderSelect (a[i][ 1 ], SELECT_BY_TICKET , MODE_TRADES ))
        {
         //Alert(a[i][1]);
         if ( OrderType ()== OP_BUY )
         {
           OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( OrderSymbol (), MODE_BID ), Slip, CLR_NONE);
          }
           if ( OrderType ()== OP_SELL )
           {
           OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( OrderSymbol (), MODE_ASK ), Slip, CLR_NONE);
           }
          }
         }
          
          
          
           if ( OrderSelect (MinTic, SELECT_BY_TICKET , MODE_TRADES ))
        {
         if ( OrderType ()== OP_BUY )
         {
           OrderClose (MinTic, OrderLots (), MarketInfo ( OrderSymbol (), MODE_BID ), Slip, CLR_NONE);
          }
           if ( OrderType ()== OP_SELL )
           {
           OrderClose (MinTic, OrderLots (), MarketInfo ( OrderSymbol (), MODE_ASK ), Slip, CLR_NONE);
           }
          }}       
return ;
}



 
tüm siparişlerin sıfır olması koşulu burada if( OrdersTotal()==0 ) . ve sıfır adlı bais ise koşul ne yazılır?

 
SanNneK :
tüm siparişlerin sıfır olması durumunda koşul şudur: if(OrdersTotal()==0) . ve sıfır adlı bais ise koşul ne yazılır?

(OP_BUY==0) ise
 
Tigerfreerun :
(OP_BUY==0) ise
teşekkürler
 
Bu bir tür korku
 
Tigerfreerun :
(OP_BUY==0) ise
Bu koşul, satın alma 0 ise ve satın alma 0 ise, sıfır sipariş olduğunda bir koşula ihtiyacım var, sonra başka bir işlev başlatılır ve satın alma sıfır ise, satın alma olduğunda işlev başlatılır.