Советники: Разница двух скользящих средних

 

Разница двух скользящих средних:

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

Разница этих двух скользящих средних усилена нелинейной кубической функцией смещения для того, чтобы отличить ее от большего и меньшего отклонения от нуля. Заключительный шаг является простым дискриминатором уровня с высокими и низкими порогами, который реагирует на главные отклонения прежде, чем сигнализировать об изменении тренда.

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

Разница двух скользящих средних

Автор: Winston

 

Я думаю, что для правильной работы индикатора необходимо ArraySetSeries (mf, true) и (ms, true) в OnInit ().

Все операторы

if (flg == 0) / / initialise on first pass
      {
       ArrayInitialize (ag, EMPTY_VALUE);
       ArrayInitialize (bg, EMPTY_VALUE);
       ArrayInitialize (cg, EMPTY_VALUE);
       hi = 0;
       I = 0;
       trend = 0;
       flg = 1;
       }

были бы более эффективны в OnInit (), и не пришлось бы использовать "flg".

Советник относительно ... использования MACD считает, что алгоритм его стратегии упрощается следующим образом:

Открываем покупку: MACDcurrent>MACDprev && MACDcurrent<0; buyed = true.

Закрыть покупку: buyed && MACDcurrent<MACDprev && MACDcurrent>0; buyed = false

Для продажи обратные действия.

Если мы используем SL и TP, когда советник не работает, я могу сказать "покупаю" или "продаю" по тренду (медленная МА) и ждать нового сигнала.

 

Здравствуйте, я не знаю, почему этот индикатор: madelta_inc.mq5, ничего не рисует, когда я прикрепляю его к графику. Прилагаю изображение, чтобы вы могли видеть, что я говорю. Также я приложил ниже код с изменениями, которые предлагает josemiguel1812, не использовать флаг: 'flg', и перенести часть кода в событие OnInit(). Я не использовал: ArraySetAsSeries (mf, true) и ArraySetAsSeries (ms, true), потому что и 'mf' и 'ms' являются одноэлементными массивами и я думаю, что это изменение не будет иметь эффекта, также MT5 не позволяет использовать эту функцию для статических массивов. Но я хотел бы знать, почему он не рисует линии индикатора? Не могли бы вы попробовать следующий код и протестировать его?

Заранее спасибо, Cyberglassed.

//+------------------------------------------------------------------+
//|madelta_inc |
//|Copyright 2013 Winston |
//+------------------------------------------------------------------+
#property copyright "Winston 2013"
#property version "1.10"
#property description "madelta_inc"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   3

#property  indicator_type1   DRAW_COLOR_LINE
#property  indicator_color1  White,Yellow,Red
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  2

#property  indicator_type2   DRAW_LINE
#property  indicator_color2  Yellow
#property  indicator_style2  STYLE_DOT
#property  indicator_width2  1

#property  indicator_type3   DRAW_LINE
#property  indicator_color3  Red
#property  indicator_style3  STYLE_DOT
#property  indicator_width3  1

input double d = 0.00195;                       //delta
input double m = 39.2;                          //mult

input int F = 26;                               //быстрая скользящая средняя
input ENUM_MA_METHOD FM = MODE_SMA;             // режим быстрого усреднения
input ENUM_APPLIED_PRICE FP = PRICE_WEIGHTED;   // режим быстрых цен

input int S = 51;                                     // медленная скользящая средняя
input ENUM_MA_METHOD SM = MODE_EMA;                 // медленный средний режим
input ENUM_APPLIED_PRICE SP = PRICE_MEDIAN;        // медленный ценовой режим

int Ms, Mf, trend;
double px, hi, lo;
double ms[1], mf[1];
double ag[], bg[], cg[], ac[];

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnInit() {
        SetIndexBuffer(0, ag, INDICATOR_DATA);
        ArraySetAsSeries(ag, true);                    //signal

        SetIndexBuffer(1, ac, INDICATOR_COLOR_INDEX);
        ArraySetAsSeries(ac, true);                    //сигнальный цвет тренда

        SetIndexBuffer(2, bg, INDICATOR_DATA);
        ArraySetAsSeries(bg, true);                    //порог

        SetIndexBuffer(3, cg, INDICATOR_DATA);
        ArraySetAsSeries(cg, true);                    //порог ло

        ArrayInitialize(ag, EMPTY_VALUE);
        ArrayInitialize(bg, EMPTY_VALUE);
        ArrayInitialize(cg, EMPTY_VALUE);
        hi = 0;
        lo = 0;
        trend = 0;
        
        Mf = iMA(NULL, PERIOD_H1, F, 0, FM, FP);
        Ms = iMA(NULL, PERIOD_H1, S, 0, SM, SP);

}

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,           // размер массива price[]
                                const int prev_calculated,               // бары, обработанные в предыдущем вызове
                                const int begin,                          // откуда начинаются значимые данные
                                const double &price[])              // массив для вычисления
{

        CopyBuffer(Mf, 0, 0, 1, mf);                   // быстрое скользящее среднее значение

        CopyBuffer(Ms, 0, 0, 1, ms);                   // значение медленной скользящей средней

        px = pow(m * (mf[0] - ms[0]), 3);                //увеличить и перевести в куб разницу


        if (px > hi) {                               //определить тенденцию
                hi = px;
                lo = hi - d;
                trend = 1;
        }
        if (px < lo) {                               // с изменением цвета
                lo = px;
                hi = lo + d;
                trend = 2;
        }

        ag[0] = px;
        bg[0] = hi;
        cg[0] = lo;
        ac[0] = trend;

        return (rates_total);
}

//+------------------------------------------------------------------+
Файлы:
screenshot.png  103 kb
 
cyberglassed:

Здравствуйте, я не знаю, почему этот индикатор: madelta_inc.mq5, ничего не рисует, когда я прикрепляю его к графику. Прилагаю изображение, чтобы вы могли видеть, что я говорю. Также я приложил ниже код с изменениями, которые предлагает josemiguel1812, не использовать флаг: 'flg', и перенести часть кода в событие OnInit(). Я не использовал: ArraySetAsSeries (mf, true) и ArraySetAsSeries (ms, true), потому что и 'mf' и 'ms' являются одноэлементными массивами и я думаю, что это изменение не будет иметь эффекта, также MT5 не позволяет использовать эту функцию для статических массивов. Но я хотел бы знать, почему он не рисует линии индикатора? Не могли бы вы попробовать следующий код и протестировать его?

Заранее спасибо, Cyberglassed.

Что вы ожидаете? Устанавливаются только значения индекса 0 буферов индикатора.
 
angevoyageur:
Что вы ожидаете? Устанавливаются только значения индекса 0 буферов индикатора.

Меня немного смущало, что всегда присваивался индекс 0 буферам, поэтому я ожидал, что ArraySetAsSeries как-то влияет на изменение интуитивного поведения, которое можно было бы подумать (наоборот) или что-то в этом роде, я начинающий в mql5. В любом случае, мне пришлось перезагрузить компьютер по другой причине, и я снова попробовал индикатор, и теперь он рисует линии, как я и ожидал в начале. Я прилагаю изображение.

Спасибо, Cyberglassed.

Файлы:
screenshot.png  118 kb
 
cyberglassed:

Меня немного смущало то, что буферам всегда присваивался индекс 0, поэтому я ожидал, что ArraySetAsSeries как-то повлияет на изменение интуитивного поведения, которое можно было бы подумать (наоборот) или что-то в этом роде, я начинающий в mql5. В любом случае, мне пришлось перезагрузить компьютер по другой причине, и я снова попробовал индикатор, и теперь он рисует линии, как я и ожидал в начале. Я прилагаю изображение.

Спасибо, Cyberglassed.

Либо код, который вы выполняете, не совпадает с тем, который вы выложили, либо ваш терминал рисует данные, поступающие из каких-то буферов.

Приведенный вами код не может дать такого результата.

 

Спасибо за ваши комментарии. Возможно, индикатор необычен тем, что он предназначен для работы только с тестером стратегий в режиме визуализации.

В Навигаторе щелкните левой кнопкой мыши на ea, а затем правой кнопкой мыши на test. В Тестере стратегий EURUSD, H1 и поставьте галочку в поле Visulization, а затем Start, индикатор должен появиться.

Дайте мне знать, как вы справитесь.

С наилучшими пожеланиями

Уинстон

 

Что-то не так с этим советником. Когда я пытаюсь торговать только на одной паре валют, этот советник ничего не делает в течение 2 дней, индикатор иногда показывает сигнал sel и buy в одно и то же время.

Когда я пытаюсь торговать на нескольких парах валют, он делает то же самое, но я заметил, что когда я вручную закрываю позиции, он начинает торговать снова, что-то очень не так с этим советником, что-то блокирует торговлю в Meta Trader 5

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

Кто-нибудь может это исправить?

 
Если вам нужен маркер таймфрейма - (Ma1-Ma2) И (неизвестный индикатор) будут работать хорошо, не так ли?
 
Только не понятно где подправить, что можно было lot выбирать
 
Добрый день! С выставлением необходимого лота разобрался, но вот как сделать чтобы это бот работал одновременно на нескольких инструментах.