Посылается ордера без сигнала

 

 Я написал простой эксперт. Исходный код прилагаю. Писал для тестера, без соответствующих проверок под реал, для некоторых своих тестов.

  Эксперт получает сигнал от 2 функций т.е. общий сигнал на покупку или продажу состоит из 2 сигналов.

1-ый сигнал: быстрая машка выше медленной - покупка, быстрая ниже медленной - продажа.

2-ой сигнал зависит: если 1-ый сигнал на покупку, то считаются медвежьи бары, т.е. направленные вниз. Если кол-во медвежьих баров достигает значения cntDn значит происходит сигнал на покупку. Для продажи 2-ой сигнал наоборот: 1-ый сигнал на продажу, считаются бары бычьи. Если бычьих баров больше значения cntUp то получаем общий сигнал на продажу.

В исходном коде, ставлены комментарии, где нужно. Отчётливо видно, что код исполняется не так как должен.

Прошу обосновать что там не так.. Сигнал я объяснил. 

Вот, например, скрин:

Косяк с сигналом 

 Для продажи должны машки быть в режиме CROSS_DN т.е. быстрая ниже медленной, и бычьих баров 3. На скрине видно, что быстрая машка ниже медленной, НО бары не бычьи !!!. НО это сигнал на покупку, а не на продажу! Чтоб это за такое, прошу помоч понять причину не верного исполнения столь простого алгоритма.

Файлы:
 

Если писал самостоятельно - что мешает проверить логику открытия ордеров?

Или таки не сам? ;) 

 
Данный эксперт написан, разумеется мной. И как мне по Вашему проверить причину неверного посыла ордеров? Что касается логики открытия ордеров, так я прекрасно понимаю логику, да вот только, по какой-то причине она не выполняется как нужно. Вот и прошу более опытных подсказать.
 
Работает так, как и написан. Ошибка, по-моему, в том, что не проверяется пересечение машек, а просто берется их взаимное расположение на нулевом баре.
 
Roger:
Работает так, как и написан. Ошибка, по-моему, в том, что не проверяется пересечение машек, а просто берется их взаимное расположение на нулевом баре.


Так если нет пересечения средних, то сигнала не будет. Ведь условие не выполнится и функция GetStateOfMA() вернёт значение CROSS_NO т.е. пересечение отсуствует:

int GetStateOfMA()
{
   if (GetMA(1) > GetMA(2))
   {
       pr ("GetStateOfMA() = CROSS_UP");
       return (CROSS_UP);
   }
       
   if (GetMA(1) < GetMA(2))
   {
       pr ("GetStateOfMA() = CROSS_DN");
       return (CROSS_DN);
   }
       
    pr ("GetStateOfMA() = CROSS_NO");
    return (CROSS_NO);
}

 Вопрос остаётся открытым. Профессионалы отзовитесь! Нужен совет. Как вообще тут заниматься отладкой? Как искать ошбики? Ведь я распринтовал по цепочке алгоритм, но ордера посылаются без выполнения соответствующих функций.

 
А где Вы увидели, что здесь проверяется пересечение? 1 - это быстрая на нулевом, а 2 - медленная. Где проверка на предыдущем баре? Или я чего не догоняю?
 
Roger:
А где Вы увидели, что здесь проверяется пересечение? 1 - это быстрая на нулевом, а 2 - медленная. Где проверка на предыдущем баре? Или я чего не догоняю?


То что проверялось значение положения машек друг относительно другой на 0 баре, это я уже переработал :( Уже исправил. А вот причину проверки пересечения я не понял. Ведь сигнал будет только при наличии чёткого положения быстрой ниже или выше медленной, иначе сигнала нет! Зачем нам проверять место пересечения?

То что имеем на данный момент прилагаю к посту. Всё что было в библиотеке (2 функции я добавил в эксперт, чтоб можно было скомпилировать). 

Файлы:
scalper_hoz.mq4  14 kb
Причина обращения: