Подскажите, где тут ошибки проверки баланса и проверки формирования новой свечи?

 

Подскажите, почему при удалении устаревших, двух ордеров, лот накручивается лишний раз и из-за этого тест останавливается? По моей логике, должен накручиваться (но видимо не обязан))), только тогда, когда остался ордер один из двух и баланс меньше того, чем до начала серии. Может просто поспать?)))

Ну и контроль по времени не работает, подскажите, что не так -

if (Hour()<9 && Hour()>=21) return(0); 

Комменты пред функциями не все соответствуют действительности, т.к. переделываю свой старый советник.

СыПасибо!

Первый раз:

Второй и он же последний раз:

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

Так удаляются устаревшие ордера по времени без увеличения лота или не устаревшие для увеличения лота, и это не говорит, что нужно возвращать лот, т.к. баланс еще меньше начального, т.е. получали лосей.

Лот должен возвращаться, только после получения профита.

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

В общем чем дальше, тем хуже... никак не въеду в код...

Подскажите, где тут ошибки проверки баланса и проверки формирования новой свечи?

if(OrdersTotal()==0) Enter();                         //если нет ордеров - установка ордеров
   
   if(OrdersTotal()==1){                                 // если остался один ордер, то проверяем прибыль
      abb=AccountBalance();                                
      if(abb<ab){                                        //если баланс меньше начального, умножаем лот
         ab=AccountBalance();
         Lot=Lot*xLots;
         DellAllOrders();
         Enter();
      }
      if(abb>ab){                                        //если баланс от сделки положительный, то лот приравниваем к начальному
         ab=AccountBalance();
         Lot=Lots;
         if(OP==(iOpen(NULL,PER,0))){                     //и он не устарел, то ставим второй из этой пары
            WorkOrders();
            if(Type==0) Sell();
            if(Type==1) By();
         }
      }
   }
   
   if(OrdersTotal()>=1){                                  //если есть устаревшие отложенники, один или два
      if(OP!=(iOpen(NULL,PER,0))){
         WorkOrders();
         if(Type==4) DellAllOrders();
         if(Type==5) DellAllOrders();
          //Enter();
      }
   }  
 

Закоментировал умножение лотов

//Lot=Lot*xLots;

и всё работает нормально... не могу понять, как умножение лотов влечет ошибки в работе советника с кодом OrderSend error 131

 

Бред какой-то... Поставил вместо

Lot=Lot*xLots;
Lot=0.02;

.. заработало, но мне надо чтоб умножение было, по множителю xLots...