Как заставить автоматически перерисовываться индикатор Fisher на каждом тике? - страница 2

 

ЗЫ Код индикатора где ?

.

Индикатор валяется в любом углу в сети, не хочется ветку захламлять массивами кодов.

 
alexbel:

ЗЫ Код индикатора где ?

.

Индикатор валяется в любом углу в сети, не хочется ветку захламлять массивами кодов.

Этих реализаций "вагон" и все работают по-разному. Тогда в клуб из предыдущего моего поста: там догадаются какую реализацию Вы используете.

Вы, вообще, помощи хотите или просто поговорить ?

Если хотите помощи, так, какого лешего, тому кто пытается помочь, еще и надо лазить по сети и искать да потом еще и догадываться это тот код или нет ???????

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

Впрочем, воля Ваша ......

 
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 White
#property indicator_color2 Lime
#property indicator_color3 Red

extern int period=10;

double ExtBuffer0[];
double ExtBuffer1[];
double ExtBuffer2[];


int init()
{


SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,1,Red);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,1,Lime);
SetIndexStyle(2,DRAW_HISTOGRAM);
IndicatorDigits(Digits-1);

SetIndexBuffer(0,ExtBuffer0);
SetIndexBuffer(1,ExtBuffer1);
SetIndexBuffer(2,ExtBuffer2);

IndicatorShortName("Fisher");
SetIndexLabel(1,NULL);
SetIndexLabel(2,NULL);

return(0);
}


int start()
{
//int period=10;
int limit;
int counted_bars=IndicatorCounted();
double prev,current,old;
double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
double price;
double MinL=0;
double MaxH=0;


if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;


for(int i=0; i<limit; i++)
{ MaxH = High[Highest(NULL,0,MODE_HIGH,period,i)];
MinL = Low[Lowest(NULL,0,MODE_LOW,period,i)];
price = (High[i]+Low[i])/2;
Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;
Value=MathMin(MathMax(Value,-0.999),0.999);
ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
Value1=Value;
Fish1=ExtBuffer0[i];

}


bool up=true;
for(i=limit-2; i>=0; i--)
{
current=ExtBuffer0[i];
prev=ExtBuffer0[i+1];

if (((current<0)&&(prev>0))||(current<0)) up= false;
if (((current>0)&&(prev<0))||(current>0)) up= true;

if(!up)
{
ExtBuffer2[i]=current;
ExtBuffer1[i]=0.0;
}

else
{
ExtBuffer1[i]=current;
ExtBuffer2[i]=0.0;
}
// Alert(" 0 ",ExtBuffer1[0]," ",ExtBuffer2[0]);
//Alert(" 1 ",ExtBuffer1[1]," ",ExtBuffer2[1]);
}

return(0);
}
 

Вот индикатор.

А с этим "Свое время Вы ценить пытаетесь - не разбираетесь сами через отладку" вы сильно ошибаетесь. Думается что дело вообще не в самом индикаторе.


И ещё раз очень прошу - не надо МЕНЯ обсуждать, если есть чем помочь буду благодарен, нет - ....

 
VladislavVG:

Этих реализаций "вагон" и все работают по-разному. Тогда в клуб из предыдущего моего поста: там догадаются какую реализацию Вы используете.

Вы, вообще, помощи хотите или просто поговорить ?

Если хотите помощи, так, какого лешего, тому кто пытается помочь, еще и надо лазить по сети и искать да потом еще и догадываться это тот код или нет ???????

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

Впрочем, воля Ваша ......

Вопрос не в конкретном коде индюка, это наблюдается у многих индюков. Вопрос как программно делать обновление графика. Если этот будет реализовано, то и решится проблема для всех индюков.
 

Вот! khorosh, благодарен Вам за понимание сути вопроса!

Возможно это вопрос к программистам метатрейдера

 
alexbel:

Вот индикатор.

А с этим "Свое время Вы ценить пытаетесь - не разбираетесь сами через отладку" вы сильно ошибаетесь. Думается что дело вообще не в самом индикаторе.


И ещё раз очень прошу - не надо МЕНЯ обсуждать, если есть чем помочь буду благодарен, нет - ....

Неверно рассчитывается количество баров для пересчета.

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 White
#property indicator_color2 Lime
#property indicator_color3 Red

extern int period=10;

double ExtBuffer0[];
double ExtBuffer1[];
double ExtBuffer2[];


int init()
{


SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,1,Red);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,1,Lime);
SetIndexStyle(2,DRAW_HISTOGRAM);
IndicatorDigits(Digits-1);

SetIndexBuffer(0,ExtBuffer0);
SetIndexBuffer(1,ExtBuffer1);
SetIndexBuffer(2,ExtBuffer2);

IndicatorShortName("Fisher");
SetIndexLabel(1,NULL);
SetIndexLabel(2,NULL);

return(0);
}


int start()
{ 
//int period=10;
int limit;
int counted_bars=IndicatorCounted();
double prev,current,old;
double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
double price;
double MinL=0;
double MaxH=0; 


if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;


for(int i=0; i<limit; i++)
{ MaxH = High[Highest(NULL,0,MODE_HIGH,period,i)];
MinL = Low[Lowest(NULL,0,MODE_LOW,period,i)];
price = (High[i]+Low[i])/2;
Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1; 
Value=MathMin(MathMax(Value,-0.999),0.999); 
ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
Value1=Value;
Fish1=ExtBuffer0[i];

}


bool up=true;
for(i=limit-2; i>=0; i--)
{
current=ExtBuffer0[i];
prev=ExtBuffer0[i+1];

if (((current<0)&&(prev>0))||(current<0)) up= false; 
if (((current>0)&&(prev<0))||(current>0)) up= true;

if(!up)
{
ExtBuffer2[i]=current;
ExtBuffer1[i]=0.0;
}

else
{
ExtBuffer1[i]=current;
ExtBuffer2[i]=0.0;
}
// Alert(" 0 ",ExtBuffer1[0]," ",ExtBuffer2[0]);
//Alert(" 1 ",ExtBuffer1[1]," ",ExtBuffer2[1]);
}

return(0);
}

Решений масса:

1.проверить на минимально необходимое число баров для пересчета (их в данном случае 3)

2. поставить константу, например 200, но тогда все время будет пересчитываться 200 баров на каждом тике.

Кстати, как с перерисовкой бороться собираетесь ?

ЗЫ Самый верный вариант использования этой реализации я так и не указал - выкинуть ;).

 
khorosh:
Вопрос не в конкретном коде индюка, это наблюдается у многих индюков. Вопрос как программно делать обновление графика. Если этот будет реализовано, то и решится проблема для всех индюков.
Только через API. Например, переключением ТФ туда-обратно. Вот тут есть варианты, да и потом неоднократно эта тема обсуждалась.
Видимо, как всегда, корректно это возможно сделать с помощью библиотеки Жунко :))

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

Вот! khorosh, благодарен Вам за понимание сути вопроса!

Возможно это вопрос к программистам метатрейдера

Нет там "сути" в Вашем случае - ошибка в кодах индикатора всего-то лишь.

2 khorosh надо руки "криворуким" программерам править ;) - вот и будет суть. А не выдумывать "костыли" для нивелирования багов ))))))))). ИМХО, конечно же.

 
"

Решений масса:

1.проверить на минимально необходимое число баров для пересчета (их в данном случае 3)

2. поставить константу, например 200, но тогда все время будет пересчитываться 200 баров на каждом тике.

Кстати, как с перерисовкой бороться собираетесь ?" - ставил константу - не помогло.


"Только через API. Например, переключением ТФ туда-обратно." -была эта мысль, "вручную" это работает, буду пытаться её реализовать, спасибо