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

 
EVGENII SHELIPOV # :

아무것도 바뀌지 않았다

모든 것을 바꿔라...

 //+----------------------------------------------------------------------------+
void ClosseMinMaxOrders()
  {
   int slipp = MarketInfo( _Symbol , MODE_SPREAD )* 2 ;
   int minTicket=GetOrderTicket( 0 );
   int maxTicket=GetOrderTicket( 1 );
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderClose(maxTicket, OrderLots(), Bid, slipp)&&OrderClose(minTicket, OrderLots(), Bid, slipp))
             Print ( "Максимальный и минимальный ордера на покупку успешно закрыты!" );
         else
             Print ( "Не удалось закрыть максимальный и минимальный ордера на покупку!" , GetLastError ());
        }
     }
  }
//+----------------------------------------------------------------------------+
//| Калькуляция профита максимального и минимального ордера в сетке            |
//+----------------------------------------------------------------------------+
double CalculiteProfit()
  {
   double minProfit = 0 , maxProfit = 0 ;
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
           {
             if (OrderTicket() == GetOrderTicket( 0 ))
               minProfit = OrderProfit();
             if (OrderTicket() == GetOrderTicket( 1 ))
               maxProfit = OrderProfit();
           }
        }
     }
   return (minProfit+maxProfit);
  }
//+----------------------------------------------------------------------------+
//| Номер тикета                                                               |
//| 0-минимального ордера в сетке                                              |
//| 1-максимального ордера в сетке                                             |
//+----------------------------------------------------------------------------+
int GetOrderTicket( int tick=- 1 )
   {
   int min_ticket = INT_MAX ;
   int max_ticket = 0 ;
   int result=- 1 ;
      {
       for ( int cnt = OrdersTotal () - 1 ; cnt >= 0 ; cnt--) 
         {
         if ( OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES))
            {
             if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                   if (OrderTicket() < min_ticket)
                     min_ticket = OrderTicket();
                  if (OrderTicket() > max_ticket) 
                     max_ticket = OrderTicket();
                  }
               }
            }
         }
      }
   if (tick== 0 ) {result=min_ticket;} else
   if (tick== 1 ) {result=max_ticket;} else {result=- 1 ;}
   return (result);
   }
//+----------------------------------------------------------------------------+
 
EVGENII SHELIPOV # :

아무것도 바뀌지 않았다

그 쯤...

 //--- global parameters
bool closeAll= false ;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (CalculiteProfit() > ProfitMinMaxOrders && Drawdown > DrawdownClosingMinMaxOrders)
      closeAll= true ;
   ClosseMinMaxOrders()
  }
//+----------------------------------------------------------------------------+
void ClosseMinMaxOrders()
  {
   if (closeAll== true )
     {
       int slipp = MarketInfo( _Symbol , MODE_SPREAD )* 2 ;
       int minTicket=GetOrderTicket( 0 );
       int maxTicket=GetOrderTicket( 1 );
       for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
        {
         if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
           {
             if (OrderClose(maxTicket, OrderLots(), Bid, slipp)&&OrderClose(minTicket, OrderLots(), Bid, slipp))
               Print ( "Максимальный и минимальный ордера на покупку успешно закрыты!" );
             else
               Print ( "Не удалось закрыть максимальный и минимальный ордера на покупку!" , GetLastError ());
           }
        }
      closeAll= false ;
     }
  }
//+----------------------------------------------------------------------------+
//| Калькуляция профита максимального и минимального ордера в сетке            |
//+----------------------------------------------------------------------------+
double CalculiteProfit()
  {
   double minProfit = 0 , maxProfit = 0 ;
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
           {
             if (OrderTicket() == GetOrderTicket( 0 ))
               minProfit = OrderProfit();
             if (OrderTicket() == GetOrderTicket( 1 ))
               maxProfit = OrderProfit();
           }
        }
     }
   return (minProfit+maxProfit);
  }
//+----------------------------------------------------------------------------+
//| Номер тикета                                                               |
//| 0-минимального ордера в сетке                                              |
//| 1-максимального ордера в сетке                                             |
//+----------------------------------------------------------------------------+
int GetOrderTicket( int tick=- 1 )
   {
   int min_ticket = INT_MAX ;
   int max_ticket = 0 ;
   int result=- 1 ;
      {
       for ( int cnt = OrdersTotal () - 1 ; cnt >= 0 ; cnt--) 
         {
         if ( OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES))
            {
             if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                   if (OrderTicket() < min_ticket)
                     {
                     min_ticket = OrderTicket();
                     }
                   if (OrderTicket() > max_ticket) 
                     {
                     max_ticket = OrderTicket();
                     }
                  }
               }
            }
         }
      }
   if (tick== 0 ) {result=min_ticket;} else
   if (tick== 1 ) {result=max_ticket;} else {result=- 1 ;}
   return (result);
   }
//+----------------------------------------------------------------------------+
 
MakarFX # :

나는 당신에게 다른 기능을 주었다 ... 아무것도 추가 할 필요가 없습니다

아니면 옮기셔도 되고...


 //+----------------------------------------------------------------------------+
//| Закрытие минимального и максимального ордеров                              |
//+----------------------------------------------------------------------------+
void   ClosseMinMaxOrders()
{
   int slipp = ( int ) MarketInfo( _Symbol , MODE_SPREAD )* 2 ;
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
     {
       if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
        {
         if (OrderType() == OP_BUY)
          {
         if (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Bid, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Bid, slipp)); 
           // Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
         else
               Print ( "Не удалось закрыть максимальный и минимальный ордера на покупку!" , GetLastError ());
          }   
   
         if (OrderType() == OP_SELL)
         {
         if   (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)     
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Ask, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Ask, slipp));
           // Print("Максимальный и минимальный ордера на продажу успешно закрыты!");
         else
               Print ( "Не удалось закрыть максимальный и минимальный ордера на продажу!" , GetLastError ());
         }
       } 
     }
  }
}
 
EVGENII SHELIPOV # :


선택한 항목을 삭제할 수 있습니다.

 //+----------------------------------------------------------------------------+
//| Закрытие минимального и максимального ордеров                              |
//+----------------------------------------------------------------------------+
void   ClosseMinMaxOrders()
{
   int slipp = ( int ) MarketInfo( _Symbol , MODE_SPREAD )* 2 ;
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
     {
       if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
        {
         if (OrderType() == OP_BUY)
          {
         if (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Bid, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Bid, slipp)); 
           // Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
         else
               Print ( "Не удалось закрыть максимальный и минимальный ордера на покупку!" , GetLastError ());
          }   
   
         if (OrderType() == OP_SELL)
         {
         if   (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)     
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Ask, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Ask, slipp));
           // Print("Максимальный и минимальный ордера на продажу успешно закрыты!");
         else
               Print ( "Не удалось закрыть максимальный и минимальный ордера на продажу!" , GetLastError ());
         }
       } 
     }
  }
}
 
MakarFX # :

선택한 항목을 삭제할 수 있습니다.

Makar 당신은 이유를 설명할 수 있습니다

 
EVGENII SHELIPOV # :

Makar 이유를 설명할 수 있습니까?

"슬립" 크기를 사용하면 모든 방향의 주문을 삭제할 수 있습니다... 가장 중요한 것은 티켓이 일치한다는 것입니다
 
MakarFX # :

선택한 항목을 삭제할 수 있습니다.

Makar 한 가지 더 질문, 나는 당신을 위해 사진을 버릴 것이지만, 당신은 아무것도 다시 쓸 필요가 없습니다. 당신의 경험은 당신에게 관심이 있습니다.

최소 최대 주문이 마감되고 주문 그리드에 아직 주문이 있는 경우 상황은 다음과 같습니다. 이전 평균 가격이 올바르지 않습니다. 새로운 최대 주문이 열리면 주문 수정이 발생합니다.


 if (CountTrade() < MaxOrders)                                                           
       {
           int order_type = FindLastOrderType();
           if (order_type == OP_BUY)
           { 
              price = FindLastOrderPrice(OP_BUY);  
               if (Ask<= price - Step()* Point )
              {
                  lastlot = NormalizeDouble (GetMinLotOrder()* MathPow ( MultiplierParameter, OrdersTotal ()), 2 );
                  ticket = OrderSend ( Symbol (), OP_BUY, lastlot, Ask, slip, 0 , 0 , "Групповой ордер" , Magic, 0 , Blue);
                   if (ticket < 1 )
                       Print ( "Ошибка ордера на покупку" );
                             ModifyOrders(OP_BUY);
              } 


           }
             if (order_type == OP_SELL)
           { 
              price = FindLastOrderPrice(OP_SELL);  
               if (Bid>= price + Step()* Point )
              {
                  lastlot = NormalizeDouble (GetMinLotOrder()* MathPow ( MultiplierParameter, OrdersTotal ()), 2 );
                  ticket = OrderSend ( Symbol (), OP_SELL, lastlot, Bid, slip, 0 , 0 , "Групповой ордер" , Magic, 0 , Red);
                   if (ticket < 1 )
                       Print ( "Ошибка ордера на продажу!" );
                             ModifyOrders(OP_SELL);
              }

가격이 이전 평균 가격으로 이동하고 주문 그리드가 닫히면 손실이 발생합니다. 수정을 한 곳 더 나사로 조여야 했습니다.

//+----------------------------------------------------------------------------+
//| Закрытие минимального и максимального ордеров                              |
//+----------------------------------------------------------------------------+
void   ClosseMinMaxOrders()
{
   int slipp = ( int ) MarketInfo( _Symbol , MODE_SPREAD )* 2 ;
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
     {
       if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
        {
         if (OrderType() == OP_BUY)
          {
         if (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Bid, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Bid, slipp));
           // Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
         else
               Print ( "Не удалось закрыть максимальный и минимальный ордера на покупку!" , GetLastError ());
               ModifyOrders(OP_BUY);
          }   
   
         if (OrderType() == OP_SELL)
         {
         if   (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)     
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Ask, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Ask, slipp));
           // Print("Максимальный и минимальный ордера на продажу успешно закрыты!");
         else
               Print ( "Не удалось закрыть максимальный и минимальный ордера на продажу!" , GetLastError ());
               ModifyOrders(OP_SELL);
         }
       } 
     }
  }
}

수정 기능 자체는 다음과 같습니다.

 //+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders( int otype)
{
     double avg_price, order_lots = 0 ;
    price = 0 ;
   
     for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
    {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
       {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots() ;
         }
       }
    }
    avg_price = NormalizeDouble (price / order_lots, Digits );
     {
     ObjectDelete ( 0 , "AveragePriceLine" );
     ObjectCreate ( 0 , "AveragePriceLine" , OBJ_HLINE , 0 , 0 , avg_price);
     ObjectSet( "AveragePriceLine" , OBJPROP_COLOR , Magenta);
     }
     if (otype == OP_BUY) tp = NormalizeDouble (avg_price + TakeProfitGroupOrder* Point , Digits );
     if (otype == OP_SELL) tp = NormalizeDouble (avg_price - TakeProfitGroupOrder* Point , Digits );
    
     for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--) 
    {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
       {
           if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic && OrderType() == otype)
           {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), 0 , tp, 0 ))
                   Print ( "Ордера успешно модифицированы!" );
                 else Print ( "Ошибка модификации ордеров!" );
           }
       }
    }
}

문제는 로그의 오류가 얼마나 중요한지입니다.










 
MakarFX # :
"슬립" 크기를 사용하면 모든 방향의 주문을 삭제할 수 있습니다... 가장 중요한 것은 티켓이 일치한다는 것입니다

Ask or Bid 가격은 중요하지 않습니다.

 
EVGENII SHELIPOV # :

Ask or Bid 가격은 중요하지 않습니다.

상관없어

 
EVGENII SHELIPOV # :

문제는 로그의 오류가 얼마나 중요한지입니다.

비판적이지는 않지만 모든 것에 대한 설명이 있습니다 ...