Данные от INDICATOR к EXPERT

 

Есть ли другой способ получить данные INDICATOR без GLOBAL-переменных?

Мой индикатор генерирует данные, которые ЭКСПЕРТ должен анализировать и принимать решения.


if (buytrend) GlobalSet ("BuyTrend", 1);

 

Привет!

делается через iCustom(.....

 
Alexander Ivanov:

Привет!

делается через ICustom(.....


iCustom

//--- create handle of the indicator iCustom
   handle_iCustom_ZZ=iCustom(m_symbol.Name(),Period(),"Examples\\NRTR", AveragePeriod,CountBars);
//--- if the handle is not created 
   if(handle_iCustom_ZZ==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iCustom (\"ZigZag\") indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }


Expert ----> Indicator


//+------------------------------------------------------------------+
//|                                                         NRTR.mq5 |
//|                                        Ramdass - Conversion only |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- input parameters
input int AveragePeriod10;
input int CountBars300;
//---- buffers
double value1[];
double value2[];

Indicator -----> Expert?



//+------------------------------------------------------------------+
//| 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[])
  {
//--- проверка количества баров на достаточность для расчета
   if(BarsCalculated(WPR_Handle)<rates_total || BarsCalculated(ATR_Handle)<rates_total || rates_total<min_rates_total)
      return(RESET);

//--- объявления локальных переменных 
   int to_copy,limit,bar,trend;
   double WPR[],ATR[],range,stop;
   static int oldtrend;

//--- расчеты необходимого количества копируемых данных и стартового номера limit для цикла пересчета баров
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора
     {
      limit=rates_total-min_rates_total; // стартовый номер для расчета всех баров
      oldtrend=0;
     }
   else
     {
      limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров
     }
   to_copy=limit+1// расчетное количество копируемых баров

//--- копируем вновь появившиеся данные в массивы WPR[] и ATR[]
   if(CopyBuffer(WPR_Handle,0,0,to_copy,WPR)<=0return(RESET);
   if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0return(RESET);

//--- индексация элементов в массивах как в таймсериях  
   ArraySetAsSeries(WPR,true);
   ArraySetAsSeries(ATR,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);

//--- основной цикл расчета индикатора
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      BuyBuffer[bar]=SellBuffer[bar]=UpBuffer1[bar]=DnBuffer1[bar]=UpBuffer2[bar]=DnBuffer2[bar]=NULL;
      //---
      trend=oldtrend;
      if(WPR[bar]<-100+K) trend=-1;
      if(WPR[bar]>-K) trend=+1;
      range=AtrRatio*ATR[bar];
      //---
      if(oldtrend<0 && trend>0) BuyBuffer[bar]=low[bar]-range;
      if(oldtrend>0 && trend<0) SellBuffer[bar]=high[bar]+range;

      if(trend>0)
        {
         if(BuyBuffer[bar])
           {
            UpBuffer1[bar]=UpBuffer2[bar]=BuyBuffer[bar];
            DnBuffer1[bar]=DnBuffer1[bar+1];
           }
         else
           {
            stop=low[bar]-range;
            if(stop<UpBuffer1[bar+1]) stop=UpBuffer1[bar+1];
            UpBuffer1[bar]=UpBuffer2[bar]=stop;
           }
        }

      if(trend<0)
        {
         if(SellBuffer[bar])
           {
            DnBuffer1[bar]=DnBuffer2[bar]=SellBuffer[bar];
            UpBuffer1[bar]=UpBuffer1[bar+1];
           }
         else
           {
            stop=high[bar]+range;
            if(stop>DnBuffer1[bar+1]) stop=DnBuffer1[bar+1];
            DnBuffer1[bar]=DnBuffer2[bar]=stop;
           }
        }
      //---
      if(bar) oldtrend=trend;
     }
//---     
   return(rates_total);
   GlobalVariableSet("LineValue",stop);
  }
//+------------------------------------------------------------------+


эксперт хотел бы получить эту ценность GlobalVariableSet("LineValue",stop);

Я из мира, у вас есть другой путь?


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int LineValue=GlobalVariableGet("LineValue");
//---
  }


Я хотел бы получить эту ценность по-другому, не будучи GlobalVariable?


 
я говорил, что нужно добавить в индикаторы торгующие функции. и было бы все в одной программе.
а то перекидывайся этими данными!
 
Márcio Andrade:

Есть ли другой способ получить данные INDICATOR без GLOBAL-переменных?

Мой индикатор генерирует данные, которые ЭКСПЕРТ должен анализировать и принимать решения.


if (buytrend) GlobalSet ("BuyTrend", 1);

как вариант, прописать весь код индикатора в советнике, и работать без индикатора.



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

 
igrok333:

как вариант, прописать весь код индикатора в советнике, и работать без индикатора.



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

Когда вы создаете индикатор с помощью iCustom (); все переменные в индикаторе являются частью EXPERT? Это было?


//+------------------------------------------------------------------+
//|                                                         NRTR.mq5 |
//|                                        Ramdass - Conversion only |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- input parameters
input int AveragePeriod10;
input int CountBars300;
//---- buffers
double value1[];
double value2[];
string stop;


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   Print(stop);
//---
  }

правильно?


 
Márcio Andrade:

Есть ли другой способ получить данные INDICATOR без GLOBAL-переменных?

Мой индикатор генерирует данные, которые ЭКСПЕРТ должен анализировать и принимать решения.


if (buytrend) GlobalSet ("BuyTrend", 1);

а вообще, есть 3 варианта передачи данных
icustom, глобальная переменная и писать в csv файл.
 
Márcio Andrade:

Когда вы создаете индикатор с помощью iCustom (); все переменные в индикаторе являются частью EXPERT? Это было?



правильно?


через iCustom () можно подтянуть только те данные, которые на графиках в индикаторах. промежуточные расчеты - нельзя взять.

 
igrok333:

через iCustom () можно подтянуть только те данные, которые на графиках в индикаторах. промежуточные расчеты - нельзя взять.

Любой параметр, отличный от GlobalVariableGet?

 
Márcio Andrade:


iCustom


Expert ----> Indicator



Indicator -----> Expert?



эксперт хотел бы получить эту ценность GlobalVariableSet("LineValue",stop);

Я из мира, у вас есть другой путь?



Я хотел бы получить эту ценность по-другому, не будучи GlobalVariable?


А разве после

return(rates_total);

может выполняться строка

 GlobalVariableSet("LineValue",stop);

Но, если уж так хочется работать с этим индикатором, то получить можно не GV а значение буфера индикатора.

CopyBuffer(handle_iCustom_ZZ,0,0,to_copy,arrZZ)

соответственно не забыть объявить массив arrZZ[]

 
Еще, можно обмениваться данными через CHARTEVENT_CUSTOM.