MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 612

 
모든 것이 정확하고 조건이 절대 충족되지 않도록 taik 값으로 주문 유형을 확인하고 있습니다.
 

어떤 주문이 닫힐 때 다른 모든 보류 중인 주문 을 닫는 코드를 작성했는데 문제는 4개의 주문을 2, 3, 4, 5 순서로 작성했다는 것입니다. 열릴 것이다. 그러면 닫히지 않습니다. 빨간색으로 강조 표시된 주문 번호는 보류 중인 모든 주문이 마감될 주문으로 변경되어야 합니다.

무효 시작(){

//----

이중 Take1 = Ask+20 *포인트;

이중 Take2 = 묻기+0 *포인트;

이중 Take3 = Ask-20 *포인트;

이중 Take4 = Ask-40 *포인트;

이중 Take5 = Ask-60 *포인트;

더블 스탑 = Bid-StopLoss*Point;

if(OrdersTotal()==0){

OrderSend(Symbol(),0,0.01,Ask,30,Stop,Take1,"",0,0,CLR_NONE);

OrderSend(Symbol(),2,0.02,Ask-20*Point,30,Stop,Take2,"",0,0,CLR_NONE);

OrderSend(Symbol(),2,0.04,Ask-40*Point,30,Stop,Take3,"",0,0,CLR_NONE);

OrderSend(Symbol(),2,0.08,Ask-60*Point,30,Stop,Take4,"",0,0,CLR_NONE);

OrderSend(Symbol(),2,0.16,Ask-80*Point,30,Stop,Take5,"",0,0,CLR_NONE);

}


if(OrdersTotal()==4)

{

주문 삭제( 2 );

}

if(OrdersTotal()==3)

{

주문 삭제( 3 );

}

if(주문 총계()==2)

{

주문 삭제( 4 );

}

if(OrdersTotal()==1)

{

주문 삭제( 5 );

리턴(0);

}

 
SanNneK :

어떤 주문이 닫힐 때 다른 모든 보류 중인 주문 을 닫는 코드를 작성했는데 문제는 4개의 주문을 2, 3, 4, 5 순서로 작성했다는 것입니다. 열릴 것이다. 그러면 닫히지 않습니다. 빨간색으로 강조 표시된 주문 번호는 보류 중인 모든 주문이 마감될 주문으로 변경되어야 합니다.

먼저 루프에서 포지션이 최근에 마감되었는지 여부를 확인합니다. 이에 대해 OrdersHistoryTotal이 필요합니다. 위치 마감 시간 OrderCloseTime 을 확인하는 곳에서 변수의 마지막 시간보다 크면 열려 있는 모든 OrdersTotal 을 반복합니다. 그리고 우리는 그것들을 닫습니다.

PS Alt + S 또는 아이콘을 통해 코드 삽입

예를 들어 이

   // 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 ;
   }
}
//-------------------------------------------------------------------+
여기에 질문이 있습니다. 증가된 로트와 함께 개설된 주문 자체에서 어떤 이유로 TP 및 SL 변경으로 인해 이익실현 및 손절매에 문제가 있습니다. 그리고 그것은 제비를 늘리고 TP로 마감하면 손실 금액을 반환 할 수 없습니다. 왜 이런 일이 일어나는지, 무엇이 잘못되었는지
 
안녕하세요 함수를 작성하지 않았습니다. 로봇이 ArraySort 기능 에 대해 잘못된 시작 위치 0 오류를 씁니다. 기능을 수정하고 설명하는 데 도움을 주시면 감사하겠습니다.
 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 ;
}



 
모든 주문이 0인 경우의 조건은 다음과 같습니다 . if( OrdersTotal()==0 ) . 그리고 bais라는 이름이 0이면 조건을 작성하는 방법은 무엇입니까?

 
SanNneK :
모든 주문이 0인 경우의 조건은 if(OrdersTotal()==0) 입니다. 그리고 bais라는 이름이 0이면 조건을 작성하는 방법은 무엇입니까?

(OP_BUY==0)인 경우
 
Tigerfreerun :
(OP_BUY==0)인 경우
감사해요
 
일종의 공포다.
 
Tigerfreerun :
(OP_BUY==0)인 경우
이 조건은 구매가 0이고 구매가 0인 경우 주문이 0일 때 조건이 필요하고 다른 기능이 실행되고 구매가 0이면 구매가 있을 때 기능이 실행됩니다.