Помогите исправить код в советнике на JMA

Serewka

Новичок форума
Всем привет! Подскажите советом или поправьте, что Я делаю не так. Ситуация такая: есть индикатор JMA с разными периодами (14 и 21 (индикатор прилагаю)). Захотел попробовать сделать эксперт на его основе который при пересечении линий (см скрин) покупает 14 идет снизу вверх и закрывает прошлый ордер, и наоборот если сверху вниз продает. График USD-JPU 30min. Но при запуске он неправильно срабатывает-т.е при покупка и продажа поздно срабатывают а иногда и просто неработает. Грешу на неправильный вызов индикатора. Хочется сделать, чтобы при пересечении он в течении 1-2 мин срабатывал. (jma- индикатор, JMA_S-советник)
Заранее спасибо всем кто откликнется.

Фото





Советник и индикатор прилагаю
 

Вложения

  • JMA.mq4
    10,8 КБ · Просмотры: 62
  • JMA_S.mq4
    7,7 КБ · Просмотры: 55
Последнее редактирование модератором:

FXgorets

Местный житель
А что это вы точками и линиями на нижней фотографии позначили ?
 

Ugar

Гуру форума
Конечно не правильно.
Если задаёшь праметры индюку то задавай все, в том поряжке как у индюка.
 

Serewka

Новичок форума
А что это вы точками и линиями на нижней фотографии позначили ?

Это при тестировании показано покупка и продажа позначена.


Конечно не правильно.
Если задаёшь праметры индюку то задавай все, в том поряжке как у индюка.


Можна более подробней пожалуйста-я начинающий и полность код не писал - лишь чуть менял
 

Ugar

Гуру форума
double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Расчет указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\experts\indicators.
Параметры:symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
name - Имя пользовательского индикатора.
... - Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.
mode - Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Пример:
double iCustom(NULL,30,"JMA",Length,0,0,0);
После имени 2 параметра индюка, а потом номер буфера и же потом индекс смещения.

Дальше не проверял, может ещё есть ошибки.
 

Serewka

Новичок форума
double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Пример:
double iCustom(NULL,30,"JMA",Length,0,0,0);
После имени 2 параметра индюка, а потом номер буфера и же потом индекс смещения.

Дальше не проверял, может ещё есть ошибки.

Я так понимаю, что в усех случаях нужно передавать все параметры индикатора.

Сейчас отредактировал так:
int Length=14;

double SEma0 = iCustom(NULL,30,"JMA",Length,0,0,0);
double SEma1 = iCustom(NULL,30,"JMA",Length,0,0,1);

Length=21;
double LEma0 = iCustom(NULL,30,"JMA",Length,0,0,0);
double LEma1 = iCustom(NULL,30,"JMA",Length,0,0,1);

Но проблемка осталась - не точно происходит покупка и продажа.



Условия:
Покупка: if(SEma0-LEma0>0 && SEma1-LEma1<0)
Продажа: if(SEma0<LEma0 && SEma1>LEma1)

Или нужно еще подбирать параметры в ф-ции iCustom "mode" и "shift" ?
 

Ugar

Гуру форума
Я так понимаю, что в усех случаях нужно передавать все параметры индикатора.

Сейчас отредактировал так:
int Length=14;

double SEma0 = iCustom(NULL,30,"JMA",Length,0,0,0);
double SEma1 = iCustom(NULL,30,"JMA",Length,0,0,1);

Length=21;
double LEma0 = iCustom(NULL,30,"JMA",Length,0,0,0);
double LEma1 = iCustom(NULL,30,"JMA",Length,0,0,1);

Но проблемка осталась - не точно происходит покупка и продажа.



Условия:
Покупка: if(SEma0-LEma0>0 && SEma1-LEma1<0)
Продажа: if(SEma0<LEma0 && SEma1>LEma1)

Или нужно еще подбирать параметры в ф-ции iCustom "mode" и "shift" ?

"mode" - это номер буфера индюка. То есть из какого буфера брать данные. Если берёшь с линии его трогать не надо.

"shift" - под\над какой свечкой с индюка брать показания.
0 - последняя, ещё не закрытая свеча.
1 - предпоследняя свеча, или последняя из закрытых свечей.

Условия описаны по разному, но аналогично.
Продажа: if - если
SEma0<LEma0 - на последней свече быстрая ниже медленной
&& - и
SEma1>LEma1 - на предпоследней свече быстрая выше медленной.
Получается что пересечение по этому условию происходит между 0 и 1 свечёй.
 

Serewka

Новичок форума
"mode" - это номер буфера индюка. То есть из...

SEma0<LEma0 - на последней свече быстрая ниже медленной
&& - и
SEma1>LEma1 - на предпоследней свече быстрая выше медленной.
Получается что пересечение по этому условию происходит между 0 и 1 свечёй.

Интересно, то ли это язык программирования еще тот то ли Я что-то не понимаю, потому как используя обращение к JMA и условия пересечения советник нормально не работает - т.е. открывает и закрывает позиции где угодно см.скрин

int Length1=14;
int Length2=21;


double SEma0 = iCustom(NULL,30,"JMA",Length1,0,0,0);
double SEma1 = iCustom(NULL,30,"JMA",Length1,0,0,1);

Print("SEma0", SEma0);
Print("SEma1", SEma1);


double LEma0 = iCustom(NULL,30,"JMA",Length2,0,0,0);
double LEma1 = iCustom(NULL,30,"JMA",Length2,0,0,1);

Print("LEma0", LEma0);
Print("LEma1", LEma1);


if(SEma0>LEma0 && SEma1<=LEma1)
ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"EMA BUY",MAGIC,0,CLR_NONE);

if(SEma0<LEma0 && SEma1>=LEma1)
ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"EMA SELL",MAGIC,0,CLR_NONE);


 

Вложения

  • JMA_S.mq4
    8,3 КБ · Просмотры: 46

forwasp

Новичок форума
Я сам долго мучился с этим JMA. Этот индюк в советниках работает некорректно.
 
Верх