Вопрос к опытным програмистам.

 
Здравствуйте. Вопрос к програмистам. Ситуация такая: открыта позиция Buy. Ее закрытие будет только при соприкосновении со средней линией Боллинджера (не закрытие бара выше или ниже этой линии, а именно соприкосновение на текущем баре). Я нашел такой код:

double bbm = iBands_m(0,0,20,2,0,PRICE_CLOSE,MODE_SMA,0); // средняя линия Болинджера
if ( NormalizeDouble( MathAbs( bbm - Bid ), Digits ) < Point ) // равен текущей цене
{
OrderClose(order_id);
return(0);
}
Со средней линией болинджера понятно,то что NormalizeDouble необходима для нормализации цен немного понвятно (хотя для чего это), а вот с условием равенства цен объясните пожалуйста,  1) Для цего здесь математ. функция делающая результат положительным (модуль),   2) MathAbs( bbm - Bid ) - сравнивает цены с линией болинджера. Но мне видится здесь арифметическая операция вычитание. Может при вычитании должен получиться ноль, и тогда соприкасновение значит состоялось? 3) для чего полученное выше нормализованное значение сравнивается с Point?
 
Если цена находится вблизи центральнйо линии на расстоянии менее 1 пункта - закрывать. MathAbs, для того, чтобы просто расстояние измерить, независимо от того выше цена или ниже центральной линии. 
 
Попробую сойти за опытного. Считаю, что код написан некорректно, но будет срабатывать из трех два раза. Значение <Point - это и есть ноль. При простом вычитании нуля может и не быть никогда, будет скакать из положительных значений в отрицательные и наоборот и в данном случае модуль здесь бесполезен. Обычно пересечение кривых считается легко, сравнивая значения в настоящий момент со значением на предыдущем баре. Если знаки поменялись или сравнялись, то пересечение состоялось.
 
Roger:
Попробую сойти за опытного. Считаю, что код написан некорректно, но будет срабатывать из трех два раза. Значение <Point - это и есть ноль.

Согласен, на тоненького, слишком узенькая грань, а если геп пипса 3? Надо рассматривать два случая, конкретно для касания сверху и снизу:

Касание снизу if (Bid>=bbm), сверху if (Bid<=bbm).

 
Figar0:
Roger:

Попробую сойти за опытного. Считаю, что код написан некорректно,
но будет срабатывать из трех два раза. Значение <Point - это и
есть ноль.


Согласен, на тоненького, слишком узенькая грань, а если геп пипса
3? Надо рассматривать два случая, конкретно для касания сверху
и снизу:



Касание снизу if (Bid>=bbm), сверху if (Bid<=bbm).





Если я правильно понял при большом скачке (гэпе) закрыти может просто не сработать.
Может тогда нужно задать диапазон (для проскальзывания) price+-slippage???
И еще даже при гэпе пересечение текущей цены все равно будет со средней линией. Разве по этому коду советник "не увидит" этого, уже состоявшегося пересечения???
 
Немного был не прав, не пункт, а пол пункта с одной стороны или пол пункта с другой стороны.
 

пересечение сверху вниз - Low на предыдущем баре > предыдущего значения BB, на текущем Low<= текущему значению bb, в другую сторону - наоборот. Так будет надежно работать. Еще надо нормализовать на 8 знаков значение цены и индикатора.

 
Integer:

пересечение сверху вниз - Low на предыдущем баре > предыдущего
значения BB, на текущем Low<= текущему значению bb, в другую сторону
- наоборот. Так будет надежно работать. Еще надо нормализовать
на 8 знаков значение цены и индикатора.







Но в Коде вродебы прописывается нормализация цены
NormalizeDouble( MathAbs( bbm - Bid ), Digits. Digits означает уточнение до 8 цифр?!
 
Kostay:
Figar0:


Согласен, на тоненького, слишком узенькая грань, а если геп пипса
3? Надо рассматривать два случая, конкретно для касания сверху
и снизу:



Касание снизу if (Bid>=bbm), сверху if (Bid<=bbm).





Если я правильно понял при большом скачке (гэпе) закрыти может просто не сработать.
Может тогда нужно задать диапазон (для проскальзывания) price+-slippage???
И еще даже при гэпе пересечение текущей цены все равно будет со средней линией. Разве по этому коду советник "не увидит" этого, уже состоявшегося пересечения???



Правильно. Не зная логики эксперта, сложно давать советы. Но Slippage точно не при делах, это проскальзывание при исполнении приказа (открытие/закрытие).

Если предположить, что Вы, например, хотите закрыть ордер при касании средней снизу, то при при резком пересечение этой средней гепом в 10 пунктов уже не хотите? ( а на реале гепы и в 20-30 пунктов не редкость) Если все равно хотите, то мой вариант должен подойти и работать даже без нормализации, она тут не к чему, имхо. Но тогда уже скорее придется брать в расчет и тип ордера.

 
Kostay:
Integer:

пересечение сверху вниз - Low на предыдущем баре > предыдущего
значения BB, на текущем Low<= текущему значению bb, в другую сторону
- наоборот. Так будет надежно работать. Еще надо нормализовать
на 8 знаков значение цены и индикатора.







Но в Коде вродебы прописывается нормализация цены
NormalizeDouble( MathAbs( bbm - Bid ), Digits. Digits означает уточнение до 8 цифр?!

Digits это 4 или 2 знака.
 
Не буду открывать новую тему. Есть еще один вопрос.
Задача такая: Есть гланая линия стахастика и нас интересует некоторые  значения стахастика с понижающимися барами (черные свечи) и некоторые с повышающимися барами (белыми свечами); как выделить такие значения стахастика.
У меня получился такой код, но в правильности его сильно сомневаюсь:

double S1, S2, S3, S4;
int S1Bar, S2Bar, S3Bar, S4Bar;

S1=iStochastic(0,0,5,3,3,MODE_SMA,0,MODE_MAIN,S1Bar);
S2=iStochastic(0,0,5,3,3,MODE_SMA,0,MODE_MAIN,S2Bar);
S3=iStochastic(0,0,5,3,3,MODE_SMA,0,MODE_MAIN,S3Bar);
S4=iStochastic(0,0,5,3,3,MODE_SMA,0,MODE_MAIN,S4Bar);

S1Bar=(Close>Open);
S2Bar=(Close>Open);
S3Bar=(Close<Open);
S4Bar=(Close<Open);

Сомневаюсь что правилльно описал свечи, но подругому не заю как.
Причина обращения: