Советника максимально отчистил от кода, чтобы локализовать проблему.
Разве ж это максимальное очищение от кода? Там ещё чистить - не перечистить. Да и где там локализация проблемы? Ваша фраза "советник прекращает торговать" - это ничуть не локализация. Тут же не клуб телепатов.
На вашем месте я бы потрудился указать конкретное место в коде, которое начинает работать неправильно после удаления Print, и что именно работает неправильно: проверка каких-то условий, либо функция не запускается, и т.д.
После компиляции показываются варнинги:
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};
После компиляции показываются варнинги:
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 может влиять на работу советника.
Спасибо, Вы правы, если инициировать переменные со значением, то все работает.
Хотя в документации полно примеров с инициализацией переменных без значений. К тому же все равно не понятно как Print может влиять на работу советника.
Да, принт никак не влияет, просто в одном случае какие-то оптимизации в компиляторе как-то по другому обрабатывают ваш кусок кода с неинициализированной переменной. Стандартных правил как действовать клмпилятору в такой ситуации нету, всё случайно.
Если в переменную что-то пишется до того как в первый раз из неё будет прочитано - инициализировать при декларации необязательно, таких примеров много, согласен. Но вы из неё читаете как раз до того как в неё пишете, даже варниниги были.
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.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Начал писать советника и обнаружил, что если комментирую или удаляю строку с функцией Print, то советник прекращает торговать.
Как такое может быть?
Советника максимально отчистил от кода, чтобы локализовать проблему.
Советник прилагаю, строка 95: Print (Sredn_dlina_s_hvostom);
тестировал на EURUSD M20 01.01.2016-20.05.2016