Помогите найти ошибку

 

Пожалуйста, помогите найти ошибку!

Идея в следующем:

Две средних. От медленной, через одинаковый промежуток вверх и вниз проведено какое-то количество уровней (ну скажем 5 вверх, 5 вниз). Это та же самая МА, но сдвинутая по оси Y вверх-вниз.

Таким образом, если центральная МА имеет значение N, то сдвиг на один промежуток вверх даст нам (N+uroven), на два промежутка (N+uroven*2), вниз на один (N-uroven) ну и так далее. Эти МА дают нам уровни для открытия позиции. Пересечение быстрой МА любого уровня снизу вверх - открываем BUY, если быстрая МА продолжает пересекать уровни снизу вверх то держим открытую позицию.

Описываю это следующим образом:

for (int i=-kol_urov;i<=kol_urov;i++)
if ((MaFast1>MaSlow1+uroven*Point*i && MaFast2<=MaSlow2+uroven*Point*i) && OrderType()!=OP_BUY)
OpenBuyPoz; // Открытие Buy

где uroven - расстояние между уровнями (в пунктах)

kol_urov - кол-во уровней вверх и вниз от средней

На данный момент программа открывает позицию только при пересечении центральной МА, и не видит пересечений сдвинутых уровней. Help, pls!

 

Так в чём помочь-то ? Не открываются дополнительные позиции на каждом след. уровне?

Возьмите любой советник по мартингейлу и по образцу...

Скорее всего, мешает - вот это условие : OrderType()!=OP_BUY, которое разрешает открыть не более одной позиции бай

Да и вообще, как то не так у вас всё это....

 
https://www.mql5.com/en/code/8783
 
rid писал(а) >>

Так в чём помочь-то ? Не открываются дополнительные позиции на каждом след. уровне?

Возьмите любой советник по мартингейлу и по образцу...

Скорее всего, мешает - вот это условие : OrderType()!=OP_BUY, которое разрешает открыть не более одной позиции бай

Да и вообще, как то не так у вас всё это...

Больше одной позиции открывать и не требуется.

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

Для примера:

1. идет пересение уровня (N-uroven*2) - позиция не открывается;

2. идет пересение уровня (N-uroven*1) - позиция не открывается;

3. идет пересение средней (N) - открывается позиция.

 
satop писал(а) >>
https://www.mql5.com/en/code/8783

Да, идея аналогична, но в моем варианте количество уровней-оптимизируемый параметр, поэтому заранее прописать условие для каждого уровня не получится.

 
Veranika писал(а) >>

Пожалуйста, помогите найти ошибку!

Идея в следующем:

Две средних. От медленной, через одинаковый промежуток вверх и вниз проведено какое-то количество уровней (ну скажем 5 вверх, 5 вниз). Это та же самая МА, но сдвинутая по оси Y вверх-вниз.

Таким образом, если центральная МА имеет значение N, то сдвиг на один промежуток вверх даст нам (N+uroven), на два промежутка (N+uroven*2), вниз на один (N-uroven) ну и так далее. Эти МА дают нам уровни для открытия позиции. Пересечение быстрой МА любого уровня снизу вверх - открываем BUY, если быстрая МА продолжает пересекать уровни снизу вверх то держим открытую позицию.

Описываю это следующим образом:

for (int i=-kol_urov;i<=kol_urov;i++)
if ((MaFast1>MaSlow1+uroven*Point*i && MaFast2<=MaSlow2+uroven*Point*i) && OrderType()!=OP_BUY)
OpenBuyPoz; // Открытие Buy

где uroven - расстояние между уровнями (в пунктах)

kol_urov - кол-во уровней вверх и вниз от средней

На данный момент программа открывает позицию только при пересечении центральной МА, и не видит пересечений сдвинутых уровней. Help, pls!

Если сигналы срабатывают только при пересечении быстрой машки медленной, то это происходить может только если занулить вот эти штучки:

for (int i=-kol_urov;i<=kol_urov;i++)
   if((MaFast1>MaSlow1+uroven*Point*i && MaFast2<=MaSlow2+uroven*Point*i) && OrderType()!=OP_BUY)
      OpenBuyPoz; // Открытие Buy
а здесь ситуация по-моему такая - double*double*int - счётчик тоже дабл должен быть...
 

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

Что для реализации вышеописанного алгоритма работы нужно задействовать функцию определения наличия открытых позиций по их магику. Например, ф-ю И.Кима.
Вместо вот этого :
OrderType()!=OP_BUY
Нужно с помощью ф-и И.Кима определять, есть ли открытая позиции с магиком1,  или магиком 2, ...,  или магиком  n, - при соответсвующем 1,2, ...,n пересечении
'Полезные функции от KimIV'
Функция ExistPositions().


 
StatBars писал(а) >>

Если сигналы срабатывают только при пересечении быстрой машки медленной, то это происходить может только если занулить вот эти штучки:

а здесь ситуация по-моему такая - double*double*int - счётчик тоже дабл должен быть...

Спасибо за помощь! Совсем забыла о привидении типов в MQL4. В этом и была ошибка.

 

Всем большое спасибо за то, что не оставили мою тему без внимания.