//+------------------------------------------------------------------+ //| MultiCharts.mq4 | //| Copyright © 2009, Koss | //| kosmic@inbox.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, Koss" #property link "kosmic@inbox.ru" #property indicator_separate_window #property indicator_buffers 8 #property indicator_minimum -10 #property indicator_maximum 110 #import "user32.dll" int GetWindowDC(int dc); int ReleaseDC(int h, int dc); bool GetWindowRect(int h, int& pos[4]); /*int GetParent(int h); int GetTopWindow(int h);*/ #import #import "gdi32.dll" int GetPixel(int dc, int x, int y); #import extern color BearCandle = Red; extern color BullCandle = White; extern color FastMA_Color = Gold; extern int FastMA_Period = 21; extern color SlowMA_Color = Green; extern int SlowMA_Period = 38; extern int MA_Metod = 0; extern int Applied_Price = 0; extern bool UseMovingAverages =true; extern bool UseHeikenAshiChart =false; extern bool ViewOHLC=true; extern bool ViewSPREAD=true; extern int Charts =5; extern string Chart1 ="EURUSD"; extern string Chart2 ="GBPUSD"; extern string Chart3 ="AUDUSD"; extern string Chart4 ="USDCAD"; extern string Chart5 ="USDJPY"; //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; double ExtMapBuffer4[]; double ExtMapBuffer5[]; double ExtMapBuffer6[]; double SlowMABuffer[]; double FastMABuffer[]; //---- int CandelsCountOnWindow=0, Frame, hWnd, Win_Charts, CandleWidth, HistoWidth, MAWidth=1, TimeFrame, MA, Ap_Price; color Win_color; double ChartValues[6][4]; static datetime ÒicTime[5], ZeroBarTime[5]; int Hystory[5]; string Win_Name, ChartNames[5]; string Periods[9][2] ={ "1", ",M1", "5", ",M5", "15", ",M15", "30", ",M30", "60", ",H1", "240", ",H4", "1440", ",Daily", "10080", ",Weekly", "43200", ",Monthly"}; bool StartTerminal=true; double open,close,high,low,min,max,point,haopen, hahigh, halow, haclose,FastMA,SlowMA; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { TimeFrame=Period(); Win_Name = "TFS"; IndicatorShortName(Win_Name); DeleteChartNames(); Win_color = GetWndColor(Symbol()); CandleWidth = GetCandleWidth(Symbol()); if (Charts<1 || Charts>5) Win_Charts=5; else Win_Charts = Charts; if (MA_Metod<0 || MA_Metod>3) MA=0; else MA=MA_Metod; if (Applied_Price<0 || Applied_Price>6) Ap_Price=0; else Ap_Price=Applied_Price; if (!IsDllsAllowed()) { Alert("Äëÿ íîðìàëüíîé ðàáîòû èíäèêàòîðà íåîáõîäèìî ðàçðåøèòü èìïîðò èç DLL"); return(0); } else { if (WindowBarsPerChart()!=0) { ChartsInit(); CandelsCountOnWindow=WindowBarsPerChart(); Frame = MathRound((CandelsCountOnWindow-3)/Win_Charts); switch(CandleWidth) { case 1: HistoWidth=0; MAWidth=1; break; case 2: HistoWidth=0; MAWidth=1; break; case 4: HistoWidth=2; MAWidth=1; break; case 8: HistoWidth=3; MAWidth=2; break; case 16: HistoWidth=7; MAWidth=2; break; case 32: HistoWidth=13; MAWidth=3; break; } IndicatorSets(false); } return(0); } } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { if( WindowBarsPerChart()!=0 && Bars!=0 && AccountNumber()!=0) { if (StartTerminal) { CleanHisto(); LoadHystory(); } if (!WndRepaint()) { SymbolÒic(); } StartTerminal=false; } else { init(); } return(0); } //+------------------------------------------------------------------+ //|âîçâðàùàåò öâåò ôîíà îêíà òåêóùåãî ãðôèêà | //+------------------------------------------------------------------+ int GetWndColor(string sy) { int hWnd = WindowHandle(sy, Period()); int hDC = GetWindowDC(hWnd); int rect[4]; GetWindowRect(hWnd, rect); int wW = rect[2] - rect[0]; // øèðèíà îêíà int wH = rect[3] - rect[1]; // âûñîòà îêíà int col = GetPixel(hDC, 2, 2); if(col==-1) // ëåâûé âåðõíèé óãîë íå âèäåí { col = GetPixel(hDC, wW-3, wH-3); if(col==-1) // ïðàâûé íèæíèé óãîë íå âèäåí col = GetPixel(hDC, 2, wH-3); if(col==-1) // ëåâûé íèæíèé óãîë íå âèäåí col = GetPixel(hDC, wW-3, 2); if(col==-1) // ïðàâûé âåðõíèé óãîë íå âèäåí { ReleaseDC(hWnd, hDC); return(Win_color); } } ReleaseDC(hWnd, hDC); return(col); } void ChartsInit() { LoadChartsNames(); InitArrays(); } void LoadChartsNames() { ChartNames[0]=Chart1; ChartNames[1]=Chart2; ChartNames[2]=Chart3; ChartNames[3]=Chart4; ChartNames[4]=Chart5; } void InitArrays() { for(int i=0;i<=Win_Charts-1;i++) { ZeroBarTime[i]=0; ÒicTime[i]=0; Hystory[i]=0; continue; } } void LoadChartsValues() { for(int i=0;i<=Win_Charts-1;i++) { UpgradeCharts(i); continue; } } void LoadHystory() { for(int i=0;i<=Win_Charts-1;i++) { Hystory[i]=RefreshRate(i); continue; } } void UpgradeCharts(int ChartListPosition) { int j; double min,max; string Symb=ChartNames[ChartListPosition]; if (Hystory[ChartListPosition]==1) { max=iHigh(Symb,0,0); min=iLow(Symb,0,0); for (j=0;j<=Frame-2;j++) { if (iHigh(Symb,0,j)>max) { max=iHigh(Symb,0,j); } if (iLow(Symb,0,j)<min) { min=iLow(Symb,0,j); } } ChartValues[ChartListPosition+1,1]=((max-min)/100); ChartValues[ChartListPosition+1,2]= max; ChartValues[ChartListPosition+1,3]= min; CleanFrame(ChartListPosition+1); DrawChart(ChartListPosition); DrawSeparateLines(ChartListPosition); ChartName(ChartListPosition); if (ViewOHLC) OHLC(ChartListPosition); } else { ChartValues[ChartListPosition+1,1]=0; ChartValues[ChartListPosition+1,2]=0; ChartValues[ChartListPosition+1,3]=0; CleanFrame(ChartListPosition+1); ChartName(ChartListPosition); DrawSeparateLines(ChartListPosition); } ChartValues[0,0]=ChartListPosition+1; } //+------------------------------------------------------------------+ //|Îáíîâëåíèå äàííûõ | //+------------------------------------------------------------------+ int RefreshRate(int ChartListPosition) { string Symb=ChartNames[ChartListPosition]; datetime times[]; int error; ArrayCopySeries(times,MODE_TIME,Symb,0); error=GetLastError(); if(error==4066) { return(0); } if((iTime(Symb,0,0)==times[0] && iTime(Symb,0,0)==Time[0])&& (iTime(Symb,0,1)==times[1] && iTime(Symb,0,1)==Time[1])&& (iTime(Symb,0,2)==times[2] && iTime(Symb,0,2)==Time[2]) ) return(1); } //+------------------------------------------------------------------+ //|îòðèñîâêà íàçâàíèé èíñòðóìåíòîâ è ïðî÷èõ íàäïèñåé | //+------------------------------------------------------------------+ void ChartName(int ChartListPosition) { int k=MathRound(Frame/2); if (ChartListPosition==0) { DrawChartsName(ChartListPosition,k); } else { DrawChartsName(ChartListPosition,k+ChartListPosition*Frame); } } void DrawChartsName(int ChartListPosition,int Bar) { string TF,name,spread,Symb=ChartNames[ChartListPosition]; for(int p=0; p<9; p++) { if(Periods[p][0]==DoubleToStr(TimeFrame,0)) TF=Periods[p][1]; } name="Chart"+Symb; if (ViewSPREAD) spread=" (spr "+DoubleToStr(MarketInfo(Symb,MODE_SPREAD),0)+")"; else spread=" "; if (!UseHeikenAshiChart) { CleanChartsName(ChartListPosition); CleanUpdateText(ChartListPosition); CreateTextObject(name, Time[Bar],108,Symb+TF+spread,BullCandle,Bar,"tahoma",7); if (Hystory[ChartListPosition]==0 || !IsConnected()) { CreateTextObject("Update "+name, Time[Bar],55,"ÎÆÈÄÀÍÈÅ ÎÁÍÎÂËÅÍÈß...",BullCandle,Bar,"tahoma",7); } } else { CleanChartsName(ChartListPosition); CleanUpdateText(ChartListPosition); CreateTextObject(name, Time[Bar],108,Symb+TF+" (HA)",BullCandle,Bar,"tahoma",7); if (Hystory[ChartListPosition]==0 || !IsConnected()) { CreateTextObject("Update "+name, Time[Bar],55,"ÎÆÈÄÀÍÈÅ ÎÁÍÎÂËÅÍÈß...",BullCandle,Bar,"tahoma",7); } } } void OHLC(int ChartListPosition) { int k=MathRound(Frame/2); if (ChartListPosition==0) { DrawOHLC(ChartListPosition,k); } else { DrawOHLC(ChartListPosition,k+ChartListPosition*Frame); } } void DrawOHLC(int ChartListPosition,int Bar) { double dig,high,open,low,close,Zlow,Zhigh; string Symb=ChartNames[ChartListPosition],ohlc,name; name="OHLC "+Symb; RefreshRates(); dig=MarketInfo(Symb,MODE_DIGITS); if (!UseHeikenAshiChart) { high=NormalizeDouble(Hi(Symb,0,0),dig); open=NormalizeDouble(Op(Symb,0,0),dig); close=NormalizeDouble(Cl(Symb,0,0),dig); low=NormalizeDouble(Lo(Symb,0,0),dig); ohlc=DoubleToStr(open,dig)+" "+DoubleToStr(high,dig)+" "+DoubleToStr(low,dig)+" "+DoubleToStr(close,dig); CleanOHLC(ChartListPosition); CreateTextObject(name, Time[Bar],-2,ohlc,BullCandle,Bar,"tahoma",8); } else { high=NormalizeDouble(Hi(Symb,0,0),dig); low=NormalizeDouble(Lo(Symb,0,0),dig); open=iCustom(Symb,0,"Heiken Ashi",2,0); close=iCustom(Symb,0,"Heiken Ashi",3,0); Zhigh=MathMax(high, MathMax(open, close)); Zlow=MathMin(low, MathMin(open, close)); ohlc=DoubleToStr(open,dig)+" "+DoubleToStr(Zhigh,dig)+" "+DoubleToStr(Zlow,dig)+" "+DoubleToStr(close,dig); CleanOHLC(ChartListPosition); CreateTextObject(name, Time[Bar],-2,ohlc,BullCandle,Bar,"tahoma",8); } } void CleanOHLC(int ChartListPosition) { string name; name=StringConcatenate("OHLC ",ChartNames[ChartListPosition]); ObjectDelete(name); } void CleanChartsName(int ChartListPosition) { string name; name=StringConcatenate("Chart",ChartNames[ChartListPosition]); ObjectDelete(name); } void CleanUpdateText(int ChartListPosition) { string name,name1; name1="Chart"+ChartNames[ChartListPosition]; name=StringConcatenate("Update ",name1); ObjectDelete(name); } //+------------------------------------------------------------------+ //|óäàëåíèå ãðàôèêà îïðåäåëåííîãî èíñòðóìåíòà | //+------------------------------------------------------------------+ void CleanFrame(int ChartListPosition) { int i; if (ChartListPosition==1) { if (ChartListPosition!=Win_Charts) { for(i=0;i<=Frame-1;i++) { CleanBuffers(i); } } else { for(i=0;i<=Bars;i++) { CleanBuffers(i); } } } else { if (ChartListPosition!=Win_Charts) { for(i=ChartListPosition*Frame-1;i>=(ChartListPosition-1)*Frame;i--) { CleanBuffers(i); } } else { for(i=(ChartListPosition-1)*Frame;i<=Bars;i++) { CleanBuffers(i); } } } } //+------------------------------------------------------------------+ //|ôóíêöèÿ ñëåæåíèÿ çà èçìåíåíèÿìè îêíà òåêóùåãî ãðàôèêà | //+------------------------------------------------------------------+ bool WndRepaint() { if ( Win_color != GetWndColor(Symbol()) || CandleWidth != GetCandleWidth(Symbol()) || CandelsCountOnWindow!=WindowBarsPerChart() ) { CleanHisto(); CandelsCountOnWindow=WindowBarsPerChart(); Frame = MathRound((CandelsCountOnWindow-3)/Win_Charts); Win_color = GetWndColor(Symbol()); CandleWidth=GetCandleWidth(Symbol()); switch(CandleWidth) { case 1: HistoWidth=0; MAWidth=1; break; case 2: HistoWidth=0; MAWidth=1; break; case 4: HistoWidth=2; MAWidth=1; break; case 8: HistoWidth=3; MAWidth=2; break; case 16: HistoWidth=7; MAWidth=2; break; case 32: HistoWidth=13; MAWidth=3; break; } IndicatorSets(true); return(true); } return(false); } //+------------------------------------------------------------------+ //|óñòàíîâêè èíäèêàòîðà | //+------------------------------------------------------------------+ void IndicatorSets(bool Repaint) { /*ArrayInitialize(ChartValues,0.0); */ SetIndexStyle(0,DRAW_HISTOGRAM, 0, HistoWidth, BearCandle); SetIndexBuffer(0, ExtMapBuffer1); SetIndexDrawBegin(0,Bars-CandelsCountOnWindow-4); SetIndexLabel(0,""); SetIndexStyle(1,DRAW_HISTOGRAM, 0, HistoWidth, BullCandle); SetIndexBuffer(1, ExtMapBuffer2); SetIndexDrawBegin(1,Bars-CandelsCountOnWindow-4); SetIndexLabel(1,""); SetIndexStyle(2,DRAW_HISTOGRAM, 0, HistoWidth, Win_color); SetIndexBuffer(2, ExtMapBuffer3); SetIndexDrawBegin(2,Bars-CandelsCountOnWindow-4); SetIndexLabel(2,""); SetIndexStyle(3,DRAW_HISTOGRAM, 0, 1, BearCandle); SetIndexBuffer(3, ExtMapBuffer4); SetIndexDrawBegin(3,Bars-CandelsCountOnWindow-4); SetIndexLabel(3,""); SetIndexStyle(4,DRAW_HISTOGRAM, 0, 1, BullCandle); SetIndexBuffer(4, ExtMapBuffer5); SetIndexDrawBegin(4,Bars-CandelsCountOnWindow-4); SetIndexLabel(4,""); SetIndexStyle(5,DRAW_HISTOGRAM, 0, 1, Win_color); SetIndexBuffer(5, ExtMapBuffer6); SetIndexDrawBegin(5,Bars-CandelsCountOnWindow-4); SetIndexLabel(5,""); SetIndexStyle(6,DRAW_LINE, 0, MAWidth, SlowMA_Color); SetIndexBuffer(6, SlowMABuffer); SetIndexDrawBegin(6,Bars-CandelsCountOnWindow-4); SetIndexLabel(6,""); SetIndexStyle(7,DRAW_LINE,0,MAWidth,FastMA_Color); SetIndexBuffer(7, FastMABuffer); SetIndexDrawBegin(7,Bars-CandelsCountOnWindow-4); SetIndexLabel(7,""); if (Repaint) { DeleteChartNames(); LoadChartsValues(); } } //+------------------------------------------------------------------+ //|óäàëåíèå âñåõ íàäïèñåé | //+------------------------------------------------------------------+ void DeleteChartNames() { int ChartWindow; ChartWindow=WindowFind(Win_Name); if (ChartWindow!=-1) ObjectsDeleteAll(ChartWindow,OBJ_TEXT); } //+------------------------------------------------------------------+ //|Âîçâðàùàåò øèðèíó áàðà | //+------------------------------------------------------------------+ int GetCandleWidth(string sy) { int rect[4]; int h=WindowHandle(sy, Period()); if(h==0) return(-1); GetWindowRect(h, rect); int wW = rect[2] - rect[0]; // øèðèíà îêíà int bpc = CandelsCountOnWindow; if(bpc==0) return(-1); return(MathFloor((wW-48)/bpc)); } /*bool isActive(string sy) { int hCurrWindow = WindowHandle(sy,0); //õåäë òåêóùåãî îêíà ãðàôèêà int hNextParent = GetParent(hCurrWindow); hNextParent = GetParent(hNextParent); //õåíäï ðîäèòåëüñêîãî îêíî äëÿ âñåõ ãðàôèêîâ int hNextActiveWindow = GetTopWindow(hNextParent); hNextActiveWindow = GetTopWindow(hNextActiveWindow); //õåäë òåêóùåãî îêíà ãðàôèêà if (hCurrWindow==hNextActiveWindow) return(true); else return(false); } */ double Op(string Symb,int period,int Bar) { return(iOpen(Symb,period,Bar)); } double Cl(string Symb,int period,int Bar) { return(iClose(Symb,period,Bar)); } double Hi(string Symb,int period,int Bar) { return(iHigh(Symb,period,Bar)); } double Lo(string Symb,int period,int Bar) { return(iLow(Symb,period,Bar)); } //+------------------------------------------------------------------+ //|ôóíêöèÿ î÷èñòêè èíäèêàòîðíûõ ìàññèâîâ | //+------------------------------------------------------------------+ void CleanBuffers(int i) { ExtMapBuffer1[i]=EMPTY_VALUE; ExtMapBuffer2[i]=EMPTY_VALUE; ExtMapBuffer3[i]=EMPTY_VALUE; ExtMapBuffer4[i]=EMPTY_VALUE; ExtMapBuffer5[i]=EMPTY_VALUE; ExtMapBuffer6[i]=EMPTY_VALUE; SlowMABuffer[i]=EMPTY_VALUE; FastMABuffer[i]=EMPTY_VALUE; } //+------------------------------------------------------------------+ //|ïðîðèñîâêà èíñòðóìåíòà | //+------------------------------------------------------------------+ void DrawChart(int ChartListPosition) { int j; for(j=Frame-4;j>=0;j--) { SetValues(j,ChartListPosition); } } void DrawZeroBar(int ChartListPosition) { double Zmin,Zmax,LastPrice; string Symb=ChartNames[ChartListPosition]; LastPrice=MarketInfo(Symb,MODE_BID); Zmin=ChartValues[ChartListPosition+1][3]; Zmax=ChartValues[ChartListPosition+1][2]; if (LastPrice<Zmin || LastPrice>Zmax) { UpgradeCharts(ChartListPosition); } SetValues(0,ChartListPosition); } void SetValues(int Bar,int ChartListPosition) { string Symb=ChartNames[ChartListPosition]; min=ChartValues[ChartListPosition+1][3]; point=ChartValues[ChartListPosition+1][1]; if (!UseHeikenAshiChart) { open = (Op(Symb,0,Bar)-min)/point; close= (Cl(Symb,0,Bar)-min)/point; high = (Hi(Symb,0,Bar)-min)/point; low = (Lo(Symb,0,Bar)-min)/point; if (UseMovingAverages) { FastMA=(iMA(Symb,0,FastMA_Period,0,MA,Ap_Price,Bar)-min)/point; if (FastMA<0 || FastMA>100) { FastMA=EMPTY_VALUE; } SlowMA=(iMA(Symb,0,SlowMA_Period,0,MA,Ap_Price,Bar)-min)/point; if (SlowMA<0 || SlowMA>100) { SlowMA=EMPTY_VALUE; } } else { FastMA=EMPTY_VALUE; SlowMA=EMPTY_VALUE; } if (ChartListPosition==0) { DrawHisto(open,high,low,close,FastMA,SlowMA,Bar+2); } else { DrawHisto(open,high,low,close,FastMA,SlowMA,Bar+ChartListPosition*Frame+2); } } else { high = (Hi(Symb,0,Bar)-min)/point; low = (Lo(Symb,0,Bar)-min)/point; haopen=(iCustom(Symb,0,"Heiken Ashi",2,Bar)-min)/point; haclose=(iCustom(Symb,0,"Heiken Ashi",3,Bar)-min)/point; hahigh=MathMax(high, MathMax(haopen, haclose)); halow=MathMin(low, MathMin(haopen, haclose)); FastMA=EMPTY_VALUE; SlowMA=EMPTY_VALUE; if (ChartListPosition==0) { DrawHisto(haopen,hahigh,halow,haclose,FastMA,SlowMA,Bar+2); } else { DrawHisto(haopen,hahigh,halow,haclose,FastMA,SlowMA,Bar+ChartListPosition*Frame+2); } } } //+------------------------------------------------------------------+ //| Óäàëåíèå âñåõ ÷àðòîâ | //+------------------------------------------------------------------+ void CleanHisto() { if (Bars!=0) { for(int i=0;i<=Bars-1;i++) { CleanBuffers(i); continue; } } } //+------------------------------------------------------------------+ //|ïðîðèñîâêà ðàçäåëèòåëüíûõ ëèíèé | //+------------------------------------------------------------------+ void DrawSeparateLines(int ChartListPosition) { int value; value=ChartListPosition*Frame; if (ChartListPosition==Win_Charts-1) { ExtMapBuffer5[value]=100; value+=Frame; ExtMapBuffer5[value]=100; } else { ExtMapBuffer5[value]=100; } } //+------------------------------------------------------------------+ //|çàïîëíåíèå èíäèêàòîðíûõ ìàññèâîâ | //+------------------------------------------------------------------+ void DrawHisto(double O,double H,double L,double C,double ma,double ma1,int Bar) { if (O > C) { ExtMapBuffer1[Bar]=O; ExtMapBuffer2[Bar]=EMPTY_VALUE; ExtMapBuffer3[Bar]=C; ExtMapBuffer4[Bar]=H; ExtMapBuffer5[Bar]=EMPTY_VALUE; } if (O < C) { ExtMapBuffer1[Bar]=EMPTY_VALUE; ExtMapBuffer2[Bar]=C; ExtMapBuffer3[Bar]=O; ExtMapBuffer4[Bar]=EMPTY_VALUE; ExtMapBuffer5[Bar]=H; } if (O == C) { ExtMapBuffer1[Bar]=O; ExtMapBuffer2[Bar]=EMPTY_VALUE; ExtMapBuffer3[Bar]=O; ExtMapBuffer4[Bar]=EMPTY_VALUE; ExtMapBuffer5[Bar]=H; } ExtMapBuffer6[Bar]=L; FastMABuffer[Bar]=ma; SlowMABuffer[Bar]=ma1; } //+------------------------------------------------------------------+ //| Ñîçäàåò îáúåêò-òåêñò | //+------------------------------------------------------------------+ void CreateTextObject(string obj, double x, double y,string Text,color cl,int Bar,string FontName,int FontSize) { int ChartWindow; ChartWindow=WindowFind(Win_Name); ObjectCreate(obj, OBJ_TEXT, ChartWindow, x, y); ObjectSetText(obj,Text,FontSize, FontName, cl); } //+------------------------------------------------------------------+ //|âîçâðàùàåò ïðèçíàê ïîÿâëåíèÿ íîâîãî áàðà äëÿ òåêóùåãî èíñòðóìåíòà | //+------------------------------------------------------------------+ bool isNewBar(int ChartsListPosition) { bool res=false; RefreshRates(); string Symb=ChartNames[ChartsListPosition]; datetime BT=iTime(Symb,0,0); if ( ZeroBarTime[ChartsListPosition] !=BT || ZeroBarTime[ChartsListPosition] ==0 ) { ZeroBarTime[ChartsListPosition] = BT; res=true; } return(res); } bool isNewÒic(int ChartsListPosition) { bool res=false; RefreshRates(); string Symb=ChartNames[ChartsListPosition]; datetime TT = MarketInfo(Symb,MODE_TIME); if ( ÒicTime[ChartsListPosition] != TT ) { ÒicTime[ChartsListPosition] = TT ; res=true; } return(res); } void SymbolÒic() { for(int i=0; i<=Win_Charts-1; i++) { if (Hystory[i]==0) { Hystory[i]=RefreshRate(i); } else { if (!StartTerminal) { if (isNewÒic(i)) { if (isNewBar(i)) { LoadChartsValues(); } else { DrawZeroBar(i); if (ViewOHLC) OHLC(i); } } } } continue; } }
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open prices of each bar
Series array that contains close prices for each bar
Indicator Curves created:
Implements a curve of type DRAW_HISTOGRAM
Implements a curve of type DRAW_LINE
Indicators Used:
Moving average indicator
Custom Indicators Used:
Heiken Ashi
user32
gdi32
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen