Что возвращает индикатор?

 

Подскажите, пожалуйста, какие значения возвращает это индикатор. Хочу вставить его в эксперт (моя первая работа :-)). И как получит эти значения?


#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Aqua

extern int Gap=10;

int dist=24;
double b1[];
double b2[];

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init() {
SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1);
SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1);
SetIndexArrow(1,233);
SetIndexArrow(0,234);
SetIndexBuffer(0,b1);
SetIndexBuffer(1,b2);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
int counted_bars=IndicatorCounted();
int i,limit,hhb,llb;

if (counted_bars<0) return(-1);
if (counted_bars>0) counted_bars--;
limit=Bars-1;
if(counted_bars>=1) limit=Bars-counted_bars-1;
if (limit<0) limit=0;

for(i=limit;i>=0;i--) {
hhb=iHighest(NULL,0,MODE_HIGH,dist,i-dist/2);
llb=iLowest(NULL,0,MODE_LOW,dist,i-dist/2);

if (i==hhb)
b1[i]=High[hhb]+Gap*Point;
if (i==llb)
b2[i]=Low[llb]-Gap*Point;
}
return(0);
}

 
extern int Gap=10; это входные параметры

double b1[];
double b2[]; это выводимые результаты

прочитайте о функции iCustom в справке

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)
Расчет указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\experts\indicators.
Параметры:
symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
name - Имя пользовательского индикатора.
... - Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.
mode - Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).
Пример:
  double val=iCustom(NULL, 0, "SampleInd",13,1,0);
 

Спасибо. А как конкретно получить b1 и b2?

double b1=iCustom(NULL,0,"SampleInd",10,1,1)

double b2=iCustom(NULL,0,"SampleInd",10,2,1)

Правильно?

 
gorby777:

Спасибо. А как конкретно получить b1 и b2?


double b1=iCustom(NULL,0,"SampleInd",10,1,1)


double b2=iCustom(NULL,0,"SampleInd",10,2,1)


Правильно?



Нет, вот так:

double b1=iCustom(NULL,0,"SampleInd",10,0,1)

double b2=iCustom(NULL,0,"SampleInd",10,1,1)
 это для для бара № 1 (текущий бар имеет № 0), текущего инструмента и тайм-фрейма, Gap=10.
Ну и конечно если Ваш индикатор называется SampleInd
 

Спасибо. Все равно нифига не выходит. Чайник - он и в Африке чайник. :-((

 
Можно вопрос в тему...
у меня есть индикатор 3d oscilator

он состоит из 2х линий ,как мне вызвать в эксперт каждую линию в отдельности ,что бы можно было сделать условие в эксперте (типа когда одна линия больше другой и наоборот)

как я понимаю когда пишется icustom то вызывается целиком индикатор ,мне же нужно что бы вызывалась 1 линия из инидкатора

//+------------------------------------------------------------------+
//|                                                 3D Oscilator.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Author - Luis Damiani. Ramdass - Conversion only"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 Red
//---- input parameters
 
extern int D1RSIPer=13;
extern int D2StochPer=8;
extern int D3tunnelPer=8;
extern double hot=0.4;
extern int sigsmooth=4;
 
 
//---- buffers
double sig1n[];
double sig2n[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(0,sig1n);
   SetIndexBuffer(1,sig2n);
//----
   SetIndexDrawBegin(0,D1RSIPer+D2StochPer+D3tunnelPer+hot+sigsmooth);
   SetIndexDrawBegin(1,D1RSIPer+D2StochPer+D3tunnelPer+hot+sigsmooth);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| CCI_Woodies                                                         |
//+------------------------------------------------------------------+
int start()
  {
   int i,i2,counted_bars=IndicatorCounted();
   double rsi,maxrsi,minrsi,storsi,E3D,
   sig1,sig2,sk,ss,sk2;
   double cs;
   bool init=true;
//----
   cs= D1RSIPer+D2StochPer+D3tunnelPer+hot+sigsmooth;
   if(Bars<=cs) return(0);
 
//if (init)
//{
ss=sigsmooth;
if (ss<2) ss=2;
sk = 2 / (ss + 1);
sk2=2/(ss*0.8+1);
init=false;
//};
 
 
//---- initial zero
   if(counted_bars<1)
   {
      for(i=1;i<=cs;i++) sig1n[Bars-i]=0.0;
      for(i=1;i<=cs;i++) sig2n[Bars-i]=0.0;
   }
//----
   i=Bars-cs-1;
   
   
   
   if(counted_bars>=cs) i=Bars-counted_bars-1;
   while(i>=0)
     {
      
      rsi=iRSI(NULL,0,D1RSIPer,PRICE_CLOSE,i);
maxrsi=rsi;
minrsi=rsi;
 
for (i2=i+D2StochPer;i2>=i; i2--)
{
rsi=iRSI(NULL,0,D1RSIPer,PRICE_CLOSE,i2);
if (rsi>maxrsi) maxrsi=rsi;
if (rsi<minrsi) minrsi=rsi;
//maxrsi=Maximum(rsi,maxrsi);
//minrsi=min(rsi,minrsi);
}
 
storsi=((rsi-minrsi)/(maxrsi-minrsi)*200-100);
E3D=hot*iCCI(NULL,0,D3tunnelPer,PRICE_TYPICAL,i)+(1-hot)*storsi;
sig1n[i]=sk*E3D+(1-sk)*sig1;
sig2n[i]=sk2*sig1+(1-sk2)*sig2;
sig1=sig1n[i];
sig2=sig2n[i];
 
      i--;
     }
   return(0);
  }
//+------------------------------------------------------------------+
с уважением 9reen
 
9reen:
Можно вопрос в тему...
у меня есть индикатор 3d oscilator

он состоит из 2х линий ,как мне вызвать в эксперт каждую линию в отдельности ,что бы можно было сделать условие в эксперте (типа когда одна линия больше другой и наоборот)

как я понимаю когда пишется icustom то вызывается целиком индикатор ,мне же нужно что бы вызывалась 1 линия из инидкатора

 
с уважением 9reen

Нет, не целиком. Вызывается совершенно определённое значение


double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)
Расчет указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\experts\indicators.
Параметры:
symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
name - Имя пользовательского индикатора.
... - Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.
mode - Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).
Пример:
  double Znachenie=iCustom(NULL, 0, "Kokoko",13, 1 , 5 );

Т.е. из конкретного индикаторного массива вызывается конкретное значение. Например, из 1-го массива (буфер 1, на основе которого строится линия 2) вызывается 5-е значение (т.е. значение на баре с индексом 5)