CnakeLnCHs mq4
CnakeLnCHs mq4
|
//| | Bookkeeper, 2007, [email protected] |
//+------------+-----------------------------------------------------+
#property copyright ""
#property link ""
//----
#property indicator_chart_window
//+------------------------------------------------------------------+
extern int SR =12;
extern int SRZZ=5;
extern int TCHs=3;
//+------------------------------------------------------------------+
double SA[];
//+------------------------------------------------------------------+
int SSFR[11]={0,0,0,0,0,0,0,0,0,0,0};
//+------------------------------------------------------------------+
double TCH1=0, TS=0;
int MaxBar;
bool First=true;
int prevBars=0;
string GlobName;
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void SACalc(int Pos) { int sw, i, w, ww, Shift; double sum;
SA[Pos]=iMA(NULL,0,SR+1,0,MODE_LWMA,PRICE_OPEN,Pos);
for(Shift=Pos+SR+2;Shift>Pos;Shift--) { sum=0.0;sw=0;i=0; w=Shift+SR;
ww=Shift-SR; if(ww<Pos) ww=Pos;
while(w>=Shift) {i++; sum=sum+i*Open[w]; sw=sw+i; w--; }
while(w>=ww) { i--; sum=sum+i*Open[w]; sw=sw+i; w--; }
SA[Shift]=sum/sw; } return; }
//+------------------------------------------------------------------+
void MainCalculation(int Pos) {
if((Bars-Pos)>(SR+1)) SACalc(Pos); else SA[Pos]=0; return; }
//+------------------------------------------------------------------+
void DelObj(string NO) { int N,i; N=ObjectsTotal();
for(i=N;i>=0;i--) { if(ObjectName(i)==NO) ObjectDelete(NO); } return;}
//+------------------------------------------------------------------+
//+ ??? ?????????? ?????? ???????????? ????? ANG3110 +
//+------------------------------------------------------------------+
int DrawTCH(int BarE, int BarB, int Num) { color CHcolor=LightSlateGray;
int p,i,n,f,f1,ai_1,ai_2,bi_1,bi_2;
double lr,lr0,lrp,sx,sy,sxy,sx2,aa,bb,dh,dl,dh_1,dl_1,dh_2,dl_2;
double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;
double price_p1,price_p0,price_p2,price_01,price_00,price_02;
string CHName=GlobName+Num,LName;
sx=0; sy=0; sxy=0; sx2=0; p=BarE-BarB;
for (n=0; n<=p; n++) {
sx+=n; sy+=Close[n+BarB]; sxy+=n*Close[n+BarB]; sx2+=MathPow(n,2); }
aa=(sx*sy-(p+1)*sxy)/(MathPow(sx,2)-(p+1)*sx2); bb=(sy-aa*sx)/(p+1);
for (i=0;i<=p;i++) { lr=bb+aa*i;dh=High[i+BarB]-lr;dl=Low[i+BarB]-lr;
if (i<p/2) { if (i==0) {dh_1=0.0; dl_1=0.0; ai_1=i; bi_1=i;}
if (dh>=dh_1) {dh_1=dh; ai_1=i;} if (dl<=dl_1) {dl_1=dl; bi_1=i;} }
if (i>=p/2) { if (i==p/2) {dh_2=0.0; dl_2=0.0; ai_2=i; bi_2=i;}
if (dh>=dh_2) {dh_2=dh; ai_2=i;} if (dl<=dl_2) {dl_2=dl; bi_2=i;} } }
lr0=bb; lrp=bb+aa*(i+p);
if (MathAbs(ai_1-ai_2)>MathAbs(bi_1-bi_2)) f=1;
if (MathAbs(ai_1-ai_2)<MathAbs(bi_1-bi_2)) f=2;
if (MathAbs(ai_1-ai_2)==MathAbs(bi_1-bi_2)) {
if (MathAbs(dh_1-dh_2)<MathAbs(dl_1-dl_2)) f=1;
if (MathAbs(dh_1-dh_2)>=MathAbs(dl_1-dl_2)) f=2; }
if (f==1) { for (n=0; n<=20; n++) { f1=0; for (i=0; i<=p; i++) {
hai=High[ai_1+BarB]*(i-ai_2)/(ai_1-ai_2)+
High[ai_2+BarB]*(i-ai_1)/(ai_2-ai_1);
if (i==0 || i==p/2) dhm=0.0;
if (High[i+BarB]-hai>dhm && i<p/2) {ai_1=i; f1=1;}
if (High[i+BarB]-hai>dhm && i>=p/2) {ai_2=i; f1=1;} } }
for (i=0; i<=p; i++) {
hai=High[ai_1+BarB]*(i-ai_2)/(ai_1-ai_2)+
High[ai_2+BarB]*(i-ai_1)/(ai_2-ai_1);
dli=Low[i+BarB]-hai; if (i==0) dlm=0.0; if (dli<dlm) dlm=dli; }
ha0=High[ai_1+BarB]*(0-ai_2)/(ai_1-ai_2)+
High[ai_2+BarB]*(0-ai_1)/(ai_2-ai_1);
hap=High[ai_1+BarB]*(p-ai_2)/(ai_1-ai_2)+
High[ai_2+BarB]*(p-ai_1)/(ai_2-ai_1);
price_p1=hap; price_p0=hap+dlm/2; price_p2=hap+dlm; price_01=ha0;
price_00=ha0+dlm/2; price_02=ha0+dlm; }
if (f==2) { for (n=0; n<=20; n++) { f1=0; for (i=0; i<=p; i++) {
lai=Low[bi_1+BarB]*(i-bi_2)/(bi_1-bi_2)+
Low[bi_2+BarB]*(i-bi_1)/(bi_2-bi_1);
if (i==0 || i==p/2) dlm=0.0;
if (Low[i+BarB]-lai<dlm && i<p/2) {bi_1=i; f1=1;}
if (Low[i+BarB]-lai<dlm && i>=p/2) {bi_2=i; f1=1;} } }
for (i=0; i<=p; i++) {
lai=Low[bi_1+BarB]*(i-bi_2)/(bi_1-bi_2)+
Low[bi_2+BarB]*(i-bi_1)/(bi_2-bi_1);
dhi=High[i+BarB]-lai; if (i==0) dhm=0.0; if (dhi>dhm) dhm=dhi; }
la0=Low[bi_1+BarB]*(0-bi_2)/(bi_1-bi_2)+
Low[bi_2+BarB]*(0-bi_1)/(bi_2-bi_1);
lap=Low[bi_1+BarB]*(p-bi_2)/(bi_1-bi_2)+
Low[bi_2+BarB]*(p-bi_1)/(bi_2-bi_1);
price_p1=lap; price_p0=lap+dhm/2; price_p2=lap+dhm; price_01=la0;
price_00=la0+dhm/2; price_02=la0+dhm; }
LName=CHName+"1"; DelObj(LName);
aa=MathMax(price_p1,price_p2); bb=MathMax(price_01,price_02);
ObjectCreate(LName,OBJ_TREND,0,Time[p+BarB],aa,Time[BarB],bb);
switch(Num) {
case 1:
TCH1=100*(price_01-price_p1)/p/Point;
ObjectSet(LName,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(LName,OBJPROP_WIDTH,2);
ObjectSet(LName,OBJPROP_COLOR,CHcolor); break;
case 2:
ObjectSet(LName,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(LName,OBJPROP_COLOR,CHcolor); break;
default:
ObjectSet(LName,OBJPROP_STYLE,STYLE_DOT);
ObjectSet(LName,OBJPROP_COLOR,LightSlateGray); break; }
LName=CHName+"2"; DelObj(LName);
aa=MathMin(price_p1,price_p2); bb=MathMin(price_01,price_02);
ObjectCreate(LName,OBJ_TREND,0,Time[p+BarB],aa,Time[BarB],bb);
switch(Num) {
case 1:
ObjectSet(LName,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(LName,OBJPROP_WIDTH,2);
ObjectSet(LName,OBJPROP_COLOR,CHcolor); break;
case 2:
ObjectSet(LName,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(LName,OBJPROP_COLOR,CHcolor); break;
default:
ObjectSet(LName,OBJPROP_STYLE,STYLE_DOT);
ObjectSet(LName,OBJPROP_COLOR,LightSlateGray); break; }
if(Num==1) {
LName=CHName+"01"; DelObj(LName);
aa=price_p1*0.618+price_p2*0.382; bb=price_01*0.618+price_02*0.382;
ObjectCreate(LName,OBJ_TREND,0,Time[p+BarB],aa,Time[BarB],bb);
ObjectSet(LName,OBJPROP_COLOR,CHcolor);
ObjectSet(LName,OBJPROP_STYLE,STYLE_DOT);
LName=CHName+"02"; DelObj(LName);
aa=price_p1*0.382+price_p2*0.618; bb=price_01*0.382+price_02*0.618;
ObjectCreate(LName,OBJ_TREND,0,Time[p+BarB],aa,Time[BarB],bb);
ObjectSet(LName,OBJPROP_COLOR,CHcolor);
ObjectSet(LName,OBJPROP_STYLE,STYLE_DOT);
LName=CHName+"011"; DelObj(LName);
if(price_p1>price_01) {
aa=MathMax(price_p1,price_p2)*0.764+MathMin(price_p1,price_p2)*0.236;
bb=MathMax(price_01,price_02)*0.764+MathMin(price_01,price_02)*0.236; }
else {
aa=MathMin(price_p1,price_p2)*0.764+MathMax(price_p1,price_p2)*0.236;
bb=MathMin(price_01,price_02)*0.764+MathMax(price_01,price_02)*0.236; }
ObjectCreate(LName,OBJ_TREND,0,Time[p+BarB],aa,Time[BarB],bb);
ObjectSet(LName,OBJPROP_COLOR,CHcolor);
ObjectSet(LName,OBJPROP_STYLE,STYLE_DOT); } return(0); }
//+------------------------------------------------------------------+
void SSCalc(int Pos) { int i,RBar,LBar,ZZ,NZZ,NZig,NZag;
i=Pos-1; NZig=0; NZag=0; SSFR[0]=0;
while(i<MaxBar && ZZ==0) { i++; RBar=i-SRZZ; if(RBar<Pos) RBar=Pos;
LBar=i+SRZZ;
if(i==ArrayMinimum(SA,LBar-RBar+1,RBar)) { ZZ=-1; NZig=i; }
if(i==ArrayMaximum(SA,LBar-RBar+1,RBar)) { ZZ=1;NZag=i; } }
if(ZZ==0) return; NZZ=0; if(i>Pos) { if(SA[i]>SA[Pos]) { if(ZZ==1) {
if(i>=Pos+SRZZ && NZZ<(TCHs+2)) { NZZ++; SSFR[NZZ]=i; } NZag=i; } }
else { if(ZZ==-1) {
if(i>=Pos+SRZZ && NZZ<(TCHs+2)) { NZZ++; SSFR[NZZ]=i; } NZig=i; } } }
while(NZZ<(TCHs+2)) { RBar=i-SRZZ; if(RBar<Pos) RBar=Pos; LBar=i+SRZZ;
if(i==ArrayMinimum(SA,LBar-RBar+1,RBar)) {
if(ZZ==-1 && SA[i]<SA[NZig]) {
if(i>=Pos+SRZZ && NZZ<(TCHs+2)) SSFR[NZZ]=i; NZig=i; }
if(ZZ==1) { if(i>=Pos+SRZZ && NZZ<(TCHs+2)) { NZZ++; SSFR[NZZ]=i; }
ZZ=-1; NZig=i; } } if(i==ArrayMaximum(SA,LBar-RBar+1,RBar)) {
if(ZZ==1 && SA[i]>SA[NZag]) {
if(i>=Pos+SRZZ && NZZ<(TCHs+2)) SSFR[NZZ]=i; NZag=i; }
if(ZZ==-1) { if(i>=Pos+SRZZ && NZZ<(TCHs+2)) { NZZ++; SSFR[NZZ]=i; }
ZZ=1; NZag=i; } } i++; if(i>=MaxBar) return; } return; }
//+------------------------------------------------------------------+
int init() { IndicatorBuffers(1);
SetIndexBuffer(0,SA); SetIndexStyle(0,DRAW_NONE);
GlobName="CHs_"+Symbol()+"_"+Period()+"_"; return(0); }
//+------------------------------------------------------------------+
void deinit() { int N,i; string SStr,NO;
Comment(""); N=ObjectsTotal(); for(i=N;i>=0;i--) {
NO=ObjectName(i); SStr=StringSubstr(NO,0,StringLen(GlobName));
if(SStr==GlobName) ObjectDelete(NO); } return; }
//+------------------------------------------------------------------+
void start() { int counted_bars=IndicatorCounted(); int i,j;
if(First==true) { if(Bars<=2*(SRZZ+SR+2)) return(-1); if(SR<2) SR=2;
if(TCHs>9) TCHs=9; if(TCHs<2) TCHs=2;
if(SRZZ<=SR) SRZZ=SR+1; MaxBar=Bars-(SRZZ+SR+2); First=false; }
if(prevBars!=Bars) { if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--; j=Bars-counted_bars;
for(i=j;i>=0;i--) MainCalculation(i); SSCalc(0);
for(i=1;i<=TCHs;i++) DrawTCH(SSFR[i]+1,SSFR[i-1],i); prevBars=Bars; }
return; }
//+------------------------------------------------------------------+