Встраивание кода пользовательского индикатора MQL4 в советник - PullRequest
0 голосов
/ 22 декабря 2018

Это мой первый пост в Stackoverflow, хотя я посещал его здесь годами.

Я прочитал правила для сообщений, поэтому я буду максимально кратким и конкретным.

Я пытался встроить код пользовательского индикатора непосредственно в советник, не вызывая iCustom:

iCustom(Symbol(),60,"MB",3D,0,1)>0;

Пока что мне это не удалось, и, хотя я полагаю, что это, вероятно,для многих это тривиальная вещь, если вы не знаете, вы не знаете.

Рассматриваемый код iCustom следующий, и я был бы признателен за любую помощь:

#property indicator_chart_window

#property  indicator_buffers 2 
#property  indicator_color1 Blue
#property  indicator_color2 Red
#property  indicator_width1 5
#property  indicator_width2 5


extern int 3D= 5


double AIAIAI[];
double B1B1B1[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   SetIndexBuffer( 0, AIAIAI );
   SetIndexEmptyValue( 0, 0.0 );
   SetIndexStyle( 0, DRAW_ARROW );
   SetIndexArrow( 0, 250 ); 
   SetIndexLabel( 0, NULL );

   SetIndexBuffer( 1, B1B1B1);
   SetIndexEmptyValue( 1, 0.0 );
   SetIndexStyle( 1, DRAW_ARROW );
   SetIndexArrow( 1, 250 ); 
   SetIndexLabel( 1, NULL ); 

   IndicatorDigits( 5 );

   //---- name for DataWindow and indicator subwindow label
   IndicatorShortName( MB(" + 3D+ ")" );

   return( 0 );
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{
   return( 0 );
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int counted_bars = IndicatorCounted();

   if (counted_bars < 0) return (-1);
   if (counted_bars > 0) counted_bars--;
   int intLimit = Bars - counted_bars;
   int LO, HI;

   for( int NINI = intLimit; NINI >= 0; NINI-- )
   {          
      AIAIAI[NINI] = 0.0;
      B1B1B1[NINI] = 0.0;

      LO = iLowest( Symbol(), Period(), MODE_LOW, 3D, NINI );

      if ( LO == NINI )
      {
         AIAIAI[NINI] = Low[NINI];
      }

      HI = iHighest( Symbol(), Period(), MODE_HIGH, 3D, NINI );

      if ( HI == NINI )
      {
         B1B1B1[NINI] = High[NINI];
      }
   }

   return( 0 );
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Лучший способ упаковать код индикатора в скомпилированный советник - включить его в качестве ресурса и продолжать вызывать его с помощью icustom.Когда вы делаете это таким образом, нет необходимости реорганизовывать и извлекать логику индикатора.

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

#resource "MyCustomIndicator.ex4"

double my_custom_zero_buffer(string symbol, int period, int setting, int i)
{
   return iCustom(symbol, period, "::MyCustomIndicator.ex4", setting, 0, i);
}

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

0 голосов
/ 22 декабря 2018

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

double iCustomValue(const int param,const int buffer,const int shift)
   {
    switch(buffer)
      {
       case 0:
          if(iLowest(_Symbol,0,MODE_LOW,param,shift)==shift)
              return iLow(_Symbol,0,shift);
          break;
       case 1:
          if(iHighest(_Symbol,0,MODE_HIGH,param,shift)==shift)
              return iLow(_Symbol,0,shift);
          break;
      }
    return(0.0);
   }

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

...