Подскажите, замучился совсем - страница 2

 
drknn:
Как видите, поза открыта только одна, а в журнале мы видим, что советник видит их аж пять штук.

Вам уже указали на 2 "недетских" ошибки, попробуйте исправить их.
for (i=OrdersTotal()-1;i>=0;i--)
{
     if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
        WriteError(i);
        Print("Ошибка вызвана из блока модификации Buy-ордеров (OrderSelect)");
        continue;
     }
     if(OrderSymbol()!=SMB) continue; // Если не наш - смотрим следующий 
     if(OrderType()==OP_BUY)
     {
        if(OrderStopLoss()<Point)
        {
            SL=NormalizeDouble(FractalDOWN()-Zazor*Point,digits);
            if( !OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,CLR_NONE) )
            {
               WriteError(i);
               Print("Ошибка вызвана из блока модификации Buy-ордеров (OrderModify)");
            }
        }
     }            
}
 

Хм, вообще-то в приведенном фрагменте лога нет ни одного принта из приведенного фрагмента кода. А у блока модификации Sell-ордеров отдельный цикл по ордерам? Этот-то закрыт

 
lna01:

Хм, вообще-то в приведенном фрагменте лога нет ни одного принта из приведенного фрагмента кода. А у блока модификации Sell-ордеров отдельный цикл по ордерам? Этот-то закрыт



Вот я сделал снимок той же ситуации с Бай-ордером. (Принт обвёл красным - смотрите такую же строку и на предыдущем скрине)
 

Нужен полный код. Попробуйте упростить советник так, чтобы и ошибка воспроизводилась и код можно было выложить

 
Код изменил в соответствии с Вашими рекомендациями. Всёравно при открытом ордере функция возвращает несуществующие номера в списке ордеров.
Файлы:
 
drknn:
Код изменил в соответствии с Вашими рекомендациями. Всёравно при открытом ордере функция возвращает несуществующие номера в списке ордеров.
Попробуйте запустить простой скрипт:
int start()
{
   Print( "OrdersTotal = ", OrdersTotal() );
   return(0);
}
и сравните распечатанный OrdersTotal с реальным количеством ордеров на закладке "Торговля".
 
Скрипт выдаёт верный результат. Я уже говорил об этом. Сейчас перепроверил. Так и есть. Скрипт пишет, что в рынке 1 ордер (и это верно), советник, что в рынке более одного ордера.
 
drknn:
Скрипт выдаёт верный результат. Я уже говорил об этом. Сейчас перепроверил. Так и есть. Скрипт пишет, что в рынке 1 ордер (и это верно), советник, что в рынке более одного ордера.
Теперь запустите советник с таким же кодом - появится ошибка?
Если нет, добавляйте по одной строке из вашего кода, пока не появится.
 

Я пока только просмотрел код и наткнулся на такую вещь:

i - объявлена глобально. Вот она используется как счётчик цикла по ордерам. А вот внутри этого цикла вызывается функция FractalDOWN(). А вот внутри этой функции цикл и эта же i (раз она объявлена глобально) используется как счётчик цикла по барам. Неконтролируемо изменять внутри цикла его счётчик это неплохой способ устроить полный бардак :). Не знаю, единственный ли это сюрприз, но для начала устраните его.

Кстати, всё-таки вызывать в init() функции связанные с рыночным окружением плохая практика. Вот здесь совсем свежий комментарий от Renat'почему-то не работает простейший индикатор?'

 
lna01:

Я пока только просмотрел код и наткнулся на такую вещь:


i - объявлена глобально. Вот она используется как счётчик цикла по ордерам. А вот внутри этого цикла вызывается функция FractalDOWN(). А вот внутри этой функции цикл и эта же i (раз она объявлена глобально) используется как счётчик цикла по барам. Неконтролируемо изменять внутри цикла его счётчик это неплохой способ устроить полный бардак :). Не знаю, единственный ли это сюрприз, но для начала устраните его.


Кстати, всё-таки вызывать в init() функции связанные с рыночным окружением плохая практика. Вот здесь совсем свежий комментарий от Renat'а 'почему-то не работает простейший индикатор?'



Нда, я должен был догадаться об объявлении глобальной переменной. Сбило с толку то, что при объявлении той же переменной (переменой с тем же именем) в каждой функции отдельно, при вызове функции выделяется под эту переменную отдельная область оперативной памяти.

Теперь запустите советник с таким же кодом - появится ошибка?
Если нет, добавляйте по одной строке из вашего кода, пока не появится.
И это я должен был предвидеть - сам неоднократно таким приёмом пользовался.

Спасибо большое всем, что откликнулись - я думал с ума сойду в поисках ошибки. Иной раз всё проходит гладко даже в сложных кодах, а иной раз и код простой и смотришь на него как баран на новые ворота и не можешь понять, почему оно не работает :)
Пошёл править код.
Причина обращения: