//+------------------------------------------------------------------+ //| RIDI_LEVELS_MT4.mq4 | //| Copyright © 2004, RIDI Corp. | //| http://www.ridi.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, RIDI Corp." #property link "http://www.ridi.ru" #property indicator_chart_window extern double UpperLevel = 0; extern double LowerLevel = 0; extern datetime AnalysisBegin = D'1980.01.01 00:00'; extern datetime AnalysisEnd = D'2030.01.01 00:00'; extern int QuantityLevels = 9; extern int QuantityLevelsD = 9; extern int QuantityLevelsW = 9; extern int DeviationLevel = 5; extern int DeviationLevelD = 10; extern int DeviationLevelW = 20; extern int RightModelLevel = 4; extern int LeftModelLevel = 4; extern int RightModelLevelD = 3; extern int LeftModelLevelD = 3; extern int RightModelLevelW = 3; extern int LeftModelLevelW = 3; extern int DistanceLevels = 0; extern int DistanceLevelsD = 0; extern int DistanceLevelsW = 0; extern color Color = C'Blue'; extern int TypeLines = 0; extern int WidthLine = 1; extern color ColorText = C'Blue'; extern int HeightText = 8; extern bool ShowText = true; extern color ColorLabels = C'Blue'; extern bool ShowLabels = true; extern color ColorD = C'Red'; extern int TypeLinesD = 0; extern int WidthLineD = 1; extern color ColorTextD = C'Red'; extern int HeightTextD = 8; extern bool ShowTextD = true; extern color ColorLabelsD = C'Red'; extern bool ShowLabelsD = true; extern color ColorW = C'Green'; extern int TypeLinesW = 0; extern int WidthLineW = 1; extern color ColorTextW = C'Green'; extern int HeightTextW = 8; extern bool ShowTextW = true; extern color ColorLabelsW = C'Green'; extern bool ShowLabelsW = true; //+------------------------------------------------------------------+ //| Ãëîáàëüíûå ïåðåìåííûå | //+------------------------------------------------------------------+ double PLevels[3000]; datetime TLevels[3000]; int FLevels[3000]; datetime DateT; double LDev, LDis, QLevelsMas[3]; int QLevels, QuanLevels, iBegin, iEnd, RML, LML , TypeL, mHeightText; double mLow[]; double mHigh[]; datetime mTime[]; int mBars; color mColor, mColorLabels, mColorText; bool mShowLabels, mShowText; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators DateT = 0; //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- TODO: add your code here Clear(); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { if (DateT == Time[0]) return(0); else if (DateT > 0) Clear(); for (int i = 0; i < 3; i++) { OptionsExpert(i); if (UpperLevel > 0 && LowerLevel > 0) SearchChannel(); else LastLevels(); QLevelsMas[i] = QLevels; DrawLevels(i); } DateT = Time[0]; return(0); } //+------------------------------------------------------------------+ //| Options of the expert | //+------------------------------------------------------------------+ void OptionsExpert(int type) { if (type == 0) { mBars = ArrayCopySeries(mLow, MODE_LOW, Symbol(), Period()); ArrayCopySeries(mHigh, MODE_HIGH, Symbol(), Period()); ArrayCopySeries(mTime, MODE_TIME, Symbol(), Period()); RML = RightModelLevel; LML = LeftModelLevel; QuanLevels = QuantityLevels; LDev = DeviationLevel*Point; LDis = DistanceLevels*Point; TypeL = TypeLines; mHeightText = HeightText; mColor = Color; mColorLabels = ColorLabels; mColorText = ColorText; mShowLabels = ShowLabels; mShowText = ShowText; PeriodAnalysis(); } else if (type == 1) { mBars = ArrayCopySeries(mLow, MODE_LOW, Symbol(), PERIOD_D1); ArrayCopySeries(mHigh, MODE_HIGH, Symbol(), PERIOD_D1); ArrayCopySeries(mTime, MODE_TIME, Symbol(), PERIOD_D1); RML = RightModelLevelD; LML = LeftModelLevelD; QuanLevels = QuantityLevelsD; LDev = DeviationLevelD*Point; LDis = DistanceLevelsD*Point; TypeL = TypeLinesD; mHeightText = HeightTextD; mColor = ColorD; mColorLabels = ColorLabelsD; mColorText = ColorTextD; mShowLabels = ShowLabelsD; mShowText = ShowTextD; PeriodAnalysis(); } else { mBars = ArrayCopySeries(mLow, MODE_LOW, Symbol(), PERIOD_W1); ArrayCopySeries(mHigh, MODE_HIGH, Symbol(), PERIOD_W1); ArrayCopySeries(mTime, MODE_TIME, Symbol(), PERIOD_W1); RML = RightModelLevelW; LML = LeftModelLevelW; QuanLevels = QuantityLevelsW; LDev = DeviationLevelW*Point; LDis = DistanceLevelsW*Point; TypeL = TypeLinesW; mHeightText = HeightTextW; mColor = ColorW; mColorLabels = ColorLabelsW; mColorText = ColorTextW; mShowLabels = ShowLabelsW; mShowText = ShowTextW; PeriodAnalysis(); } if (LDis < LDev) LDis = LDev; } //+------------------------------------------------------------------+ //| Ïåðèîä Àíàëèçà | //+------------------------------------------------------------------+ void PeriodAnalysis() { int i; if (AnalysisBegin == D'1980.01.01 00:00') iEnd = mBars; else { for (i = 0; i < mBars; i++) if (mTime[i] == AnalysisBegin) { iEnd = i; break; } if (i == mBars) iEnd = mBars; } if (AnalysisEnd == D'2030.01.01 00:00') iBegin = 0; else { for (i = 0; i < mBars; i++) if (mTime[i] == AnalysisEnd) { iBegin = i; break; } if (i == mBars) iBegin = 0; } } //+------------------------------------------------------------------+ //| Search in the channel | //+------------------------------------------------------------------+ void SearchChannel() { int mPos = 0; for(int i = iBegin; i < iEnd; i++) { if (CheckLevel(i, 1)) if (UpperLevel >= mHigh[i] && mHigh[i] >= LowerLevel) { PLevels[mPos] = mHigh[i]; TLevels[mPos] = mTime[i]; FLevels[mPos] = 1; mPos++; } if (CheckLevel(i, 2)) if (UpperLevel >= mLow[i] && mLow[i] >= LowerLevel) { PLevels[mPos] = mLow[i]; TLevels[mPos] = mTime[i]; FLevels[mPos] = 1; mPos++; } } int j; for(i = 0; i < mPos; i++) for(j = i + 1; j < mPos; j++) if (PLevels[i] >= PLevels[j] - LDev && PLevels[i] <= PLevels[j] + LDev) FLevels[i] = FLevels[i] + 1; int Max; int iTemp; double dTemp; i = 0; while (i < QuanLevels && i < mPos) { Max = i; for(j = i + 1; j < mPos; j++) if (FLevels[j] > FLevels[Max]) Max = j; if (FLevels[Max] == 0) break; for(j = i-1; j >= 0; j--) if (PLevels[j]-LDis <= PLevels[Max] && PLevels[Max] <= PLevels[j]+LDis) break; if (j < 0) { dTemp = PLevels[Max]; PLevels[Max] = PLevels[i]; PLevels[i] = dTemp; iTemp = TLevels[Max]; TLevels[Max] = TLevels[i]; TLevels[i] = iTemp; iTemp = FLevels[Max]; FLevels[Max] = FLevels[i]; FLevels[i] = iTemp; i++; } else FLevels[Max] = 0; } QLevels = i; } //+------------------------------------------------------------------+ //| Check on a level | //+------------------------------------------------------------------+ bool CheckLevel(int pos, int type) { //Ïðîâåðÿåì íà óðîâåíü ïîääåðæêè if (type == 1) { for(int i = pos - 1; i >= pos - RML && pos - RML > 0; i--) if (mHigh[pos] < mHigh[i]) break; if (i < pos - RML) { for(i = pos + 1; i <= pos + LML && pos + LML < mBars; i++) if (mHigh[pos] < mHigh[i]) break; if (i > pos + LML) { return(true); } } } //Ïðîâåðÿåì íà óðîâåíü ñîïðîòèâëåíèå if (type == 2) { for(i = pos - 1; i >= pos - RML && pos - RML > 0; i--) if (mLow[pos] > mLow[i]) break; if (i < pos - RML) { for(i = pos + 1; i <= pos + LML && pos + LML < mBars; i++) if (mLow[pos] > mLow[i]) break; if (i > pos + LML) { return(true); } } } return(false); } //+------------------------------------------------------------------+ //| Íàðèñîâàòü óðîâíè | //+------------------------------------------------------------------+ void DrawLevels(int type) { string NameL; if (type == 0) { NameL = Period(); type = 1; } else if (type == 1) { NameL = "D"; type = 3; } else { NameL = "W"; type = 5; } type++; int iMinF = 1000000, iMaxF = 0; for(int i = 0; i < QLevels; i++) { if (FLevels[i] > iMaxF) iMaxF = FLevels[i]; if (FLevels[i] < iMinF) iMinF = FLevels[i]; } double KofColor; int style, ColorL, ColorStep, ColorBegin, ColorEnd; if (TypeL > 0) { switch(TypeL) { case 1: ColorStep=65794; ColorBegin=75; ColorEnd=125; break; //Êðàñíûé case 2: ColorStep=66049; ColorBegin=75; ColorEnd=125; break; //Çåëåíûé case 3: ColorStep=131329; ColorBegin=75; ColorEnd=125; break; //Ñèíèé default: ColorStep=65793; ColorBegin=0; ColorEnd=200; } KofColor = (ColorEnd - ColorBegin) / (iMaxF - iMinF); } else { KofColor = iMaxF - iMinF; KofColor++; KofColor /= 5; } for(i = 0; i < QLevels; i++) { ObjectCreate("Level"+NameL+","+i, OBJ_HLINE, 0, TLevels[i], PLevels[i]); if (TypeL > 0) { ColorL = ColorStep*MathRound(((iMaxF-FLevels[i])*KofColor)+ColorBegin); ObjectSet("Level"+NameL+","+i, OBJPROP_COLOR, ColorL); ObjectSet("Level"+NameL+","+i, OBJPROP_WIDTH, WidthLine); } else { ColorL = MathFloor((iMaxF-FLevels[i]) / KofColor); switch(ColorL) { case 0: style=0; break; case 1: style=1; break; case 2: style=3; break; case 3: style=4; break; case 4: style=2; break; default: Print("NOT style"); style=2; } ObjectSet("Level"+NameL+","+i, OBJPROP_COLOR, mColor); ObjectSet("Level"+NameL+","+i, OBJPROP_WIDTH, 1); ObjectSet("Level"+NameL+","+i, OBJPROP_STYLE, style); } if (mShowLabels) { ObjectCreate("LevelArrow"+NameL+","+i, OBJ_ARROW, 0, TLevels[i], PLevels[i]); ObjectSet("LevelArrow"+NameL+","+i, OBJPROP_COLOR, mColorLabels); ObjectSet("LevelArrow"+NameL+","+i, OBJPROP_ARROWCODE, 3); } if (mShowText) { ObjectCreate("LevelText"+NameL+","+i, OBJ_TEXT, 0, Time[0]+(Period()*60*type), PLevels[i]); ObjectSetText("LevelText"+NameL+","+i, ""+FLevels[i], mHeightText, "Time New Roman", mColorText); } } } //+------------------------------------------------------------------+ //| Î÷èñòèòü | //+------------------------------------------------------------------+ void Clear() { string str; for (int i = 0; i < QLevelsMas[0]; i++) { ObjectDelete("Level"+Period()+","+i); if (ShowLabels) ObjectDelete("LevelArrow"+Period()+","+i); if (ShowText) ObjectDelete("LevelText"+Period()+","+i); } for (i = 0; i < QLevelsMas[1]; i++) { ObjectDelete("LevelD,"+i); if (ShowLabelsD) ObjectDelete("LevelArrowD,"+i); if (ShowTextD) ObjectDelete("LevelTextD,"+i); } for (i = 0; i < QLevelsMas[2]; i++) { ObjectDelete("LevelW,"+i); if (ShowLabelsW) ObjectDelete("LevelArrowW,"+i); if (ShowTextW) ObjectDelete("LevelTextW,"+i); } } //+------------------------------------------------------------------+ //| Èñêàòü íîâûå óðîâíè | //+------------------------------------------------------------------+ void LastLevels() { QLevels = 0; int j, k = 0; for(int i = iBegin; i < iEnd && QLevels < QuanLevels; i++) { if (CheckLevel(i, 1)) { for(j = QLevels - 1; j >= 0; j--) if (PLevels[j]-LDis <= mHigh[i] && mHigh[i] <= PLevels[j]+LDis) break; if (j < 0) { PLevels[QLevels] = mHigh[i]; TLevels[QLevels] = mTime[i]; FLevels[QLevels] = 0; QLevels++; } } if (CheckLevel(i, 2)) { for(j = QLevels - 1; j >= 0; j--) if (PLevels[j]-LDis <= mLow[i] && mLow[i] <= PLevels[j]+LDis) break; if (j < 0) { PLevels[QLevels] = mLow[i]; TLevels[QLevels] = mTime[i]; FLevels[QLevels] = 0; QLevels++; } } } for(i = iBegin; i < iEnd; i++) { if (CheckLevel(i, 1)) for(j = QLevels - 1; j >= 0; j--) if (PLevels[j]-LDev <= mHigh[i] && mHigh[i] <= PLevels[j]+LDev) FLevels[j] = FLevels[j] + 1; if (CheckLevel(i, 2)) for(j = QLevels - 1; j >= 0; j--) if (PLevels[j]-LDev <= mLow[i] && mLow[i] <= PLevels[j]+LDev) FLevels[j] = FLevels[j] + 1; } }
Sample
Analysis
Market Information Used:
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 time of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: