Крик души!

 

Ребят, но это ж вообще пипец какой-то... но разве так можно?

Когда-то про сравнение переменных дабл говорили использовать нормализацию. Фиг с ним, когда сравниваешь какие-то "левые" даблы, но когда берёшь цены ордеров или текущие курсы. Ведь всегда известно какая точность у той или иной валюты по дигитс.

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

   double st=NormalizeDouble(ObjectGet("st",OBJPROP_PRICE1),Digits);
   double p1=st-100*Point;
   int ticket = OrderSend(Symbol(),OP_BUYSTOP,0.1,p1,10,0,0,NULL,0,0,CLR_NONE);
   
   OrderSelect(ticket,SELECT_BY_POS);
   if(OrderOpenPrice()!=p1) OrderDelete(OrderTicket());

НО ... если последнюю строчку меняем на

if(MathAbs(OrderOpenPrice()-p1)>Point)

то всё великолепно начинает работать - ордер один раз выставился и ждёт своей участи.

Переменная st, можно сказать, что статическая, потому что объект не двигается. Цена открытия/закрытия у исполненных ордеров, допускаю, может "чуток" сдвигаться в пределах поинта из-за проскальзывания, но у не исполненных отложенных? почему она меняется?

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

Ответ, что это замедлит выполнение советников, вообще не вариант, потому что нормализацию либо мы делаем через интерпритируемый код, либо вы на уровне ядра. На уровне ядра наоборот быстрее будет.

Вы когда-нибудь это исправите?

 

OrderSelect(ticket,SELECT_BY_POS); ???????

тогда уж OrderSelect(ticket,SELECT_BY_TICKET);

или for(int i=OrderTotal()-1;i>=0;i--) { и т.д.}

 
p1 не нормализована
 
дабл он и в африке дабл, так что нормализация рулит.
 
FAQ:
дабл он и в африке дабл, так что нормализация рулит.
Нормализация не проблема! Вот бы "робастность" советника запрограммировали на "уровне ядра"! Было бы то, что нужно! ;))
 
borilunad:
Нормализация не проблема! Вот бы "робастность" советника запрограммировали на "уровне ядра"! Было бы то, что нужно! ;))

Кнопка "БАБЛО" рулит
 
Sepulca:

OrderSelect(ticket,SELECT_BY_POS); ???????

Угу. Явный косяк.

 
kermit:

Ребят, но это ж вообще пипец какой-то... но разве так можно?

1. Запомните, когда Вы выполняете арифметические действия над числами, Вы не имеете права надеяться на получение нормализованного результата.

У Вас в коде:

double p1=st-100*Point;

2. А этот подход правильный:

if(MathAbs(OrderOpenPrice()-p1)>Point)

но я обычно с половиной Поинта сравниваю.

 
FAQ:

Кнопка "БАБЛО" рулит
Наконец, вразумили! Сейчас зарулю! Её только и не хватало. Но тут называется "PASTA"! Cпасибо!
 
borilunad:
Наконец, вразумили! Сейчас зарулю! Её только и не хватало. Но тут называется "PASTA"! Cпасибо!

Буду знать, спасибо :)