//+------------------------------------------------------------------+ //| iPriceGrid.mq4 | //| Copyright © 2011, komposter | //| http://www.komposter.me | //+------------------------------------------------------------------+ #property copyright "задумщик sever11, а шеф-повар Copyright © 2010, komposter" #property link "http://www.komposter.me" //для построения ценовых уровней . //В нем реализовал возможность отрисовки 5-ти различных уровней. Для каждого задается свой шаг и расстояния до верхнего/нижнего фильтра. Расстояния нужно задавать в пунктах для 4-знака, индикатор автоматически адаптирует значения для 5-ти, 3-х и 2-х значных котировок. //По настройкам: //GX_Label - подпись, которая будет накладываться на соответствующий уровень (желательно указывать не слишком длинную, так как есть ограничения на количество отображаемых символов); //GX_Step - шаг построения линий уровней (5000 для Y1, 2000 для Q1 и т.д.); //GX_Upper - количество пунктов на которое будет смещен верхний фильтр от цены уровня (вверх); //GX_Lower - количество пунктов на которое будет смещен нижний фильтр от цены уровня (вниз). //Таким образом для настроек: G1_Label = "Y1", G1_Step = 5000, G1_Upper = 310, G1_Lower = 190 будут построены линии через каждые 5000 пунктов с подписью "Y1", нижний фильтр будет установлен на 190 пунктов ниже, а верхний на 310 пунктов выше уровня (для цены 1.5000 это будет 1.4810 и 1.5310 соответственно). #property indicator_chart_window extern string Grid_1 = "-------Grid-1-Settings-------"; extern bool G1_Draw = true; // год extern string G1_Label = "Y1"; extern int G1_Step = 5000; extern int G1_Upper = 310; extern int G1_Lower = 190; extern string Grid_2 = "-------Grid-2-Settings-------"; extern bool G2_Draw = true; // квартал extern string G2_Label = "Q1"; extern int G2_Step = 2000; extern int G2_Upper = 130; extern int G2_Lower = 20; extern string Grid_3 = "-------Grid-3-Settings-------"; extern bool G3_Draw = true; extern string G3_Label = "MN1"; extern int G3_Step = 1000; extern int G3_Upper = 130; extern int G3_Lower = 20; extern string Grid_4 = "-------Grid-4-Settings-------"; extern bool G4_Draw = true; extern string G4_Label = "W1"; extern int G4_Step = 500; extern int G4_Upper = 31; extern int G4_Lower = 19; extern string Grid_5 = "-------Grid-5-Settings-------"; extern bool G5_Draw = true; extern string G5_Label = "D1"; extern int G5_Step = 100; extern int G5_Upper = 31; extern int G5_Lower = 19; extern string Grid_6 = "-------Grid-6-Settings-------"; extern bool G6_Draw = true; extern string G6_Label = "H4"; extern int G6_Step = 500; extern int G6_Upper = 31; extern int G6_Lower = 19; extern string Grid_7 = "-------Grid-7-Settings-------"; extern bool G7_Draw = true; extern string G7_Label = "H1"; extern int G7_Step = 100; extern int G7_Upper = 31; extern int G7_Lower = 19; extern string Draw_Settings = "-------Draw-Settings-------"; extern int Style = STYLE_DOT; extern color SColor = Yellow; extern color UColor = Red; extern color LColor = Gray; int D5 = 1.0; string prefix = "#$@_"; string pref_a = "@$#_"; double pre_win_max = 0; int init() { if ( Digits == 5 || Digits == 3 ) { D5 *= 10.0; } return(0); } int deinit() { obj_delete(); return(0); } int start() { if ( pre_win_max != WindowPriceMax() ) { pre_win_max = WindowPriceMax(); obj_delete(); if ( G7_Draw ) { DrawLines( G7_Label, G7_Step, G7_Upper, G7_Lower ); } if ( G6_Draw ) { DrawLines( G6_Label, G6_Step, G6_Upper, G6_Lower ); } if ( G5_Draw ) { DrawLines( G5_Label, G5_Step, G5_Upper, G5_Lower ); } if ( G4_Draw ) { DrawLines( G4_Label, G4_Step, G4_Upper, G4_Lower ); } if ( G3_Draw ) { DrawLines( G3_Label, G3_Step, G3_Upper, G3_Lower ); } if ( G2_Draw ) { DrawLines( G2_Label, G2_Step, G2_Upper, G2_Lower ); } if ( G1_Draw ) { DrawLines( G1_Label, G1_Step, G1_Upper, G1_Lower ); } } return(0); } void DrawLines( string text, int step, int up, int dn ) { double win_max = WindowPriceMax(); double win_min = WindowPriceMin(); double level = 0.0; string name = ""; string success = ""; string txt = ""; while( level <= win_max ) { txt = text; if ( level < win_min ) { level += step*D5*Point; continue; } name = prefix + DoubleToStr(level, Digits); if ( ObjectFind(name) < 0 ) { ObjectCreate ( name, OBJ_HLINE, 0, 0, level ); } else { txt = text + ", " + ObjectDescription(name); } ObjectSet ( name, OBJPROP_TIME1, 0 ); ObjectSet ( name, OBJPROP_PRICE1, level ); ObjectSet ( name, OBJPROP_COLOR, SColor ); ObjectSet ( name, OBJPROP_STYLE, Style ); ObjectSetText ( name, txt, 0 ); name = pref_a + DoubleToStr(level + up*D5*Point, Digits) + "_up"; txt = text; if ( ObjectFind(name) < 0 ) { ObjectCreate ( name, OBJ_HLINE, 0, 0, level + up*D5*Point ); } else { txt = text + ", " + ObjectDescription(name); } ObjectSet ( name, OBJPROP_COLOR, UColor ); ObjectSet ( name, OBJPROP_STYLE, Style ); ObjectSetText ( name, txt, 0 ); name = pref_a + DoubleToStr(level - up*D5*Point, Digits) + "_dn"; txt = text; if ( ObjectFind(name) < 0 ) { ObjectCreate ( name, OBJ_HLINE, 0, 0, level - up*D5*Point ); } else { txt = text + ", " + ObjectDescription(name); } ObjectSet ( name, OBJPROP_COLOR, LColor ); ObjectSet ( name, OBJPROP_STYLE, Style ); ObjectSetText ( name, txt, 0 ); level += step*D5*Point; } WindowRedraw(); } void obj_delete() { int total = ObjectsTotal() - 1; string name = ""; for ( int i = total; i >= 0; i -- ) { name = ObjectName(i); if ( ObjectFind(name) < 0 ) { continue; } if ( StringFind( name, prefix ) >= 0 || StringFind( name, pref_a ) >= 0 ) { ObjectDelete(name); } } WindowRedraw(); }