Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Code Base поможет в усвоении теоретических знаний. Заходи и изучай!
Dmitriy Voevodkin
558
Dmitriy Voevodkin 2013.08.21 09:44 

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

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

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

   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, можно сказать, что статическая, потому что объект не двигается. Цена открытия/закрытия у исполненных ордеров, допускаю, может "чуток" сдвигаться в пределах поинта из-за проскальзывания, но у не исполненных отложенных? почему она меняется?

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

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

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

Mikhail Kozhemyako
1169
Mikhail Kozhemyako 2013.08.21 10:02  

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

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

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

Dmitry Fedoseev
41184
Dmitry Fedoseev 2013.08.21 10:05  
p1 не нормализована
Рустам
3601
Рустам 2013.08.21 10:30  
дабл он и в африке дабл, так что нормализация рулит.
Boris
3883
Boris 2013.08.21 15:01  
FAQ:
дабл он и в африке дабл, так что нормализация рулит.
Нормализация не проблема! Вот бы "робастность" советника запрограммировали на "уровне ядра"! Было бы то, что нужно! ;))
Рустам
3601
Рустам 2013.08.21 15:03  
borilunad:
Нормализация не проблема! Вот бы "робастность" советника запрограммировали на "уровне ядра"! Было бы то, что нужно! ;))

Кнопка "БАБЛО" рулит
PapaYozh
3768
PapaYozh 2013.08.21 15:27  
Sepulca:

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

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

PapaYozh
3768
PapaYozh 2013.08.21 15:30  
kermit:

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

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

У Вас в коде:

double p1=st-100*Point;

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

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

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

Boris
3883
Boris 2013.08.21 18:21  
FAQ:

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

Буду знать, спасибо :)
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий