shmorca
02-06-2007, 09:15
Testvam tozi indikator SHI_SilverTrendSig-2. Na grafika D1 na E/U ima chervena tochka (signal za obryshtane), obache kato uvelicha dva pati grafikata i mahna ot lqvo prorcite Navigator i Pazar chervenata tochka se maha.
Pri zlatoto e syshto se poqvava tozi problem samo che tam uvelichavm edin pat bez da maham prozorcite Navigator i Pazar.
Zashto taka se poluchava?
Eto i sourca na indikatora:
#property copyright "Copyright © 2005, Shurka"
#property link "http://shforex.narod.ru"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- Входные параметры
extern int AllBars=0;//Для скольки баров считать. 0 - для всех.
extern int Otstup=30;//Отступ.
extern double Per=9;//Период.
int SH,NB,i,UD;
int nNB;
double R,SHMax,SHMin;
double BufD[];
double BufU[];
#define SH_BUY 1
#define SH_SELL -1
//+------------------------------------------------------------------+
//| Функция инициализации |
//+------------------------------------------------------------------+
int init()
{
//В NB записываем количество баров для которых считаем индикатор
if (Bars<+Per || AllBars==0) NB=Bars-Per; else NB=AllBars;
IndicatorBuffers(2);
IndicatorShortName("SHI_SilverTrendSig");
SetIndexStyle(0,DRAW_ARROW,0,1);
SetIndexStyle(1,DRAW_ARROW,0,1);
SetIndexArrow(0,159);
SetIndexArrow(1,159);
SetIndexBuffer(0,BufU);
SetIndexBuffer(1,BufD);
SetIndexDrawBegin(0,Bars-NB);//Индикатор будетотображаться только для NB баров
SetIndexDrawBegin(1,Bars-NB);
ArrayInitialize(BufD,0.0);//Забьём оба буфера ноликами. Иначе будет мусор при смене таймфрейма.
ArrayInitialize(BufU,0.0);
return(0);
}
//+------------------------------------------------------------------+
//| Функция деинициализации |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Собсна индикатор |
//+------------------------------------------------------------------+
int start()
{
int CB=IndicatorCounted();
/* Тут вот та самая оптимизационная фишка. В язык введена функция, которая возвращает количество
посчитанных баров, причём очень хитро. При первом вызове индикатора это 0, всё понятно, ещё ничего
не считалось, а затем выдаёт количество обсчитанных баров минус один. Т.е. если всего баров 100,
то функция вернёт 99. Я ввёл такой код, выше у меня определялась NB - кол-во баров подлежащих
обсчёту. В принципе этот параметр можно и выкинуть, однако для тех кто в танке (I80286) можно
и оставить. Так вот, здесь, при первом вызове NB остаётся прежней, а при последующих уменьшается
до последнего бара, т.е. 1 или 2, ну или сколько там осталось посчитать*/
// if(CB<0) return(-1); else if(NB>Bars-CB) NB=Bars-CB;
if(CB<0) return(-1); else if(CB==0) NB=Bars; else NB=BarsPerWindow();
ObjectsDeleteAll(EMPTY, OBJ_ARROW);
for(int n=0;n<=NB;n++)
{
BufU[n]=0.00;
BufD[n]=0.00;
}
for (SH=1;SH<NB;SH++)//Прочёсываем график от 1 до NB
{
for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High[i]-Low[i]);} R/=55;
SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)];
SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)];
if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufU[SH]=Low[SH]-R*0.5; UD=SH_BUY; }
if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufD[SH]=High[SH]+R*0.5; UD=SH_SELL; }
}
return(0);
}
Pri zlatoto e syshto se poqvava tozi problem samo che tam uvelichavm edin pat bez da maham prozorcite Navigator i Pazar.
Zashto taka se poluchava?
Eto i sourca na indikatora:
#property copyright "Copyright © 2005, Shurka"
#property link "http://shforex.narod.ru"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- Входные параметры
extern int AllBars=0;//Для скольки баров считать. 0 - для всех.
extern int Otstup=30;//Отступ.
extern double Per=9;//Период.
int SH,NB,i,UD;
int nNB;
double R,SHMax,SHMin;
double BufD[];
double BufU[];
#define SH_BUY 1
#define SH_SELL -1
//+------------------------------------------------------------------+
//| Функция инициализации |
//+------------------------------------------------------------------+
int init()
{
//В NB записываем количество баров для которых считаем индикатор
if (Bars<+Per || AllBars==0) NB=Bars-Per; else NB=AllBars;
IndicatorBuffers(2);
IndicatorShortName("SHI_SilverTrendSig");
SetIndexStyle(0,DRAW_ARROW,0,1);
SetIndexStyle(1,DRAW_ARROW,0,1);
SetIndexArrow(0,159);
SetIndexArrow(1,159);
SetIndexBuffer(0,BufU);
SetIndexBuffer(1,BufD);
SetIndexDrawBegin(0,Bars-NB);//Индикатор будетотображаться только для NB баров
SetIndexDrawBegin(1,Bars-NB);
ArrayInitialize(BufD,0.0);//Забьём оба буфера ноликами. Иначе будет мусор при смене таймфрейма.
ArrayInitialize(BufU,0.0);
return(0);
}
//+------------------------------------------------------------------+
//| Функция деинициализации |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Собсна индикатор |
//+------------------------------------------------------------------+
int start()
{
int CB=IndicatorCounted();
/* Тут вот та самая оптимизационная фишка. В язык введена функция, которая возвращает количество
посчитанных баров, причём очень хитро. При первом вызове индикатора это 0, всё понятно, ещё ничего
не считалось, а затем выдаёт количество обсчитанных баров минус один. Т.е. если всего баров 100,
то функция вернёт 99. Я ввёл такой код, выше у меня определялась NB - кол-во баров подлежащих
обсчёту. В принципе этот параметр можно и выкинуть, однако для тех кто в танке (I80286) можно
и оставить. Так вот, здесь, при первом вызове NB остаётся прежней, а при последующих уменьшается
до последнего бара, т.е. 1 или 2, ну или сколько там осталось посчитать*/
// if(CB<0) return(-1); else if(NB>Bars-CB) NB=Bars-CB;
if(CB<0) return(-1); else if(CB==0) NB=Bars; else NB=BarsPerWindow();
ObjectsDeleteAll(EMPTY, OBJ_ARROW);
for(int n=0;n<=NB;n++)
{
BufU[n]=0.00;
BufD[n]=0.00;
}
for (SH=1;SH<NB;SH++)//Прочёсываем график от 1 до NB
{
for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High[i]-Low[i]);} R/=55;
SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)];
SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)];
if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufU[SH]=Low[SH]-R*0.5; UD=SH_BUY; }
if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufD[SH]=High[SH]+R*0.5; UD=SH_SELL; }
}
return(0);
}