То работает, то не работает... Под настроение?

 

Дело в том, что один и тот же код на одном и том же символе, на одном и том же ТФ но в одном конкретном советнике тупо не работает...

int OnInit()
{
   ..............
   if(pos_set.magic == EMPTY_VALUE || pos_set.magic == 0 || pos_set.magic == NULL)
   {
      if(codeExpertMagic())
      {
         MessageBox("Советник получил MAGIC = "+string(magic_set)+".","MAGIC",MB_OK);
         Print("Советник получил MAGIC = "+string(magic_set)+".");
         decodeExpertMagic(magic_set);
         pos_set.magic = magic_set;
      }
      else
      {
         MessageBox("Ошибка установки MAGIC.","MAGIC",MB_OK);
         Print("Ошибка установки MAGIC.");
         pos_set.magic = NULL;
      }
   }
//+--------
   return(INIT_SUCCEEDED);
}

void OnTick()
{
...........
//--- код в советнике, в котором всё работает
                  if(..........)
                  {
                     Print("======= Закрываем позицию =======");
                     closePosition(pos_set,pos_get);
                  }
//-------------------------------------------
...........
//--- код в советнике, в котором не работает
            if(............) closePosition(pos_set,pos_get);
//-------------------------------------------
.................
}

//+------------------------------------------------------------------+
bool closePosition(MyPositionSet &pos_s, MyPositionGet &pos_g)
{
   ResetLastError();
   if(my_Position.SelectByMagic(Symbol(),pos_s.magic))
   {
      if(my_Position.SelectByTicket(pos_g.ticket))
      {
         if(my_Trade.PositionClose(pos_g.ticket) && my_Trade.ResultRetcode() == TRADE_RETCODE_DONE) clearData(pos_s,pos_g);
         else 
         {
            Print("ОШИБКА ЗАКРЫТИЯ ПОЗИЦИИ = "+IntegerToString(my_Trade.ResultRetcode()));
            Print(GetLastError());
            ExpertRemove();
         }
      }
      else
      {
         Print("Тикет не существует = "+string(pos_g.ticket));
         Print("GetLastError = "+string(GetLastError()));
         ExpertRemove();
      }
   }
   else 
   {
      Print("Ошибка магика.");
      Print("GetLastError = "+string(GetLastError()));
      ExpertRemove();
   }
   
   return(true);
}
//+------------------------------------------------------------------+

Это вывод из работающего

HF      0       11:20:00.900    Core 1  2018.04.01 00:00:00   Советник получил MAGIC = 171226312914601707.
NE      0       11:20:00.900    Core 1  2018.04.01 00:00:00   Советник ..... запущен на символе GBPUSD, период графика H1
...............
IR      0       11:21:00.239    Core 1  2018.04.04 07:00:00   ======= Отрываем позицию вниз =======
LR      0       11:21:00.239    Core 1  2018.04.04 07:00:00   market sell 0.10 GBPUSD (1.40904 / 1.40911 / 1.40904)
EE      0       11:21:00.239    Core 1  2018.04.04 07:00:00   deal #2 sell 0.10 GBPUSD at 1.40904 done (based on order #2)
OH      0       11:21:00.239    Core 1  2018.04.04 07:00:00   deal performed [#2 sell 0.10 GBPUSD at 1.40904]
GI      0       11:21:00.239    Core 1  2018.04.04 07:00:00   order performed sell 0.10 at 1.40904 [#2 sell 0.10 GBPUSD at 1.40904]
GP      0       11:21:00.239    Core 1  2018.04.04 07:00:00   CTrade::OrderSend: market sell 0.10 GBPUSD [done at 1.40904]
................
IP      0       11:21:00.239    Core 1  2018.04.19 13:00:00   ======= Закрываем позицию =======
JF      0       11:21:00.239    Core 1  2018.04.19 13:00:00   market buy 0.70 GBPUSD, close #2 (1.41971 / 1.41974 / 1.41971)
PF      0       11:21:00.239    Core 1  2018.04.19 13:00:00   deal #9 buy 0.70 GBPUSD at 1.41974 done (based on order #9)
IK      0       11:21:00.239    Core 1  2018.04.19 13:00:00   deal performed [#9 buy 0.70 GBPUSD at 1.41974]
KL      0       11:21:00.239    Core 1  2018.04.19 13:00:00   order performed buy 0.70 at 1.41974 [#9 buy 0.70 GBPUSD at 1.41974]
RS      0       11:21:00.239    Core 1  2018.04.19 13:00:00   CTrade::OrderSend: market buy 0.70 GBPUSD [done at 1.41974]

А это из не работающего

HF      0       11:24:07.900    Core 1  2018.04.01 00:00:00   Советник получил MAGIC = 171226312914601707.
NE      0       11:24:07.900    Core 1  2018.04.01 00:00:00   Советник ..... запущен на символе GBPUSD, период графика H1
JO      0       11:24:07.900    Core 1  2018.04.10 19:00:00   market sell 0.10 GBPUSD (1.41592 / 1.41595 / 1.41592)
JN      0       11:24:07.900    Core 1  2018.04.10 19:00:00   deal #2 sell 0.10 GBPUSD at 1.41592 done (based on order #2)
HO      0       11:24:07.900    Core 1  2018.04.10 19:00:00   deal performed [#2 sell 0.10 GBPUSD at 1.41592]
RF      0       11:24:07.900    Core 1  2018.04.10 19:00:00   order performed sell 0.10 at 1.41592 [#2 sell 0.10 GBPUSD at 1.41592]
PK      0       11:24:07.900    Core 1  2018.04.10 19:00:00   CTrade::OrderSend: market sell 0.10 GBPUSD [done at 1.41592]
NF      0       11:24:07.900    Core 1  2018.04.10 19:00:00   balance = 9999.72
ML      0       11:24:07.900    Core 1  2018.04.10 19:00:00   lot = 0.10
IJ      0       11:24:07.900    Core 1  2018.04.10 19:00:00   Sell market. Ticket = 2
JS      0       11:24:07.900    Core 1  2018.04.10 19:00:00   position modified [#2 sell 0.10 GBPUSD 1.41592 sl: 1.41792]
NN      0       11:24:07.900    Core 1  2018.04.10 19:00:00   CTrade::OrderSend: modify GBPUSD (sl: 1.41792, tp: 0.00000) [done]
PE      0       11:24:07.900    Core 1  2018.04.10 19:00:00   Стоп(ы) установлен(ы)...
DF      0       11:24:07.900    Core 1  2018.04.10 19:00:00   Открыта позиция SELL с тикетом 2
GS      0       11:24:07.900    Core 1  2018.04.10 21:59:58   stop loss triggered #2 sell 0.10 GBPUSD 1.41592 sl: 1.41792 [#3 buy 0.10 GBPUSD at 1.41792]
FN      0       11:24:07.900    Core 1  2018.04.10 21:59:58   deal #3 buy 0.10 GBPUSD at 1.41792 done (based on order #3)
ES      0       11:24:07.900    Core 1  2018.04.10 21:59:58   deal performed [#3 buy 0.10 GBPUSD at 1.41792]
GE      0       11:24:07.900    Core 1  2018.04.10 21:59:58   order performed buy 0.10 at 1.41792 [#3 buy 0.10 GBPUSD at 1.41792]
QE      0       11:24:07.900    Core 1  2018.04.19 00:00:00   Ошибка магика.
FR      0       11:24:07.900    Core 1  2018.04.19 00:00:00   GetLastError = 0
FH      3       11:24:07.900    Core 1  2018.04.19 00:00:00   ExpertRemove() function called

Что за беда?

 
Кода долго ищешь ошибку и не можешь ее найти, она бывает где-то там, где ее не ищешь и даже не думаешь, что она там может быть, она где-то там  -  ................
 

Магик устанавливаю так

#include <Trade\Trade.mqh>                            // подключаем библиотеку для совершения торговых операций
CTrade                     my_Trade;                  // структура для выполнения торговых операций

//+------------------------------------------------------------------+
bool  codeExpertMagic()
{
   string   magic_str = "";
   
   if(magic_num == 0)
   {
      // = номер символа
      string   str   = Symbol();
      for(int i = 0; i < StringLen(str); i++)
      {
         int n = numChar(StringGetCharacter(str,i));
         if(n < 0)
         {
            Print("Ошибка символа.");
            return(false);
         }
         magic_str += string(n);
      }
      // = номер периода
      int   n = numPeriod(PeriodSeconds());
      if(n < 0)
      {
         Print("Ошибка периода.");
         return(false);
      }
      magic_str += string(n);
      // = номер имени советника
      n = numExpertName(MQLInfoString(MQL_PROGRAM_NAME));
      if(n < 0)
      {
         Print("Ошибка имени советника.");
         return(false);
      }
      magic_str += string(n);
      
      magic_set = StringToInteger(magic_str);
   }
   else magic_set = magic_num;
   
   my_Trade.SetExpertMagicNumber(magic_set);
   
   return(true);
}
//+------------------------------------------------------------------+
//--- открытие позиции
bool putOrderStopLimit(MyPositionSet &pos_in, MyPositionGet &pos_out)
{
   ......................
      else if(pos_in.ord_type == order_type_market &&
              my_Trade.Sell (pos_in.order_lot,Symbol(),NULL,pos_out.SL,pos_out.TP,comment_order) &&
              my_Trade.ResultRetcode() == TRADE_RETCODE_DONE)
      {
         pos_out.order_set                = true;
         pos_out.order_stop_set           = false;
         pos_out.ticket                   = my_Trade.ResultOrder();
         pos_in.magic                     = my_Trade.RequestMagic();
         pos_in.order_direction           = trend_dn;
         Print("magic = "+IntegerToString(pos_in.magic));
         Print("balance = "+DoubleToString(my_Account.Balance(),2));
         Print("lot = "+DoubleToString(pos_in.order_lot,2));
         Print("Sell market. Ticket = "+string(pos_out.ticket));
      }
      else
      {
         Comment("Ошибка установки ордера Sell");
         Print("Ошибка установки ордера Sell");
         return(false);
      }
   ..............
}
bool closePosition(MyPositionSet &pos_s, MyPositionGet &pos_g)
{
   ResetLastError();
   Print("Сохранённый магик = "+string(pos_s.magic));
   if(my_Position.SelectByMagic(Symbol(),pos_s.magic))
   {
      if(my_Position.SelectByTicket(pos_g.ticket))
      {
         if(my_Trade.PositionClose(pos_g.ticket) && my_Trade.ResultRetcode() == TRADE_RETCODE_DONE) clearData(pos_s,pos_g);
         else 
         {
            Print("ОШИБКА ЗАКРЫТИЯ ПОЗИЦИИ = "+IntegerToString(my_Trade.ResultRetcode()));
            Print(GetLastError());
            ExpertRemove();
         }
      }
      else
      {
         Print("Тикет не существует = "+string(pos_g.ticket));
         Print("GetLastError = "+string(GetLastError()));
         ExpertRemove();
      }
   }
   else 
   {
      Print("Ошибка магика.");
      Print("GetLastError = "+string(GetLastError()));
      ExpertRemove();
   }
   
   return(true);
}
//--- вызов закрытия позиции
	    if(..........)
            {
               Print("Закрываем позицию SELL...");
               Print("Магик позиции = "+string(my_Position.Magic()));
               decodeExpertMagic(my_Position.Magic());
               closePosition(pos_set,pos_get);
            }

В журнале

HE      0       14:42:36.653    Core 1  2018.04.01 00:00:00   Советник получил MAGIC = 171226312914601707.
JE      0       14:42:36.653    Core 1  2018.04.01 00:00:00   Советник WCInew_1.03 запущен на символе GBPUSD, период графика H1
KO      0       14:42:36.653    Core 1  2018.04.10 19:00:00   market sell 0.10 GBPUSD sl: 1.41792 (1.41592 / 1.41595 / 1.41592)
FL      0       14:42:36.653    Core 1  2018.04.10 19:00:00   deal #2 sell 0.10 GBPUSD at 1.41592 done (based on order #2)
HN      0       14:42:36.653    Core 1  2018.04.10 19:00:00   deal performed [#2 sell 0.10 GBPUSD at 1.41592]
RG      0       14:42:36.653    Core 1  2018.04.10 19:00:00   order performed sell 0.10 at 1.41592 [#2 sell 0.10 GBPUSD at 1.41592]
II      0       14:42:36.653    Core 1  2018.04.10 19:00:00   CTrade::OrderSend: market sell 0.10 GBPUSD sl: 1.41792 [done at 1.41592]
DK      0       14:42:36.653    Core 1  2018.04.10 19:00:00   magic = 171226312914601707
PS      0       14:42:36.653    Core 1  2018.04.10 19:00:00   balance = 9999.72
OI      0       14:42:36.653    Core 1  2018.04.10 19:00:00   lot = 0.10
CN      0       14:42:36.653    Core 1  2018.04.10 19:00:00   Sell market. Ticket = 2
JI      0       14:42:36.653    Core 1  2018.04.10 19:00:00   Открыта позиция SELL с тикетом 2
EH      0       14:42:36.653    Core 1  2018.04.10 21:59:58   stop loss triggered #2 sell 0.10 GBPUSD 1.41592 sl: 1.41792 [#3 buy 0.10 GBPUSD at 1.41792]
HF      0       14:42:36.653    Core 1  2018.04.10 21:59:58   deal #3 buy 0.10 GBPUSD at 1.41792 done (based on order #3)
GJ      0       14:42:36.653    Core 1  2018.04.10 21:59:58   deal performed [#3 buy 0.10 GBPUSD at 1.41792]
EL      0       14:42:36.653    Core 1  2018.04.10 21:59:58   order performed buy 0.10 at 1.41792 [#3 buy 0.10 GBPUSD at 1.41792]
HQ      0       14:42:36.653    Core 1  2018.04.19 00:00:00   Закрываем позицию SELL...
EH      0       14:42:36.653    Core 1  2018.04.19 00:00:00   Магик позиции = 0
MM      0       14:42:36.653    Core 1  2018.04.19 00:00:00   MAGIC выбран вручную.
GG      0       14:42:36.653    Core 1  2018.04.19 00:00:00   Сохранённый магик = 171226312914601707
QF      0       14:42:36.653    Core 1  2018.04.19 00:00:00   Ошибка магика.
JQ      0       14:42:36.653    Core 1  2018.04.19 00:00:00   GetLastError = 0
FK      3       14:42:36.653    Core 1  2018.04.19 00:00:00   ExpertRemove() function called
 

А теперь самое интересное....

Эксперт выставлял позицию со стоп-лоссом.

Как только указываю выставление позиции без стопов - всё работает без сбоев!

Каким боком и почему выставление стопов влияет на магик???

 

Изменил чутка функцию закрытия позиции

//+------------------------------------------------------------------+
bool closePosition(MyPositionSet &pos_s, MyPositionGet &pos_g)
{
   ResetLastError();
   
   if(my_Position.Select(Symbol()) && my_Position.SelectByMagic(Symbol(),pos_s.magic))
   {
      if(my_Position.SelectByTicket(pos_g.ticket))
      {
         if(my_Trade.PositionClose(pos_g.ticket) && my_Trade.ResultRetcode() == TRADE_RETCODE_DONE)
         {
            Print("Позиция с магиком "+string(pos_s.magic)+" и тикетом "+string(pos_g.ticket)+" успешно закрыта.");
            clearData(pos_s,pos_g);
         }
         else 
         {
            Print("ОШИБКА ЗАКРЫТИЯ ПОЗИЦИИ = "+IntegerToString(my_Trade.ResultRetcode()));
            Print(GetLastError());
            ExpertRemove();
         }
      }
      else
      {
         Print("Тикет не существует = "+string(pos_g.ticket));
         Print("GetLastError = "+string(GetLastError()));
         ExpertRemove();
      }
   }
   else 
   {
      if(!my_Position.Select(Symbol())) Print("Ошибка выбора позиции по символу "+Symbol());
      if(!my_Position.SelectByMagic(Symbol(),pos_s.magic)) Print("Ошибка выбора позиции по магику.");
      Print("GetLastError = "+string(GetLastError()));
      ExpertRemove();
   }
   
   return(true);
}
//+------------------------------------------------------------------+

И вообще офигел...

  Советник получил MAGIC = 171226312914601707.                                  // это получен при инициализации
  Советник WCInew_1.03 запущен на символе GBPUSD, период графика H1
  market sell 0.10 GBPUSD sl: 1.42959 (1.42559 / 1.42562 / 1.42559)
  deal #2 sell 0.10 GBPUSD at 1.42559 done (based on order #2)
  deal performed [#2 sell 0.10 GBPUSD at 1.42559]
  order performed sell 0.10 at 1.42559 [#2 sell 0.10 GBPUSD at 1.42559]
  CTrade::OrderSend: market sell 0.10 GBPUSD sl: 1.42959 [done at 1.42559]
  magic = 171226312914601707                                                    // это получен после открытия позиции
  balance = 9999.71
  lot = 0.10
  Sell market. Ticket = 2
  Открыта позиция SELL с тикетом 2
  stop loss triggered #2 sell 0.10 GBPUSD 1.42559 sl: 1.42959 [#3 buy 0.10 GBPUSD at 1.42959]
  deal #3 buy 0.10 GBPUSD at 1.42959 done (based on order #3)
  deal performed [#3 buy 0.10 GBPUSD at 1.42959]
  order performed buy 0.10 at 1.42959 [#3 buy 0.10 GBPUSD at 1.42959]
  Закрываем позицию SELL...
  Магик позиции = 171226312914601707                                            // это получен перед вызовом закрытия позиции
  Советник WCInew_1.03 запущен на символе GBPUSD, период графика H1             // это получен перед вызовом закрытия позиции
  Ошибка выбора позиции по символу GBPUSD                                       // это ошибка в функции закрытия
  Ошибка выбора позиции по магику.                                              // это ошибка в функции закрытия
  GetLastError = 4753								// это ошибка в функции закрытия
  ExpertRemove() function called

А вот без установки стопа

Открыта позиция SELL с тикетом 8
market buy 0.10 GBPUSD, close #8 (1.32826 / 1.32830 / 1.32826)
deal #9 buy 0.10 GBPUSD at 1.32830 done (based on order #9)
deal performed [#9 buy 0.10 GBPUSD at 1.32830]
order performed buy 0.10 at 1.32830 [#9 buy 0.10 GBPUSD at 1.32830]
CTrade::OrderSend: market buy 0.10 GBPUSD [done at 1.32830]
Позиция с магиком 171226312914601707 и тикетом 8 успешно закрыта.
final balance 10344.52 USD
 
Ежики кололись, плакали, но продолжали жрать кактусы.
MT4Orders
MT4Orders
  • www.mql5.com
Данная библиотека позволяет работать с ордерами в MQL5 (MT5-hedge) точно так же, как в MQL4. Т.е. ордерная языковая система (ОЯС) становится идентичной MQL4. При этом сохраняется возможность параллельно использовать MQL5-ордерную систему. В частности, стандартная MQL5-библиотека будет продолжать полноценно работать. Выбор между ордерными...
 
Andrey Khatimlianskii:
Ежики кололись, плакали, но продолжали жрать кактусы.

И как это поможет понять зависимость магика и тикета от открытия позиции с/без стопа?

 
Сергей Таболин:

И как это поможет понять зависимость магика и тикета от открытия позиции с/без стопа?

Попробуйте, это не страшно. На MQL4 писали?

 
Andrey Khatimlianskii:

Попробуйте, это не страшно. На MQL4 писали?

Нет. Только на 5-ке.

И разве тут дело в коде? 

 
Сергей Таболин:

Нет. Только на 5-ке.

И разве тут дело в коде? 

Тогда ладно. Но все равно было бы проще разобраться.

Я, к сожалению, не помогу.

 
Сергей Таболин:

Дело в том, что один и тот же код на одном и том же символе, на одном и том же ТФ но в одном конкретном советнике тупо не работает...

Это вывод из работающего

А это из не работающего

Что за беда?

Хотите найти ошибку: упростите код. Максимально упростите. И Вам станет понятнее, всё равно по вырванным кускам ничего не понятно.

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