Подскажите, замучился совсем

 
Программирую уже более года на MQL4. Сделал на днях советника, кинул его на валютные пары - работает прекрасно. Но вот при работе с золотом, нефтью и индексами, ну, и тому подобными инструментами, выдаёт мне в функции OrdersTotal()то у меня открыто 10 ордеров, тогда как их реально в рынке открыто три. Кидаю скрипт с тем же самым кодом на график, и скрипт выдаёт правильный результат. Ошибка в советнике вызывается из блока модификации ордеров (больше то ей и появиться неоткуда, настолько прост советник). Вот блок кода, в котором возникает ошибка
for (i=OrdersTotal()-1;i>=0;i--){//Начало цикла
  if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {WriteError(i);Print("Ошибка вызвана из блока модификации Buy-ордеров");}
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){//начало работы с выбранным ордером    
    if(OrderSymbol()!=SMB) {continue;} // Если не наш - смотрим следующий 
    if(OrderType()==OP_BUY){
      if(OrderStopLoss()==0){
      if(TakeProfit==0){TP=Ask+1000*Point;} 
      else {TP=Ask+TakeProfit*Point;} 
      TP=NormalizeDouble(TP,digits);                
      SL=FractalDOWN()-Zazor*Point;                
      SL=NormalizeDouble(SL,digits);             
      Prise=OrderOpenPrice();                 
      Prise=NormalizeDouble(Prise,digits);    
      Ticket=OrderTicket();
      fm2=OrderModify(Ticket,Prise,SL,0,0,CLR_NONE);
      if(fm2==0 || fm2==-1){ModifError(i);} 
             }            }        }            }            }
Самое интересное, что изменение ДЦ дает те же самые результаты. Может я чего не знаю и при работе с CFD и Futures нужно что н-ть прописывать в коде?
 
Для начала попробуйте не кинуть, а аккуратно положить
 
Integer:
Для начала попробуйте не кинуть, а аккуратно положить

Мне нужна помощь, а не сарказм.
 
Одно из двух - либо ошибка в коде либо вы чего-то не понимаете.
 
for (i=OrdersTotal()-1;i>=0;i--)
{//Начало цикла
  if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
        WriteError(i);
        Print("Ошибка вызвана из блока модификации Buy-ордеров");
     }
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {//начало работы с выбранным ордером    
        if(OrderSymbol()!=SMB) continue; // Если не наш - смотрим следующий 
        if(OrderType()==OP_BUY)
          {
              if(OrderStopLoss()==0)
              {
                  if(TakeProfit==0) TP=Ask+1000*Point; 
                  else TP=Ask+TakeProfit*Point; 
 
                  TP=NormalizeDouble(TP,digits);                
                  SL=FractalDOWN()-Zazor*Point;                
                  SL=NormalizeDouble(SL,digits);             
                  Prise=OrderOpenPrice();                 
                  Prise=NormalizeDouble(Prise,digits);    
                  Ticket=OrderTicket();
                  fm2=OrderModify(Ticket,Prise,SL,0,0,CLR_NONE);
 
                  if(fm2==0 || fm2==-1) ModifError(i); 
              }            
          }        
      }            
}
 
я думаю так будет легче разобраться. И лучше всего выложи полный код советника.
 

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

Код выложить не могу - идея в него вложенная не является моей собственностью. Человек не хочет афишировать свою идею. Ладно, Бог с ним, администратор, закройте пожалуйста тему - буду копаться сам. Просто я думал, что кто-то уже с подобным сталкивался и может, расскажет в чём тут дело.

 
drknn:
Прежде, чем разбираться в коде, хотелось бы уточнить, где возникает ошибка, на real (demo) счёте или в тестере. Из сообщения неясно, судя фразе: "Кидаю скрипт " - в реале или демо, там Orders Total() врать не может, неважно, валюты, CFD или Futures. А отложники учитываете ?
 
Счёт Демо. Отложенных ордеров нет. Было открыто три ордера - один по золоту, один по DAX-у и один по нефти. Вот с ними-то и произошли чудеса. На валютных парах всё нормально.
 
drknn:
Счёт Демо. Отложенных ордеров нет. Было открыто три ордера - один по золоту, один по DAX-у и один по нефти. Вот с ними-то и произошли чудеса. На валютных парах всё нормально.

Из кода не видно, где Вы видите 10, вместо 3. Замечания по коду, будем ориентироваться на вариант klerka, где он убрал лишние скобки. Дважды анализируете OrderSelect() с одими тем же параметром, причём в первом случае, вызывате функцию WriteError(i), может она и не причём, что делает, неизвестно. Я бы использовал конструкцию if ..... else .... Надеюсь, в digits у Вас содержится Digits для Вашего SMB. Вызывает сомнение конструкция

fm2=OrderModify(Ticket,Prise,SL,0,0,CLR_NONE);
 
if(fm2==0 || fm2==-1) ModifError(i);

У Вас как определена fm2 , как int или как bool ? Компилятор здесь должен выдавать предупреждение о несоответствии типов при сравнении. У Вас какой Bild, 208 ?
Выражение в скобках может быть справедливо при любом результате вызова функции OrderModify() .

 
Как видите, поза открыта только одна, а в журнале мы видим, что советник видит их аж пять штук. Ошибка возникает в блоке модификации ордеров. Часть кода мной приведена для Бай-ордеров. Код для Селл-ордеров практически идентичен.

Переменная fm2 объявлена булевой переменной, как и положено для функции модификации. Билд терминала = 208. В предыдущих билдах такой ошибки не возникало.

Далее, на функцию WriteError() внимания не обращайте - она лишь говорит о том, что ошибка возникла такая-то и даёт русское описание ошибки. Функция проверена - ошибок в ней нет.
Результат работы этой функции мы как раз и видим в журнале.

Насчёт digits не сомневайтесь - я не мальчик и таких грубых промахов не делаю.
Причина обращения: