ma=iMA(NULL,0,MovingPeriod,0,MODE_EMA,PRICE_CLOSE,0);
Не правильней ли использовать для сравнения такой вариант?
ma1=iMA(NULL,0,MovingPeriod,0,MODE_EMA,PRICE_CLOSE,1);
Хм, не особо помогла, конечно :) (на тестере еще меньше стало профит показывать), но Ваша мысль подтолкнула к тому, чтобы учитывать еще значение Open текущего бара. После небольших манипуляций пришел к тому же результату, который выдавал исходный код :) то есть где-то в корне ошибся :( (хотя явных ошибок не замечаю что-то :( ). кто еще может помочь? :)
Посмотрите на это условие:
if(Open[1]<ma && Close[1]>ma) { ma1=ma;} if((ma1-ma)>=(SELL_LOW*Point)){
Если первое условие верно, то ма1 присваивается значение ма (которое вычислено и известно).
Тогда второе условие (ма1-ма) не выполняется так как результат условия равен нулю а не
(SELL_LOW*Point)
А если же первое условие не выполнено, то ma1 либо равно нулю (с момента инициализации) либо равно давнему значению ma.
Тогда второе условие (
(ma1-ma)
либо равно -ma (минус) либо опять нулю.
Может лучше проводить проверку на открытие позиции например так:
ma=iMA(NULL,0,MovingPeriod,0,MODE_EMA,PRICE_CLOSE,0); ma1=iMA(NULL,0,MovingPeriod,0,MODE_EMA,PRICE_CLOSE,1); ... ... if(ma1>ma+SELL_LOW*Point && ma>Close[0]){ ... }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вот, собственно, в коде выше и есть загвоздка. А состоит она вот в чем: по условиям советника, он должен открывать ордер после пересечения EMA с графиком и при увеличении (или уменшении) значения EMA на 5 пунктов (после пересечения). Но открывает он невпопад и ордера подолгу держит открытыми, хотя они должны быть уже закрытыми.