Любые вопросы новичков по 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 #:

Выделенное можно удалить

Макар можете объяснить почему

 
EVGENII SHELIPOV #:

Макар можете объяснить почему

размер "slipp" позволяет удалять ордер любого направления...главное чтобы тикет совпадал
 
MakarFX #:

Выделенное можно удалить

Макар еще один вопрос я ВАМ скину картинки только не надо ничего переписывать интересует ВАШ опыт сталкивались ВЫ с этим.

Ситуация следующая если закрылись мин макс ордера и в сетке ордеров еще есть ордера старая средняя цена не верна модификация ордеров происходит если откроется новый максимальный ордер 


 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 #:
размер "slipp" позволяет удалять ордер любого направления...главное чтобы тикет совпадал

По цене Ask или Bid не важно

 
EVGENII SHELIPOV #:

По цене Ask или Bid не важно

не важно

 
EVGENII SHELIPOV #:

Вопрос состоит в том насколько критичны ошибки в журнале

Не критичны, но всему есть объяснение...

Причина обращения: