Что не даёт советнику заработать. - страница 4

 
FAQ:

... пожалуйста :

Большая половина как глобальных, так и локальных переменных не инициализированны - уверен к определенному моменту работы в них куча мусора сидит.

ВЫ ни разу не проверяете а выбран ли ордер ОрдерСелектом(), о проверках его на открытость \закрытость по времени закрытия речь вообще не идет.

Обновления котировок перед торговыми функция ми я что то в коде не заметил...

ГетЛастЕррор перед открытием\закрытием не сбрасываете, но проверять проверяете - опять же будут случаи мусора в переменной.

При закрытии цены не проверяются и не нормализируются

Продолжать?

Продолжайте.

Очень полезно.

 

Здесь https://www.mql5.com/ru/forum/137651/page3 я выкладывал свою функцию закрытия

GetInfo() замените принтом, Fun_Error() = ErrorDescription()

 
FAQ:

ВЫ ни разу не проверяете а выбран ли ордер ОрдерСелектом(),


честно говоря, не совсем понимаю, что делать если при выборе ордера возвращено значение - false.

Означает ли false - его 100% отсутствие среди MODE_TRADES?

Переделал коды открытия ордеров в соответствии с вашими рекомендациями, честно не трогаю конфигурацию советника,любопытненько, посмотрим...сольётся или зафиксирует очередную прибыль.

 
valenok2003:


честно говоря, не совсем понимаю, что делать если при выборе ордера возвращено значение - false.

Означает ли false - его 100% отсутствие среди MODE_TRADES?


это 100% означает, что с ним [ордером] ничего нельзя делать, т.к. он не выбран.
 
PapaYozh:

это 100% означает, что с ним [ордером] ничего нельзя делать, т.к. он не выбран.



Точно... Млин... но если он не выбран, это же ошибка какая-то? Что-то же нужно делать...

Например, посмотрите эту функцию,

//+-------
//+------------------------------------------------------------------+
//|   valenok2003@mail.ru                                05.07.2011
//+------------------------------------------------------------------+
//| check_open_order() ПРОВЕРКА реального открытия рыночного ордера по тикету
//| Требует:
//| - тикет ордера 
//| Возвращает тикет открытого ордера или -1
//+------------------------------------------------------------------+
int check_open_order(int _Ticket)
{  string _Function = "check_open_order(): ";
//-----------------
   if(_Ticket > 0) {  
      OrderSelect(_Ticket,SELECT_BY_TICKET);             
      if(OrderType() <= 1) {  
         output_mov_string(order_type_in_txt(OrderType())+ " успешно открыт!", Clr_Report);
         output_sound(Name_Sound_Open);
         OrderPrint();
//-----------------         
         for(int _n = 0; _n < MAX_ORDERS; _n++)  {
            // Если место свободно
            if(Arr_Tickets[_n] == 0)   {
               // Создаём запись об ордере
               Arr_Tickets[_n] = OrderTicket();
               break;
            }
         }
      }
      else _Ticket = -1;
   }
//-----------------
   return(_Ticket);
}
//+-------------------------------------------------------------------
//+-------
Если ордер не выбран, по идее я должен вернуть -1. А если он не выбран по другой причине - сбой какой-нибудь, например, а ордер открыт, тогда что делать?
 
valenok2003:


Точно... Млин... но если он не выбран, это же ошибка какая-то? Что-то же нужно делать...


Он может быть не выбран:

1) из-за косяков в коде советника;

2) из-за того, что при переборе ордеров произошло его закрытие по независящим от советника обстоятельствам (сработал SL/TP, закрыт вручную, закрыт советником)

 
valenok2003:


Точно... Млин... но если он не выбран, это же ошибка какая-то? Что-то же нужно делать...

Вы так прикалываетесь или всерьез???

Делать паузу и выбирать еще раз. У меня так организовано, работает в он-лайне:

// ------------------------------------------------Ищем наш ордер---------------------------------
   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))     continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber)) continue;
      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL)) continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера          
          if (ticket>0)                                    // Если позиция открылась
              {
                while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                Sleep(100);                                 
                double OpenPrice=OrderOpenPrice();
       // Print("OrderTicket()=",OrderTicket(),  "OrderOpenTime()=",OrderOpenTime()); 
       // Print("TimeLocal()=",TimeLocal());                                                                    
                     //---------------------Запоминаем значения сл и тп ордера   
...
...
...
                  
 
Roman.:

Вы так прикалываетесь или всерьез???

Делать паузу и выбирать еще раз. У меня так организовано, работает в он-лайне:

Я там свой пост дополнил.

И сколько раз выбирать?

 
valenok2003:

Я там свой пост дополнил.

И сколько раз выбирать?

ДО ТАЛОГО. Пока не будет выбран в цикле:

if (ticket>0)                                    // Если позиция открылась
              {
                while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                Sleep(100);                                 
                double OpenPrice=OrderOpenPrice();
       // Print("OrderTicket()=",OrderTicket(),  "OrderOpenTime()=",OrderOpenTime()); 
       // Print("TimeLocal()=",TimeLocal());                                                                    
                     //---------------------Запоминаем значения сл и тп ордера                     
                if (orderType == OP_BUY) 
                   {                
                     
                   }
            
                if (orderType == OP_SELL) 
                   {        
                   
                   }   
                            
              }
 
PapaYozh:


Он может быть не выбран:

1) из-за косяков в коде советника;

с этим всё понятно

2) из-за того, что при переборе ордеров произошло его закрытие по независящим от советника обстоятельствам (сработал SL/TP, закрыт вручную, закрыт советником)

только эти две причины или может быть что-то ещё?
Причина обращения: