Скачать MetaTrader 5

Как Print влияет на торговлю?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Есть вопросы по реализации идеи? Обсуди их на форуме!
Сергей
82
Сергей 2016.05.20 21:27 

Начал писать советника и обнаружил, что если комментирую или удаляю строку с функцией Print, то советник прекращает торговать.

Как такое может быть?

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

Советник прилагаю, строка 95:               Print (Sredn_dlina_s_hvostom); 

тестировал на EURUSD M20  01.01.2016-20.05.2016 

Файлы:
Alexey Navoykov
3988
Alexey Navoykov 2016.05.21 01:58  
Сергей:
 

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

Разве ж это максимальное очищение от кода?  Там ещё чистить - не перечистить.  Да и где там локализация проблемы?  Ваша фраза "советник прекращает торговать" - это ничуть не локализация. Тут же не клуб телепатов. 

На вашем месте я бы потрудился указать конкретное место в коде, которое начинает работать неправильно после удаления Print, и что именно работает неправильно:  проверка каких-то условий, либо функция не запускается, и т.д.

Dr.Trader
3783
Dr.Trader 2016.05.21 04:44  

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

possible use of uninitialized variable 'Dlina_s_hvostom' zsv_vspleski.mq5 72 23

possible use of uninitialized variable 'Dlina_bez_hvosta' zsv_vspleski.mq5 73 26

possible use of uninitialized variable 'Dlina_s_hvostom' zsv_vspleski.mq5 76 35

possible use of uninitialized variable 'Dlina_bez_hvosta' zsv_vspleski.mq5 76 95

 

Это надо поправить, заменив

double Dlina_s_hvostom, Dlina_bez_hvosta; 

 на

double Dlina_s_hvostom = 0, Dlina_bez_hvosta = 0; 

 И тогда всё заработает.

 

 Вообще, всем переменным нужно присваивать значения при создании, иначе их значение может быть абсолютно случайным. Даже структурам:

MqlTradeRequest mrequest = {0}; // Будет использоваться для отсылки торговых запросов
MqlTradeResult mresult = {0}; // Будет использоваться для получения результатов выполнения торговых запросов
MqlRates mrate[];
MqlTick latest_price = {0};
Сергей
82
Сергей 2016.05.21 13:40  
Dr.Trader:

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

possible use of uninitialized variable 'Dlina_s_hvostom' zsv_vspleski.mq5 72 23

possible use of uninitialized variable 'Dlina_bez_hvosta' zsv_vspleski.mq5 73 26

possible use of uninitialized variable 'Dlina_s_hvostom' zsv_vspleski.mq5 76 35

possible use of uninitialized variable 'Dlina_bez_hvosta' zsv_vspleski.mq5 76 95

 

Это надо поправить, заменив

 на

 И тогда всё заработает.

 

 Вообще, всем переменным нужно присваивать значения при создании, иначе их значение может быть абсолютно случайным. Даже структурам:

Спасибо, Вы правы, если инициировать переменные со значением, то все работает.

Хотя в документации полно примеров с инициализацией переменных без значений. К тому же все равно не понятно как Print может влиять на  работу советника.

Andrey Barinov
39238
Andrey Barinov 2016.05.21 13:45  
Сергей:

Спасибо, Вы правы, если инициировать переменные со значением, то все работает.

Хотя в документации полно примеров с инициализацией переменных без значений. К тому же все равно не понятно как Print может влиять на  работу советника.

Print НИКАК не влияет на работу советника. Просто при повторном запуске эксперта в ваших неинициализированных переменных образовывались ДРУГИЕ значения, не такие как при первом запуске, и это уже могло повлиять на работу советника.
Dr.Trader
3783
Dr.Trader 2016.05.21 17:56  

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

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

    double Dlina_s_hvostom, Dlina_bez_hvosta; 
    int t=0;     
    for (i=kolvo_svechei; i<=sredn_svechi+kolvo_svechei; i++)
      {
      Dlina_s_hvostom=Dlina_s_hvostom+(mrate[i].high-mrate[i].low);

 я выделил красным то место где ваша логика пытается прочитать значение из неинициализированный пременной, в первом цикле for.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий