Два индикатора в одном окне (CCI, MACD)

 

Добрый день.

Вопрос по использованию технических индикаторов iCCI и IMACD.

Захотелось программно объединить в одном окне индикаторы CCI и MACD.

За основу взял код из примеров для использования технических индикаторов iCCI и iMACD. Определение переменных и OnInit() выглядят следующим образом.

#property indicator_separate_window
#property indicator_buffers 3 //2MACD + 1CCI
#property indicator_plots   3//2MACD + 1CCI

//--- построение MACD
#property indicator_label1  "MACD"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrSilver
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- построение Signal
#property indicator_label2  "Signal"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_DOT
#property indicator_width2  1
//--- построение CCI
#property indicator_label3  "CCI"
#property indicator_type3   DRAW_LINE
#property indicator_color3  LightSeaGreen
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
#property indicator_level3  -100.0
#property indicator_level4  100.0

//+------------------------------------------------------------------+
//| Переменные индикаторов                                           |
//+------------------------------------------------------------------+
//----MACD
int                  fast_ema_period=12;        // период быстрой средней
int                  slow_ema_period=26;        // период медленной средней
int                  signal_period=9;           // период усреднения разности
ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // тип цены  
string               symbol=_Symbol;                // символ 
ENUM_TIMEFRAMES      period=_Period;     // таймфрейм
//--- индикаторные буферы
double         MACDBuffer[];
double         SignalBuffer[];
//--- переменная для хранения хэндла индикатора iMACD
int    handle;
//--- переменная для хранения 
string name=symbol;
//--- имя индикатора на графике
string short_name="";

//----CCI
int  iCCIPeriod=14; // Period
//--- indicator buffers
double     iCCIBuffer[];

int handlec;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {   
//--- привязка массивов к индикаторным буферам
//----MACD
   SetIndexBuffer(0,MACDBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
//----CCI
   SetIndexBuffer(2,iCCIBuffer,INDICATOR_DATA)) 
     
   
//--- создадим хэндл индикатора MACD
      handle=iMACD(name,period,fast_ema_period,slow_ema_period,signal_period,applied_price);   
//--- если не удалось создать хэндл
   if(handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
      PrintFormat("Не удалось создать хэндл индикатора iMACD для пары %s/%s, код ошибки %d",
                  name,EnumToString(period),GetLastError());
      
      return(INIT_FAILED);//--- работа индикатора завершается досрочно
     }
   
//--- создадим хэндл индикатора CCi
      handlec=iCCI(name,period,iCCIPeriod,applied_price);
      
//--- если не удалось создать хэндл
   if(handlec==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
      PrintFormat("Не удалось создать хэндл индикатора iCCI для пары %s/%s, код ошибки %d",
                  name,EnumToString(period),GetLastError());
      
      return(INIT_FAILED);//--- работа индикатора завершается досрочно
     }
   
//--- нормальное выполнение инициализации индикатора   
   return(INIT_SUCCEEDED);
  }

Но в MT5 окно индикатора выглядит следующим образом

Где-то ошибся в инициализации, или два индикатора в одном окне собираются как-то совсем иначе?

И непонятно, как объявленные буферы индикаторов привязываются непосредственно к индикаторам. ( Может быть, в этом дело?

 

Перед тем, как пытаться "засунуть" два разных индикатора в одно окно, сначала посмотрите на индикаторы - посмотрите на их шкалу:

EURUSDDaily

У этих индикаторов шкалы ПРОСТО НЕ СОВМЕСТИМЫ.

 
knodit:

///

Где-то ошибся в инициализации, или два индикатора в одном окне собираются как-то совсем иначе?

///

Надо оба индикатора приводить к общему масштабу по вертикали.

Вообще же можно перетащить индикатор из навигатора в окно другого индикатора.

Так же можно и программно сделать - но придется после каждой прокрутки графика выполнять

пересчет индикаторов в диапазоне видимых баров. К тому же со шкалой по вертикали будут

непонятки. Бессмысленная затея. 

 
knodit:

Добрый день.

Вопрос по использованию технических индикаторов iCCI и IMACD.

Захотелось программно объединить в одном окне индикаторы CCI и MACD.

За основу взял код из примеров для использования технических индикаторов iCCI и iMACD. Определение переменных и OnInit() выглядят следующим образом.

Но в MT5 окно индикатора выглядит следующим образом

Где-то ошибся в инициализации, или два индикатора в одном окне собираются как-то совсем иначе?

И непонятно, как объявленные буферы индикаторов привязываются непосредственно к индикаторам. ( Может быть, в этом дело?

В смартфоне элементарно
 
Vladimir Baskakov:
В смартфоне элементарно

Для тех, кто в танке: "Захотелось программно объединить в одном окне индикаторы CCI и MACD".

 
Dmitry Fedoseev:

Для тех, кто в танке: "Захотелось программно объединить в одном окне индикаторы CCI и MACD".

Как вариант
 
Dmitry Fedoseev:

Для тех, кто в танке: "Захотелось программно объединить в одном окне индикаторы CCI и MACD".

MACD нормировать к 1 (или 100%, в общем нормировать)

при полном построении считать макс.разницу MA и от неё задать фиксированный масштаб. (или отображаемые буферы пересчитать)

если нормировать не по минимакс а от статистики 90% (90% значений менее norm) то даже практично

 
Maxim Kuznetsov:

MACD нормировать к 1 (или 100%, в общем нормировать)

при полном построении считать макс.разницу MA и от неё задать фиксированный масштаб. (или отображаемые буферы пересчитать)

если нормировать не по минимакс а от статистики 90% (90% значений менее norm) то даже практично

Три варианта нормировки: по МАКД, по CCI и по какому-нибудь значению, например 1.

 
Dmitry Fedoseev:

Три варианта нормировки: по МАКД, по CCI и по какому-нибудь значению, например 1.

CCI же уже нормирован...

MACD надо нормировать. 

После первого прохода получить { abs(MACD) } (массив абсолютых значений MACD) , отсортировать, взять 90% - получится нормировочная величина. Её уже считать за 100% или за 1. (или за сколько пожелаете попугаев)

 
Maxim Kuznetsov:

CCI же уже нормирован...

MACD надо нормировать. 

После первого прохода получить { abs(MACD) } (массив абсолютых значений MACD) , отсортировать, взять 90% - получится нормировочная величина. Её уже считать за 100% или за 1. (или за сколько пожелаете попугаев)

Ну и что? Можно MACD растянуть по CCI, можно CCI по MACD. А можно и то и другое растянуть/сжать в диапазоне 1 или 100.

 
Dmitry Fedoseev:

Ну и что? Можно MACD растянуть по CCI, можно CCI по MACD. А можно и то и другое растянуть/сжать в диапазоне 1 или 100.

ты спросил, я ответил как нормировать чтобы поместились в одно окно, в едином масштабе....то есть зачем это и как это интерпретировать более дело автора идеи.

Причина обращения: