Вопросы по индикаторам в МТ5

 

Продолжение поднятой темы

https://www.mql5.com/ru/forum/119409/page30

 
TheXpert писал(а) >>
Для построения объектов могут понадобиться данные индикатора, причем иногда непосредственный доступ.

Так ведь индикаторы отвязанные - берите из них, а плоттер будет просто индикатором старого типа, как в MQL4

 

Дык, а чего не так с индикаторами то?


Сказано же, "расчетная сущность" + "стандартные возможности рисования". Нельзя объекты, это ненравится народу?


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


Да и сама привязка MQL программ к графикам - раритет.

 

Ренат писал:

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

Если же добавлять к нему возможность создавать и управлять объектами, то это заставит нас явно интерфейсно привязывать к графику, что создаст определенные ограничения в тестере.

Вопрос с созданием объектов из индикаторов остается открытым - окончательное решение еще не принято.

Причины такого шага понятны.

Вопрос лишь в том, как и чем "заменить" то, к чему уже привыкли строить в индикаторах в МТ4.

т.е. тому что уже является как само собой разумеещееся... ;)

Основная масса предложений озвучена в теме "Справка...",

здесь же пока есть желание поговорить по душам... так сказать...

*

Использование советников как единственного художника не подходит по главной причине:

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

Плюс к этому что только один на один график, т.е. для "центра управления космическим аппаратом" необходимо

либо перегружать советник излишним кодом, либо держать два графика и ломать голову как транслировать данные

обьктов с одного графика в другой, торговый...

*

Создание же "третьей сущности" так-же неоднозначно как кажется на первый взгляд.

На чьей базе создавать эту самую сущность 3с?

Если заложена таки возможность управлять обьектами в индикаторе, то вроде как смысл городить огород получается с 3с.

Использовать поток советника? только ежли этой 3с придать свойство "плюсоваться" к текущему советнику если таковой есть на графике.

Ну а если нет, то 3с работает сам по себе... однако общее, но уже не так существенное ограничение как у Гореца: только один :)))

 
api >>:

Так ведь индикаторы отвязанные - берите из них, а плоттер будет просто индикатором старого типа, как в MQL4

Копировать буфер? или каждый раз обращаться? А если индюк тяжелый? А внутреннее состояние? Дублировать логику?

Индикаторов "старого типа" никто делать не будет, их не поддерживает платформа.

Поэтому имхо единственный вариант разделить индикаторы на два класса -- для советников и для графиков.

 

kombat писал(а) >>

Создание же "третьей сущности" так-же неоднозначно как кажется на первый взгляд.

Нету неоднозначноестей. 3с создается на базе индикатора с его свойствами. НО 3с привязан к графику и не может вызываться функцией iCustom

Если заложена таки возможность управлять обьектами в индикаторе, то вроде как смысл городить огород получается с 3с.

Смысл в том, что если таки эта возможность появится, то это будет не что иное, как костыль, на радость mql4-приверженцам.

 

Идея использования одной "рисовалки" для всех открытых графиков заслуживает внимания.

Но это будет действительно космический аппарат. Каким-то образом необходимо будет из одного окна изменения свойств рисовалки включать для каждого графика различные свойства индикатора, задавать торговые инструменты (валютные пары), на графиках которых должно что-то рисоваться, задавать рабочие периоды (возможно, на разных рабочих периодах различные свойства индикатора будут задействоваться). Сразу необходимо будет предусматривать создание "шаблонов" в самом коде индикатора, чтобы группы параметров применять для различных графиков. Действительно ЦУП - Центр Управления Полетами - получается. Мало кто из разработчиков сможет грамотно реализовывать такие штуки.

 
- Было бы интересно,если авторы mql 5,выложили бы код какого нибудь стандартного индикатора для МТ 4,и его вид для МТ 5.Ну и популярно бы объяснили населению,как и что..Спасибо.
 
Посмотрите справку по функции PlotIndexSetInteger - там приведен пример трехцветной скользящей средней с периодической сменой цветовой схемы.
 
Rosh >>:
Посмотрите справку по функции PlotIndexSetInteger - там приведен пример трехцветной скользящей средней с периодической сменой цветовой схемы.

А что там, в справке, за модификатор? подробности бы какие написали о нём, или ссылку дали, где их искать.

PlotIndexGetInteger


prop_modifier

[in] Модификатор указанного свойства. Только свойства индексов цветов требуют модификатора.

 
HideYourRichess >>:

А что там, в справке, за модификатор? подробности бы какие написали о нём, или ссылку дали, где их искать.

Вы же просили пример индикатора - я показал, где его можно увидеть. Вот код из раздела PlotIndexSetInteger (не PlotIndexGetInteger):

//+------------------------------------------------------------------+
//|                                                    ColorLine.mq5 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//---- plot ColorLine
#property indicator_label1  "ColorLine"
#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  Red,Green,Blue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3
//--- indicator buffers
double         ColorLineBuffer[];
double         ColorBuffer[];
int            MA_handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX);
//--- get MA handle
   MA_handle=iMA(Symbol(),0,10,0,MODE_EMA,PRICE_CLOSE);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| get color index                                               |
//+------------------------------------------------------------------+
int getIndexOfColor(int i)
  {
   int j=i%300;
   if(j<100) return(0);// first index
   if(j<200) return(1);// second index
   return(2); // third index
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   static int ticks=0,modified=0;
   int limit;
//--- first calculation or number of bars was changed
   if(prev_calculated==0)
     {
      //--- copy values of MA into indicator buffer ColorLineBuffer
      int copied=CopyBuffer(MA_handle,0,rates_total,0,ColorLineBuffer);
      if(copied<=0) return(0);// copying failed - throw away
      //--- now set line color for every bar
      for(int i=0;i<rates_total;i++)
         ColorBuffer[i]=getIndexOfColor(i);
     }
   else
     {
      //--- copy values of MA into indicator buffer ColorLineBuffer
      int copied=CopyBuffer(MA_handle,0,rates_total,0,ColorLineBuffer);
      if(copied<=0) return(0);

      ticks++;// ticks counting
      if(ticks>=5)//it's time to change color scheme
        {
         ticks=0; // reset counter
         modified++; // counter of color changes
         if(modified>=3)modified=0;// reset counter 
         ResetLastError();
         switch(modified)
           {
            case 0:// first color scheme
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,Red);
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,Blue);
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,Green);
               //Print("Color scheme"+modified);
               break;
            case 1:// second color scheme
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,Yellow);
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,Pink);
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,LightSlateGray);
               //Print("Color scheme"+modified);
               break;
            default:// third color scheme
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,LightGoldenrod);
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,Orchid);
               PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,LimeGreen);
               //Print("Color scheme"+modified);
           }
        }
      else
        {
         //--- set start position
         limit=prev_calculated-1;
         //--- now we set line color for every bar
         for(int i=limit;i<rates_total;i++)
            ColorBuffer[i]=getIndexOfColor(i);
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Причина обращения: