Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1889

 
Andrey Sokolov #:

У тебя память на сутки?

нет. Я не узнал как реализовать то что мне нужно- возможно получится со второй итерации;-)
 
DanilaMactep #:
нет. Я не узнал как реализовать то что мне нужно- возможно получится со второй итерации;-)

Тебе Максим Кузнецов ответил как. Читал?

 

Доброго времени суток прошу помочь решить проблему с неправильным закрытием ордеров 

Советник при наборе положительного профита закрывает в сетке ордеров первый ордер последний ордер и предпоследний ордер 

на демо счете все нормально на реале закрывается только минимальный и предпоследний . Я сталкивался с этой проблемой тогда нужно было закрыть всю сетку ордеров и вопрос был в реквотах  тогда был установлен флаг и проблема решилась . Здесь я сделал тоже самое но проблема не прошла. 

Флаг:

int flag_close3=0;
//-------------------------------------------------------------------+  Команда на закрытие мин макс и предпоследнего ордеров в сетке профит = 0
   if(CalculiteProfitMinMaxPenultimateOrders() >= 0 && Drawdown >= DrawdownClosingMinMaxOrdersZero && FindPenultimateProfit() > 0)
     {
       flag_close3=1;
     }
//-------------------------------------------------------------------+  Флаг на закрытие  ордеров
   if(flag_close3==1)
      ClosseMinMaxPenultimateOrdersZero();
//+----------------------------------------------------------------------------+
//| Закрытие минимального максимального и предпоследнего ордеров профит = 0    |
//+----------------------------------------------------------------------------+
void  ClosseMinMaxPenultimateOrdersZero()
  {
   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(CalculiteProfitMinMaxPenultimateOrders() >= 0  && Drawdown >= DrawdownClosingMinMaxOrdersZero && FindPenultimateProfit() > 0)
                 {
                  if(OrderClose(GetTicketPenultimateOrder(), FindPenultimateLots(), Bid, slipp) && OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Bid, slipp) &&
                     OrderClose(GetTicketMaxOrder(), FindLastLots(), Bid, slipp))
                    {
                     SendNotification("Закрылся минимальный максимальный и предпоследний ордера на покупку: " + Symbol() + ", Баланс: " + DoubleToString(NormalizeDouble(AccountBalance(), 2))
                                      + ", Свободно денежных средств: " + DoubleToString(NormalizeDouble(AccountFreeMargin(), 2)));
                     Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
                    }
                  else
                    {
                     Print("Не удалось закрыть максимальный и минимальный ордера на покупку!",GetLastError());
                    }
                 }
              }

            if(OrderType() == OP_SELL)
              {
               if(CalculiteProfitMinMaxPenultimateOrders() >= 0 && Drawdown >= DrawdownClosingMinMaxOrdersZero && FindPenultimateProfit() > 0)
                 {
                  if(OrderClose(GetTicketPenultimateOrder(), FindPenultimateLots(), Ask, slipp) && OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Ask, slipp) &&
                     OrderClose(GetTicketMaxOrder(), FindLastLots(), Ask, slipp))
                    {
                     SendNotification("Закрылся минимальный максимальный и предпоследний ордера на продажу: " + Symbol() + ", Баланс: " + DoubleToString(NormalizeDouble(AccountBalance(), 2))
                                      + ", Свободно денежных средств: " + DoubleToString(NormalizeDouble(AccountFreeMargin(), 2)));
                     Print("Максимальный и минимальный ордера на продажу успешно закрыты!");
                    }
                  else
                    {
                     Print("Не удалось закрыть максимальный и минимальный ордера на продажу!",GetLastError());
                    }
                 }
              }
           }
        }
     }
  }

Спасибо!!!!

 
EVGENII SHELIPOV #:

Доброго времени суток прошу помочь решить проблему с неправильным закрытием ордеров 

Советник при наборе положительного профита закрывает в сетке ордеров первый ордер последний ордер и предпоследний ордер 

на демо счете все нормально на реале закрывается только минимальный и предпоследний . Я сталкивался с этой проблемой тогда нужно было закрыть всю сетку ордеров и вопрос был в реквотах  тогда был установлен флаг и проблема решилась . Здесь я сделал тоже самое но проблема не прошла. 

Флаг:

Спасибо!!!!

А где твой флаг обнуляется?
 
Tretyakov Rostyslav #:
А где твой флаг обнуляется?
//-------------------------------------------------------------------+  Команда на удаление линий отображающую среднюю цену и текста
   if(CountTrade() == 0)
     {
      flag_close=0;
      ObjectsDeleteAll(0,"AveragePriceLine");
      if(ObjectFind(0,"signal4")==0 && CountTrade(0) < 1)//для бай
        {
         ObjectDelete(0,"signal4");
        }
      if(ObjectFind(0,"signal3")==0 && CountTrade(1) < 1)//для селл
        {
         ObjectDelete(0,"signal3");
        }
     }

Если я сюда вставлю будет правильно 

 
EVGENII SHELIPOV #:

Если я сюда вставлю будет правильно 

Нет. Так он обнултся когда все ордера закрыты.

Учитывая что тебе надо не все ордера закрывать, то лучше переберать тикеты и закрывать

 
Tretyakov Rostyslav #:

Нет. Так он обнултся когда все ордера закрыты.

Учитывая что тебе надо не все ордера закрывать, то лучше переберать тикеты и закрывать

Сейчас минуточку

 
EVGENII SHELIPOV #:

Сейчас минуточку



//-------------------------------------------------------------------+  Команда на удаление линий отображающую среднюю цену мин и макс ордеров и текста
   if(CountTrade() == 0 || Drawdown < DrawdownClosingMinMaxOrdersZero)
     {
      flag_close2=0;
      flag_close3=0;
      ObjectsDeleteAll(0,"AveragePriceLineMinMaxOrders");
      if(ObjectFind(0,"signal41")==0 && (CountTrade(0)<1 || Drawdown < DrawdownClosingMinMaxOrdersZero)) //для бай
        {
         ObjectDelete(0,"signal41");
        }
      if(ObjectFind(0,"signal42")==0 && (CountTrade(1)<1 || Drawdown < DrawdownClosingMinMaxOrdersZero))//для селл
        {
         ObjectDelete(0,"signal42");
        }
     }

а так

 
Tretyakov Rostyslav #:

Нет. Так он обнултся когда все ордера закрыты.

Учитывая что тебе надо не все ордера закрывать, то лучше переберать тикеты и закрывать

А разве в функции закрытия ордеров я не перебираю тикеты

//+----------------------------------------------------------------------------+
//| Закрытие минимального максимального и предпоследнего ордеров               |
//+----------------------------------------------------------------------------+
void  ClosseMinMaxPenultimateOrders()
  {
   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(CalculiteProfitMinMaxPenultimateOrders() >= 0 && OrderGroupCloseSignal()==0 &&
                  Drawdown >= DrawdownClosingMinMaxOrders && FindPenultimateProfit() > 0)
                 {
                  if(OrderClose(GetTicketPenultimateOrder(), FindPenultimateLots(), Bid, slipp) && OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Bid, slipp) &&
                     OrderClose(GetTicketMaxOrder(), FindLastLots(), Bid, slipp))
                    {
                     SendNotification("Закрылся минимальный максимальный и предпоследний ордера на покупку: " + Symbol() + ", Баланс: " + DoubleToString(NormalizeDouble(AccountBalance(), 2))
                                      + ", Свободно денежных средств: " + DoubleToString(NormalizeDouble(AccountFreeMargin(), 2)));
                     Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
                    }
                  else
                    {
                     Print("Не удалось закрыть максимальный и минимальный ордера на покупку!",GetLastError());
                    }
                 }
              }

            if(OrderType() == OP_SELL)
              {
               if(CalculiteProfitMinMaxPenultimateOrders() >= 0 && OrderGroupCloseSignal()==1 &&
                  Drawdown >= DrawdownClosingMinMaxOrders && FindPenultimateProfit() > 0)
                 {
                  if(OrderClose(GetTicketPenultimateOrder(), FindPenultimateLots(), Ask, slipp) && OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Ask, slipp) &&
                     OrderClose(GetTicketMaxOrder(), FindLastLots(), Ask, slipp))
                    {
                     SendNotification("Закрылся минимальный максимальный и предпоследний ордера на продажу: " + Symbol() + ", Баланс" + DoubleToString(NormalizeDouble(AccountBalance(), 2))
                                      + ", Свободно денежных средств" + DoubleToString(NormalizeDouble(AccountFreeMargin(), 2)));
                     Print("Максимальный и минимальный ордера на продажу успешно закрыты!");
                    }
                  else
                    {
                     Print("Не удалось закрыть максимальный и минимальный ордера на продажу!",GetLastError());
                    }
                 }
              }
           }
        }
     }
  }
 
EVGENII SHELIPOV #:


а так

//-------------------------------------------------------------------+  Команда на удаление линий отображающую среднюю цену мин и макс ордеров и текста
   if(CountTrade() == 0 || Drawdown < DrawdownClosingMinMaxOrdersZero)
     {
      flag_close2=0;
      flag_close3=0;

Это значит если нет ордеров

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