Как вывести информер по всем таймфреймам (TF)?

sergh67

Активный участник
Хочу вывести информер по всем TF
Но уперся в проблему: buf1[i+1] . У меня в примере идет разбивка по цвету. В данной ситуации буфер требует буфера. Значение +1 не позволяет мне снять для информер информацию со всех TF. Что делать подскажите?
PHP:
buf7[i]=buf1[i];    
      buf8[i]=buf1[i];     
if(buf1[i] < buf1[i+1])
      buf7[i] = EMPTY_VALUE;
if(buf1[i] > buf1[i+1])
      buf8[i] = EMPTY_VALUE;
 
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5
Такого кусочка кода не достаточно для подсказки.
 

sergh67

Активный участник
Такого кусочка кода не достаточно для подсказки.

Почему не достаточно?
У меня шесть буферов.
Все шесть без проблем выдают информацию без вот этого
PHP:
[]
.
Добавлено еще два буфера но уже с этим
PHP:
[]
.
эти два буфера разбивают один из буферов на цвета через
PHP:
[i+1]
].
Я не могу с этим i+1 разобраться. Оно требует не условного буфера, а полноценного. Такого который выводит линию на график. У меня получается 9 TF * 2
PHP:
[]
=
PHP:
18 []
. А это перебор.
Там и кода то ни какого нет. 6 строк всего навсего.
А потом этот кусок кода универсальный. У меня на нем более 20 индикаторов построено. Я его перекопирую из одного источника в другой и все.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Там и кода то ни какого нет. 6 строк всего навсего.
6 строк только в твоём примере.
Ошибка вероятно в другой части кода. В засекреченной...
Arr[5] ни чем не отличается от Arr[2+3] и даже от такой глупости Arr[2*2.5]
Почитай о приоритетах выполнения. В твоём варианте ВОЗМОЖНО i теряет своё значение. Другого предположить не могу. Не телепат я, однако.
 

sergh67

Активный участник
Я не понимаю о чем вы! Я не программист.
Вот например:
PHP:
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 White
#property indicator_color2 White
#property indicator_color3 Silver 
#property indicator_color4 Yellow
#property indicator_color5 White
#property indicator_color6 Silver
#property indicator_color7 FireBrick
#property indicator_color8 C'0,45,0'
#property indicator_level1 50

extern int Period1=40;
extern int Period2=34;
extern int Period3=21;
extern int Period4=9;
extern int Period5=5;
extern int Period6=2;

double buf1[], buf2[], buf3[], buf4[];
double buf5[], buf6[], buf7[], buf8[];
int init(){
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,buf1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,buf2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,buf3);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,buf4);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexBuffer(4,buf5);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexBuffer(5,buf6);
   SetIndexStyle(6,DRAW_LINE);
   SetIndexBuffer(6,buf7);
   SetIndexStyle(7,DRAW_LINE);
   SetIndexBuffer(7,buf8);
   IndicatorShortName("a");
return(0);
}
int start(){
   int i,limit,counted_bars;
   limit=Bars-IndicatorCounted()-1;
   if (limit>1) limit = Bars-1;
   for(i=limit; i>=0; i--){
      buf1[i] = iCustom(NULL,0,"@DDL",Period1,5,0,i);
      buf2[i] = iCustom(NULL,0,"@DDL",Period2,5,0,i);
      buf3[i] = iCustom(NULL,0,"@DDL",Period3,5,0,i);
      buf4[i] = iCustom(NULL,0,"@DDL",Period4,5,0,i);
      buf5[i] = iCustom(NULL,0,"@DDL",Period5,5,0,i);
      buf6[i] = iCustom(NULL,0,"@DDL",Period6,5,0,i);
}
for(i=limit; i>=0; i--){
      buf7[i]=buf5[i];    
      buf8[i]=buf5[i];     
   if(buf5[i] > buf5[i+1])
      buf7[i] = EMPTY_VALUE;
   if(buf5[i] < buf5[i+1])
      buf8[i] = EMPTY_VALUE;
   }
   return(0);
}
В качестве @DDL выступает RSI.
Я предположим хочу вывести информацию по всем 8 буферам включая вывод общей инфо по всем ТФ.
Первые основные шесть без проблем. Я удаляю [] скобки и все. Но вот с последних двух удалить не могу. У меня со всех ТФ 18 буферов получается!
А если более сложная ситуация?
PHP:
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 White
#property indicator_color2 White
#property indicator_color3 Silver 
#property indicator_color4 Yellow
#property indicator_color5 Red
#property indicator_color6 Lime
#property indicator_color7 FireBrick
#property indicator_color8 C'0,45,0'
#property indicator_level1 50

extern int Period1=40;
extern int Period2=21;
extern int Period3=9;
extern int Period4=2;


double buf1[], buf2[], buf3[], buf4[];
double buf5[], buf6[], buf7[], buf8[];
int init(){
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,buf1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,buf2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,buf3);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,buf4);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexBuffer(4,buf5);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexBuffer(5,buf6);
   SetIndexStyle(6,DRAW_LINE);
   SetIndexBuffer(6,buf7);
   SetIndexStyle(7,DRAW_LINE);
   SetIndexBuffer(7,buf8);
   IndicatorShortName("a");
return(0);
}
int start(){
   int i,limit,counted_bars;
   limit=Bars-IndicatorCounted()-1;
   if (limit>1) limit = Bars-1;
   for(i=limit; i>=0; i--){
      buf1[i] = iCustom(NULL,0,"@DDL",Period1,5,0,i);
      buf2[i] = iCustom(NULL,0,"@DDL",Period1,5,0,i);
      buf3[i] = iCustom(NULL,0,"@DDL",Period2,5,0,i);
      buf4[i] = iCustom(NULL,0,"@DDL",Period3,5,0,i);
}
for(i=limit; i>=0; i--){
      buf5[i]=buf1[i];    
      buf6[i]=buf1[i];     
   if(buf1[i] > buf1[i+1])
      buf5[i] = EMPTY_VALUE;
   if(buf1[i] < buf1[i+1])
      buf6[i] = EMPTY_VALUE;
      
         buf7[i]=buf3[i];    
      buf8[i]=buf3[i];     
   if(buf3[i] > buf3[i+1])
      buf7[i] = EMPTY_VALUE;
   if(buf3[i] < buf3[i+1])
      buf8[i] = EMPTY_VALUE;
   }
   return(0);
}
 
Последнее редактирование:

ale002

::: __,,,^._.^,,,__ :::
Дэтэктиба, однако..

1 - вы же понимаете, что в ваших 20 индикаторах это копирование куска кода может работать тока по чистой случайности?

2 - зачем вам buf7 и buf8, в них же повторяется значение из buf5? В одном из них, а в другом всегда пустое значение

3 - вы сформулируйте конкретнее и получите конкретный кусок кода для вашего индикатора. Вы хотите получить значения RSI для текущего бара с 8 ТФ и вывести их цифрами на экран?
 

sergh67

Активный участник
Я это привел в качестве примера.

А вот к примеру один из индикаторов.
Это 9 сценариев наложенных друг на друга чтобы вывести инфо по всем ТФ.
Цветовая диагностика опережает пресечение зачастую на один два бара.
У меня идет ряд который выводит инфо по пересечению.
Второй ряд выводит диагностику по цвету.
Я хочу все упаковать в один исполняемый файл.
 
Последнее редактирование:

qqmber

Почетный гражданин
Я предположим хочу вывести информацию по всем 8 буферам включая вывод общей инфо по всем ТФ.
Первые основные шесть без проблем. Я удаляю [] скобки и все. Но вот с последних двух удалить не могу. У меня со всех ТФ 18 буферов получается!
Покажите беспроблемный код с удаленными [] для шести буферов.
 

sergh67

Активный участник
PHP:
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 FireBrick
#property indicator_color2 C'0,45,0'
#property indicator_level1 50

extern int Period1=40; 
extern int Period2=34; 
extern int Period3=21; 
extern int Period4=9; 

double buf1[], buf2[], buf3, buf4;
double buf5, buf6, buf7, buf8;
int init(){
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,buf1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,buf2);
   IndicatorShortName("a");
return(0);
}
int start(){
   int i,limit,counted_bars;
   limit=Bars-IndicatorCounted()-1;
   if (limit>1) limit = Bars-1;
   for(i=limit; i>=0; i--){
      buf1[i] = iCustom(NULL,0,"@DDL",Period1,5,0,i);
      buf2[i] = iCustom(NULL,0,"@DDL",Period2,5,0,i);
      buf3 = iCustom(NULL,0,"@DDL",Period3,5,0,i);
      buf4 = iCustom(NULL,0,"@DDL",Period4,5,0,i);
      
}
for(i=limit; i>=0; i--){
      buf5=buf1[i];    
      buf6=buf1[i];     
   if(buf1[i] > buf1[i+1])
      buf5 = EMPTY_VALUE;
   if(buf1[i] < buf1[i+1])
      buf6 = EMPTY_VALUE;
      
       buf7=buf2[i];    
      buf8=buf2[i];     
   if(buf2[i] > buf2[i+1])
      buf7 = EMPTY_VALUE;
   if(buf2[i] < buf2[i+1])
      buf8 = EMPTY_VALUE;
   }
   return(0);
}
В данном примере я могу вывести информацию по всем 8 буферам.
Но только в двух из них задействуются обязательные []. Мне их надо обезличить как и те шесть.
 
Последнее редактирование:

ale002

::: __,,,^._.^,,,__ :::
Принцип должен быть примерно таким, если я правильно понял чего вам хочеццо получить:
PHP:
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color7 FireBrick
#property indicator_color8 C'0,45,0'
#property indicator_level1 50

double buf1[], buf2[];

int init(){
	SetIndexStyle(0,DRAW_LINE);
	SetIndexBuffer(0,buf1);
	SetIndexStyle(1,DRAW_LINE);
	SetIndexBuffer(1,buf2);
	IndicatorShortName("a");
	return(0);
}

int start(){
	double
		// получение значений текущего бара для всех ТФ:
		ТФ_M1 = iCustom(NULL,0,"@DDL",PERIOD_M1,5,0,0),
		ТФ_M5 = iCustom(NULL,0,"@DDL",PERIOD_M5,5,0,0),
		ТФ_M15 = iCustom(NULL,0,"@DDL",PERIOD_M15,5,0,0),
		ТФ_M30 = iCustom(NULL,0,"@DDL",PERIOD_M30,5,0,0),
		ТФ_H1 = iCustom(NULL,0,"@DDL",PERIOD_H1,5,0,0),
		ТФ_H4 = iCustom(NULL,0,"@DDL",PERIOD_H4,5,0,0),
		ТФ_D1 = iCustom(NULL,0,"@DDL",PERIOD_D1,5,0,0),
		ТФ_W1 = iCustom(NULL,0,"@DDL",PERIOD_W1,5,0,0),
		ТФ_MN1 = iCustom(NULL,0,"@DDL",PERIOD_MN1,5,0,0)
	;
	color
		Цвет_M1 = Red,
		Цвет_M5 = Red,
		Цвет_M15 = Red,
		Цвет_M30 = Red,
		Цвет_H1 = Red,
		Цвет_H4 = Red,
		Цвет_D1 = Red,
		Цвет_W1 = Red,
		Цвет_MN1 = Red
	;
	
	// определение цвета сравнением со значением предыдущего бара:
	if(ТФ_M1 > iCustom(NULL,0,"@DDL",PERIOD_M1,5,0,1)) Цвет_M1 = Green;
	if(ТФ_M5 > iCustom(NULL,0,"@DDL",PERIOD_M5,5,0,1)) Цвет_M5 = Green;
	if(ТФ_M15 > iCustom(NULL,0,"@DDL",PERIOD_M15,5,0,1)) Цвет_M15 = Green;
	if(ТФ_M30 > iCustom(NULL,0,"@DDL",PERIOD_M30,5,0,1)) Цвет_M30 = Green;
	if(ТФ_H1 > iCustom(NULL,0,"@DDL",PERIOD_H1,5,0,1)) Цвет_H1 = Green;
	if(ТФ_H4 > iCustom(NULL,0,"@DDL",PERIOD_H4,5,0,1)) Цвет_H4 = Green;
	if(ТФ_D1 > iCustom(NULL,0,"@DDL",PERIOD_D1,5,0,1)) Цвет_D1 = Green;
	if(ТФ_W1 > iCustom(NULL,0,"@DDL",PERIOD_W1,5,0,1)) Цвет_W1 = Green;
	if(ТФ_MN1 > iCustom(NULL,0,"@DDL",PERIOD_MN1,5,0,1)) Цвет_MN1 = Green;
	
	// здесь должен быть код вывода на чарт
	
	return(0);
}

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

sergh67

Активный участник
Спасибо!
Правда я не черта не понимаю что это такое?
Я с чарт дело не имел.
Но еще больше мне интересно где ........................................?.
После start() не одного буфера нет. И куда их там вставлять я не знаю?
 

sergh67

Активный участник
А можно как нибудь, так, замаскировать просто эти буферы, - через какую нибудь функцию?
 

qqmber

Почетный гражданин
В данном примере я могу вывести информацию по всем 8 буферам.
Но только в двух из них задействуются обязательные []. Мне их надо обезличить как и те шесть.

Здесь у вас только два буфера, buf1 и buf2, а buf3 - buf8 это обыкновенные переменные, объявленные на глобальном уровне. Так что говорить о 8 буферах в этом примере некорректно.
Но это не суть, если я правильно понял, к чему вы стремитесь, то это делается много проще. Чтобы вывести куда-нибудь крайние значения массива, можно просто использовать buf.[0], не вводя дополнительных переменных. Например, в предыдущем куске, можно вывести на экран все восемь значений одной функцией.
Код:
#property indicator_separate_window 
#property indicator_buffers 8 
#property indicator_color1 White 
#property indicator_color2 White 
#property indicator_color3 Silver  
#property indicator_color4 Yellow 
#property indicator_color5 White 
#property indicator_color6 Silver 
#property indicator_color7 FireBrick 
#property indicator_color8 C'0,45,0' 
#property indicator_level1 50 

extern int Period1=40; 
extern int Period2=34; 
extern int Period3=21; 
extern int Period4=9; 
extern int Period5=5; 
extern int Period6=2; 

double buf1[], buf2[], buf3[], buf4[]; 
double buf5[], buf6[], buf7[], buf8[]; 
int init(){ 
   SetIndexStyle(0,DRAW_LINE); 
   SetIndexBuffer(0,buf1); 
   SetIndexStyle(1,DRAW_LINE); 
   SetIndexBuffer(1,buf2); 
   SetIndexStyle(2,DRAW_LINE); 
   SetIndexBuffer(2,buf3); 
   SetIndexStyle(3,DRAW_LINE); 
   SetIndexBuffer(3,buf4); 
   SetIndexStyle(4,DRAW_LINE); 
   SetIndexBuffer(4,buf5); 
   SetIndexStyle(5,DRAW_LINE); 
   SetIndexBuffer(5,buf6); 
   SetIndexStyle(6,DRAW_LINE); 
   SetIndexBuffer(6,buf7); 
   SetIndexStyle(7,DRAW_LINE); 
   SetIndexBuffer(7,buf8); 
   IndicatorShortName("a"); 
return(0); 
} 
int start(){ 
   int i,limit,counted_bars; 
   limit=Bars-IndicatorCounted()-1; 
   if (limit>1) limit = Bars-1; 
   for(i=limit; i>=0; i--){ 
      buf1[i] = iCustom(NULL,0,"@DDL",Period1,5,0,i); 
      buf2[i] = iCustom(NULL,0,"@DDL",Period2,5,0,i); 
      buf3[i] = iCustom(NULL,0,"@DDL",Period3,5,0,i); 
      buf4[i] = iCustom(NULL,0,"@DDL",Period4,5,0,i); 
      buf5[i] = iCustom(NULL,0,"@DDL",Period5,5,0,i); 
      buf6[i] = iCustom(NULL,0,"@DDL",Period6,5,0,i); 
} 
for(i=limit; i>=0; i--){ 
      buf7[i]=buf5[i];     
      buf8[i]=buf5[i];      
   if(buf5[i] > buf5[i+1]) 
      buf7[i] = EMPTY_VALUE; 
   if(buf5[i] < buf5[i+1]) 
      buf8[i] = EMPTY_VALUE; 
   } 
   [COLOR="Red"]Comment(buf1[0]," ",buf2[0]," ",buf3[0]," ",buf4[0]," ",
           buf5[0]," ",buf6[0]," ",buf7[0]," ",buf8[0]);[/COLOR]
   return(0); 
}
 
Последнее редактирование:

ale002

::: __,,,^._.^,,,__ :::
Пажалста!

После start() не одного буфера нет. И куда их там вставлять я не знаю?
А откуда вы их вытаскиваете? Чтобы нарисовать на графике 8 цветных точек / стрелок / циферок индикатору не нужно ни одного собственного буфера. Чтобы получить по одному значению 8 ТФ из внешнего индикатора тоже ни одного не нужно
 

sergh67

Активный участник
Я использую функцию
start(){
start()1:
start()2:
start()3;
когда дело касается вывода инфо с разных TF.
 

sergh67

Активный участник
у меня во внешнем индикаторе только голый код. И это в первую очередь только пример. У меня основные индикаторы не имеют внешнего кода. Картинку которую я представил, - это полноценный индикатор не имеющий внешнего кода.
 

ale002

::: __,,,^._.^,,,__ :::
Отчего не прицепите сюда свой индикатор? Или я сдаюсь, мой телепатинг требует пару суток на восстановление :)
 

sergh67

Активный участник
Ну что же вот смотрите.
Просто я думал что все проще.
На оборот не хотел вас заморочить.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Просто я думал что все проще.
Вот и правильно думал... Там всё действительно проще.
Зачем ты разделил заполнение индикаторных массивов и кусок определения цвета на два разных цикла???
Собери всё в один цикл и будет тебе счастье.

А если подробней, то ошибка в том, что limit после завершения первого цикла уже будет = 1 и второй цикл исполняется только при значениях 1 и 0.
 
Верх