//+------------------------------------------------------------------+ //| Correlation Charting.mq4 | //| Copyright © 2006, Nicholas Barker | //| nick@barker.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Nicholas Barker" #property link "nick@barker.net" //#include #property indicator_chart_window #property indicator_buffers 8 extern string symbol1 =""; extern string s1correlation ="+"; extern color s1color =DarkOrchid; extern int TF = 0; extern double s1adjust_percent =100; extern string s2 =""; extern string s2cor ="+"; extern double s2adj =100; extern string s3 =""; extern string s3cor ="+"; extern double s3adj =100; extern string s4 =""; extern string s4cor ="+"; extern double s4adj =100; string s[4]; string cor[4]; double adj[4]; bool hasrun=false; int bar; double base; double base2[4]; double E1[]; double E2[]; double E3[]; double E4[]; double E5[]; double E6[]; double E7[]; double E8[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { if(StringFind(Symbol(),"m",0)>0){ symbol1=symbol1+"m"; s2=s2+"m"; s3=s3+"m"; s4=s4+"m"; } s[0]=symbol1; s[1]=s2; s[2]=s3; s[3]=s4; cor[0]=s1correlation; cor[1]=s2cor; cor[2]=s3cor; cor[3]=s4cor; adj[0]=s1adjust_percent; adj[1]=s2adj; adj[2]=s3adj; adj[3]=s4adj; int wbpc=WindowBarsPerChart(); if(wbpc>200)int size=2; else if (wbpc< 40)size=4; else size=3; SetIndexStyle(0,DRAW_LINE,0,0,DarkOrchid); SetIndexBuffer(0,E1); SetIndexStyle(1,DRAW_LINE,0,0,Crimson); SetIndexBuffer(1,E2); SetIndexStyle(2,DRAW_LINE,0,0,Pink); SetIndexBuffer(2,E3); SetIndexStyle(3,DRAW_LINE,0,0,Gold); SetIndexBuffer(3,E4); SetIndexStyle(4,DRAW_HISTOGRAM,0,1,s1color); SetIndexBuffer(4,E5); SetIndexStyle(5,DRAW_HISTOGRAM,0,1,s1color); SetIndexBuffer(5,E6); SetIndexStyle(6,DRAW_HISTOGRAM,0,size,s1color); SetIndexBuffer(6,E7); SetIndexStyle(7,DRAW_HISTOGRAM,0,size,s1color); SetIndexBuffer(7,E8); // Comment(a1," ",a2); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- GlobalVariableSet(Symbol()+"CCIND",GlobalVariableGet(Symbol()+"CCIND")-1); //ObjectsDeleteAll(); Comment(""); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start(){ if(TF==0){ if(hasrun){ run(); }else{ runonce(); hasrun=true; } } else runonce(); return(0); } //+------------------------------------------------------------------+ void drawLine(double lvl,string name, color Col,int type){ if(ObjectFind(name) != 0){ ObjectCreate(name, OBJ_HLINE, 0, Time[0], lvl,Time[0],lvl); if(type == 1) ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID); else ObjectSet(name, OBJPROP_STYLE, STYLE_DOT); ObjectSet(name, OBJPROP_COLOR, Col); ObjectSet(name,OBJPROP_WIDTH,1); }else{ ObjectDelete(name); ObjectCreate(name, OBJ_HLINE, 0, Time[0], lvl,Time[0],lvl); if(type == 1) ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID); else ObjectSet(name, OBJPROP_STYLE, STYLE_DOT); ObjectSet(name, OBJPROP_COLOR, Col); ObjectSet(name,OBJPROP_WIDTH,1); } } void drawLabel(string name,double lvl,color Color){ if(ObjectFind(name) != 0){ ObjectCreate(name, OBJ_TEXT, 0, Time[10], lvl); ObjectSetText(name, name, 8, "Arial", EMPTY); ObjectSet(name, OBJPROP_COLOR, Color); } else { ObjectMove(name, 0, Time[10], lvl); } } int runonce(){ bar= WindowFirstVisibleBar(); base= Close[bar]; for(int y=0;y<4;y++)base2[y]=iClose(s[y],0,bar); int i;double change; int c; for(y=0;y<4;y++){ if(StringLen(s[y])>2){ c++; } } if(c<=1){ for(i=bar;i>=0;i--){ if(TF>0)int ss=i; else{ datetime time = iTime(Symbol(),TF,i); ss = iBarShift(s[0],TF,time,false); } if(ss<0)continue; double highchange = base2[0] - iHigh (s[0],TF,ss); double lowchange = base2[0] - iLow (s[0],TF,ss); double openchange = base2[0] - iOpen (s[0],TF,ss); double closechange= base2[0] - iClose(s[0],TF,ss); highchange = highchange / MarketInfo(s[0],MODE_POINT); lowchange = lowchange / MarketInfo(s[0],MODE_POINT); openchange = openchange / MarketInfo(s[0],MODE_POINT); closechange = closechange / MarketInfo(s[0],MODE_POINT); if(cor[0]=="+"){ E6[i]=base-(highchange*Point*(adj[0]/100)); E5[i]=base-(lowchange*Point*(adj[0]/100)); E7[i]=base-(openchange*Point*(adj[0]/100)); E8[i]=base-(closechange*Point*(adj[0]/100)); }else { E6[i]=base+(highchange*Point*(adj[0]/100)); E5[i]=base+(lowchange*Point*(adj[0]/100)); E7[i]=base+(openchange*Point*(adj[0]/100)); E8[i]=base+(closechange*Point*(adj[0]/100)); } } drawLine(E8[0],s[0]+" Price", s1color,1); drawLabel(s[0],E8[0],s1color); return(0); } if(StringLen(s[0])>2){ for(i=bar-1;i>=0;i--){ change = base2[0] - iClose(s[0],0,i); change = change / MarketInfo(s[0],MODE_POINT); if(cor[0]=="+"){ E1[i]=base-(change*Point*(adj[0]/100)); }else { E1[i]=base+(change*Point*(adj[0]/100)); } } } if(StringLen(s[1])>2){ for(i=bar-1;i>=0;i--){ change = base2[1] - iClose(s[1],0,i+1); change = change / MarketInfo(s[1],MODE_POINT); if(cor[1]=="+"){ E2[i]=base-(change*Point*(adj[1]/100)); }else { E2[i]=base+(change*Point*(adj[0]/100)); } } } if(StringLen(s[2])>2){ for(i=bar-1;i>=0;i--){ change = base2[2] - iClose(s[2],0,i+1); change = change / MarketInfo(s[2],MODE_POINT); if(cor[2]=="+"){ E3[i]=base-(change*Point*(adj[2]/100)); }else { E3[i]=base+(change*Point*(adj[2]/100)); } } } if(StringLen(s[3])>2){ for(i=bar-1;i>=0;i--){ change = base2[3] - iClose(s[3],0,i+1); change = change / MarketInfo(s[3],MODE_POINT); if(cor[3]=="+"){ E4[i]=base-(change*Point*(adj[3]/100)); }else { E4[i]=base+(change*Point*(adj[3]/100)); } } } return(0); } int run(){ int i=0;double change;int c; for(int y=0;y<4;y++){ if(StringLen(s[y])>2){ c++; } } if(c<=1){ double highchange = base2[0] - iHigh(s[0],TF,i); double lowchange = base2[0] - iLow(s[0],TF,i); double openchange= base2[0] - iOpen(s[0],TF,i); double closechange= base2[0] - iClose(s[0],TF,i); highchange = highchange / MarketInfo(s[0],MODE_POINT); lowchange = lowchange / MarketInfo(s[0],MODE_POINT); openchange = openchange / MarketInfo(s[0],MODE_POINT); closechange = closechange / MarketInfo(s[0],MODE_POINT); if(cor[0]=="+"){ E6[i]=base-(highchange*Point*(adj[0]/100)); E5[i]=base-(lowchange*Point*(adj[0]/100)); E7[i]=base-(openchange*Point*(adj[0]/100)); E8[i]=base-(closechange*Point*(adj[0]/100)); }else { E6[i]=base+(highchange*Point*(adj[0]/100)); E5[i]=base+(lowchange*Point*(adj[0]/100)); E7[i]=base+(openchange*Point*(adj[0]/100)); E8[i]=base+(closechange*Point*(adj[0]/100)); } drawLine(E8[0],s[0]+" Price", s1color,1); drawLabel(s[0],E8[0],s1color); return(0); } if(StringLen(s[0])>2){ change = base2[0] - iClose(s[0],0,i); change = change / MarketInfo(s[0],MODE_POINT); if(cor[0]=="+"){ E1[i]=base-(change*Point*(adj[0]/100)); }else { E1[i]=base+(change*Point*(adj[0]/100)); } } if(StringLen(s[1])>2){ change = base2[1] - iClose(s[1],0,i); change = change / MarketInfo(s[1],MODE_POINT); if(cor[1]=="+"){ E2[i]=base-(change*Point*(adj[1]/100)); }else { E2[i]=base+(change*Point*(adj[0]/100)); } } if(StringLen(s[2])>2){ // for(i=bar-1;i>=0;i--){ change = base2[2] - iClose(s[2],0,i); change = change / MarketInfo(s[2],MODE_POINT); if(cor[2]=="+"){ E3[i]=base-(change*Point*(adj[2]/100)); }else { E3[i]=base+(change*Point*(adj[2]/100)); } // } } if(StringLen(s[3])>2){ // for(i=bar-1;i>=0;i--){ change = base2[3] - iClose(s[3],0,i); change = change / MarketInfo(s[3],MODE_POINT); if(cor[3]=="+"){ E4[i]=base-(change*Point*(adj[3]/100)); }else { E4[i]=base+(change*Point*(adj[3]/100)); } // } } return(0); }