Советник неправильно открывает сделки. Что не так?

 
Код в файле приложен. Открытие по пересечению МА, закрытие по SL или TP, без наворотов. Некоторые переменные остались от трейлинга такчто не обращайте внимания. При тестировании на демо, открывает ордра когда текущий бар пересекает МА. Помогите пожалуйста, вроде все просто, но не работает.
Файлы:
 
ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,3,Ask-sl*Point,Ask+tp*Point);
Это у Вас в коде. А теперь посмотрите в справке сколько параметров у функции OrderSend()
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE) 
 
В некоторых случаях можно не все параметры функции указывать. Но неизвестно как это понравится компилятору. Поэтому во избежание недоразумений, лучше указывать все параметры.
 

Судя по коду, сделка на бай должна открыться, когда предыдущий уровень средней проходит через предыдущую свечу, а нулевая - выше, т.е. практически всегда, когда Close предыдущей свечи выше средней.
Можно заменить
if (Open[1] < ma1 && Close[1] > ma1)
на
if (Close[1] < ma1)
Функция OrderSend() написана правильно, такая запись допускается.

 
Знаю, что допускается, но лучше всё же писать всё полностью....
 
AllyAA >>:
Код в файле приложен. Открытие по пересечению МА, закрытие по SL или TP, без наворотов. Некоторые переменные остались от трейлинга такчто не обращайте внимания. При тестировании на демо, открывает ордра когда текущий бар пересекает МА. Помогите пожалуйста, вроде все просто, но не работает.

а что конкретно не работает-то?

у вас в коде написано так: советник открывает ордер не просто когда текущий бар пересекает машку, а только в том случае, если предыдущий ее тоже пересек в том же направлении. Т.е. для покупки необходимо, чтобы бар1 открылся ниже маши, закрылся выше, потом уже на баре0 цена снова ушла вниз, а потом на пересечении обратно вверх открываемся? Ваша логика именно такая?

 
Изначально было так:

if (Open[1] < ma1 && Close[1] > ma1 && Close[0] > ma0) 
 ticket = Otrdersend(.....);
 
Условие открытие можно выразить словами так: Если предидущий бар пересекает скользящую среднию (Open[1] < ma1 && Close[1]) и текущий бар закрылся выше/ниже скользящей средней то открываем ордер Buy/Sell.

Или это надо было сделать так:?

if (Open[2] < ma1 && Close[2] > ma1 && Close[1] > ma0) 
  ticket = Otrdersend(.....);


 
Да так надо было делать, разобрался. А как флет отфильтровать?
 
AllyAA >>:
Да так надо было делать, разобрался. А как флет отфильтровать?


Нужно взять фильтр флета и сунуть туда поток котировок.
Причина обращения: