Что случилось с Trade.mqh ?

 

Сразу хочу сказать, что проблемы начались позавчера. До этого этот код работал без нареканий.

#include <Trade\Trade.mqh>           // подключаем библиотеку для совершения торговых операций
CTrade   my_CTrade;                  // структура для выполнения торговых операций
................
................
   ResetLastError();
   my_CTrade.SetExpertMagicNumber(magic_set);
   
   if(my_CTrade.RequestMagic() != magic_set)
   {
      Print("Ошибка присвоения магика советнику. LastError = "+string(GetLastError()));
      Print("RequestMagic = "+string(my_CTrade.RequestMagic()));
      return(-1);
   }

Так вот, с воскресения код постоянно возвращает 

2019.11.26 15:22:38.106 Core 1  2018.04.01 00:00:00   Магик 27100171226312914 выбран автоматически.
2019.11.26 15:22:38.106 Core 1  2018.04.01 00:00:00   Ошибка присвоения магика советнику. LastError = 0
2019.11.26 15:22:38.106 Core 1  2018.04.01 00:00:00   RequestMagic = 0

Что случилось? Почему?

П.С. if() я добавил уже после того как начал получать ошибки проверки магика.

 

Не смущает, то что RequestMagic это

Возвращаемое значение

Идентификатор эксперта, использованный в последнем запросе.


То есть пока нет запроса - проверять так нельзя.

Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / RequestMagic
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / RequestMagic
  • www.mql5.com
Стандартная библиотека / Торговые классы / CTrade / RequestMagic - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

Не смущает, то что RequestMagic это

Возвращаемое значение

Идентификатор эксперта, использованный в последнем запросе.


То есть пока нет запроса - проверять так нельзя.

Дело в том, что у меня начались проблемы при

bool  customCPosition::closePosition(bool clear_data=false)
{
   ResetLastError();
   Print("====== "+__FUNCSIG__+" ======");
   if(my_Position.SelectByMagic(Symbol(),structPosPrep.magic))
   {
   else 
   {
      Print("GetLastError = "+string(GetLastError()));
      Print("Ошибка выбора позиции по магику "+string(my_Trade.RequestMagic())+" /// "+string(structPosPrep.magic));
      ExpertRemove();
   }

и my_Trade.RequestMagic() тут начал выдавать 0.

Ошибка выбора позиции по магику 0 /// 27100171226312914
 
Это только означает, что Вы где-то сами зануляете structPosPrep.magic
 
Vladimir Karputov:
Это только означает, что Вы где-то сами зануляете  structPosPrep.magic

Ага, до выходных не занулял, а тут занулил )))

При инициализации магик получает значение -1.

customCPosition::customCPosition()
{
   initStruct();
   readPositionFile();
   if(structPosPrep.magic < 0) initMagic();
   PersonalCMagic.decodeExpertMagic(structPosPrep.magic);
}
//+------------------------------------------------------------------+
void  customCPosition::initMagic(void)
{
   Print(__FUNCSIG__);
   structPosPrep.magic = PersonalCMagic.codeExpertMagic(program_name, program_version);
   //PersonalCMagic.decodeExpertMagic(structPosPrep.magic);
}
//+------------------------------------------------------------------+
void  customCPosition::initStruct()
{
   structPosPrep.SL                    = NULL;
   structPosPrep.TP                    = NULL;
   structPosIdTicBal.position_ID       = -1;
   structPosIdTicBal.position_ticket   = -1;
   structPosIdTicBal.start_balance       = AccountInfoDouble(ACCOUNT_BALANCE);
   structPosPrep.limit_count           = 0;
   structPosPrep.limit_set             = false;
   structPosPrep.magic                 = -1;

Кроме того, в OnInit добавил дополнительную проверку

   if(cst_Position.structPosPrep.magic == -1)
   {
      cst_Position.structPosPrep.magic = PersonalCMagic.codeExpertMagic(program_name, program_version);
      if(cst_Position.structPosPrep.magic == -1) cst_Position.structPosPrep.magic = 0;
   }

Другими словами, неоднократный вызов .SetExpertMagicNumber(...) устанавливает магик в 0.

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


Другими словами, неоднократный вызов .SetExpertMagicNumber(...) устанавливает магик в 0.

Пример покажите - цикл из нескольких присвоений SetExpertMagicNumber и проверки его через CTrade

 
Vladimir Karputov:

Пример покажите - цикл из нескольких присвоений SetExpertMagicNumber и проверки его через CTrade. 

Вот мой тестовый. Работал. А теперь перестал.

Файлы:
MT5.zip  171 kb
 
Сергей Таболин:

Вот мой тестовый. Работал. А теперь перестал.

Ну правильно - генерируете свой magic, а потом пытаетесь его сравнить с 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Что случилось с Trade.mqh ?

Vladimir Karputov, 2019.11.26 13:34

Не смущает, то что RequestMagic это

Возвращаемое значение

Идентификатор эксперта, использованный в последнем запросе.


То есть пока нет запроса - проверять так нельзя.


а там "0".

 
Vladimir Karputov:

Ну правильно - генерируете свой magic, а потом пытаетесь его сравнить с 


а там "0".

Ну хорошо. А как узнать магик присвоенный эксперту?

И ещё раз повторю. До недавнего времени я не проводил этого сравнения. Добавил его только после того, как появилась ошибка выбора позиции по магику. И там запрос магика возвращал 0.

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

Ну хорошо. А как узнать магик присвоенный эксперту?

И ещё раз повторю. До недавнего времени я не проводил этого сравнения. Добавил его только после того, как появилась ошибка выбора позиции по магику. И там запрос магика возвращал 0.

А не ВЫ любите линковать папки? Если так - вероятно Вы повредили библиотеку.


А magic присвоенный не узнать никак - потому что раньше никто даже о таком и не спрашивал.

 
Добавлено: сколько объектов класса CTrade Вы используете в своём коде? И что потом сравниваете: данные глобального объекта с объектами из включаемых файлов?
Причина обращения: