Поясните пожалуйста

 

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

if(!OrderSelect(TicketSell[ms2],SELECT_BY_TICKET)){
  WriteError(TicketSell[ms2]);
  Print("Ошибка возникла в функции ModifyAllSell() (OrderSelect)");
}
else{  
  if(ms2==ms1){// ордер стартовый - меняем только SL  
    SLoS=BezubSell-LastTakeProfit*Point;
    SLoS=NormalizeDouble(SLoS,digits);
    RefreshRates();
    if(OrderStopLoss()!=SLoS){
    Print("SLoS = ",SLoS);
    Print("OrderStopLoss() = ",OrderStopLoss());
    Print("Для стартового Селл-ордера OrderStopLoss()!=SLoS");
    if(!OrderModify(TicketSell[ms2],OrderOpenPrice(),SLoS,OrderTakeProfit(),0,CLR_NONE)){
      WriteError(TicketSell[ms2]);
      Print("Модификация стртового Sell-ордера № ",TicketSell[ms2]," вернула ошибку ModifyAllSell()");
    }
    else{//вносим новые значения в массив 
      StopLossSello[ms2]=SLoS;
      Print("OrderStopLoss() Sell-ордера № ",TicketSell[ms2]," = ",StopLossSello[ms2]);
    }
  }  
}
Вот иллюстрация того, как сработал код в тестере

Как видно из кода, сначала мы выбираем ордер с заданным тикетом. Если ордер нормально выбран и при этом если стоп-лосс ордера не равен тому значению, которое мы рассчитали и нормализовали, то происходит модификация - перемещаем стоп-лосс в рассчитанную точку.

Снятие дампа данных показало, что OrderStopLoss() и рассчётная величина SLoS равны между собой. Однако терминал их не распознаёт как равные и пытается модифицировать стоп-лосс заново, хотя это уже и не нужно. 

В силу того, что рассчётная величина нормализована, может нужно после вызова функции OrderStopLoss() проводить нормализацию и возвращаемого ею значения?

На счёт переменной digits можно не волноваться - там выше по коду я написал следующее:

// ------- Вспомогательные переменные ---------

string SMB;

int digits;

// ---- Инициализация советника -----------

int init(){
  SMB=Symbol(); 
  digits=MarketInfo(SMB,MODE_DIGITS);
........

Поясните пожалуйста сей глюк работы терминала (билд 211).

 
Может вместо:
 if(OrderStopLoss()!=SLoS) 

Написать:
 if(OrderStopLoss()> SLoS || OrderStopLoss()< SLoS) 
 
SLoS=NormalizeDouble(SLoS,digits);//вот тут ты пронормализовал
RefreshRates();//а это здесь вообще не нужно т.к. не сработает
if(OrderStopLoss()!=SLoS){//а вот тут забыл пронормализовать OrderStopLoss()
 
строку
if(OrderStopLoss()!=SLoS){
заменил на 
if(NormalizeDouble(OrderStopLoss(),digits)!=SLoB){
и всё заработало. Я в шоке

Ни когда ранее не приходилось так изголяться.

 
Roger:

    SLoS=NormalizeDouble(SLoS,digits);//вот тут ты пронормализовал
    RefreshRates();//а это здесь вообще не нужно т.к. не сработает
    if(OrderStopLoss()!=SLoS){//а вот тут забыл пронормализовать OrderStopLoss()

 


Да, можно попробывать и так, но у меня в стопах так (ненормализованно):
if(OrderStopLoss()<NormalizeDouble(Bid-Point*TrailingStop, Digits))
И ошибки нет.
 
drknn:
строку
if(OrderStopLoss()!=SLoS){
заменил на 
if(NormalizeDouble(OrderStopLoss(),digits)!=SLoB){
и всё заработало. Я в шоке

Ни когда ранее не приходилось так изголяться.



Ну и хорошо что работает. Я вот только перед началом Чемпионата узнал что нужно всё это дело нормализовывать. Сам офигевал, а щас привык. :)
 
И ошибки нет.
До поры, пока значения сильно различаются. А при ловле блох даст о себе знать.
 
Roger:

    SLoS=NormalizeDouble(SLoS,digits);//вот тут ты пронормализовал
    RefreshRates();//а это здесь вообще не нужно т.к. не сработает
    if(OrderStopLoss()!=SLoS){//а вот тут забыл пронормализовать OrderStopLoss()
 

Спасибо всем, что откликнулись. Я пишу не для чемпионата, но работа ответственная, поэтому приходится каждую буквочку учитывать.

Roger, по поводу RefreshRates() - эта команда тут на своём месте - я не показал в коде, что там цикл пробегает по массиву тикетов и выбирает для модификации ордер за ордером. Если цикл не успеет закончиться, а новый тик уже пришёл, то без команды RefreshRates() тут не обойтись.

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