// Chart_Sync_Demo.mq5 // Idea & money: RogH, https://login.mql5.com/en/users/rogh // Code: f2011, http://www.mql5.com/en/job/new?prefered=f2011 // 16.02.2014 11:30 #property version "1.10" #property copyright "f2011" #property indicator_chart_window #property indicator_buffers 0 #property indicator_plots 0 input int Timer_Seconds = 3; // Chart redraw frequency (seconds) int OnInit() { ChartSetInteger(0, CHART_EVENT_OBJECT_DELETE, true); ChartSetInteger(0, CHART_EVENT_OBJECT_CREATE, true); ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, true); ObjectCreate(0, "Chart_Sync_ON", OBJ_LABEL, 0, 0, 0); ObjectSetInteger(0, "Chart_Sync_ON", OBJPROP_CORNER, CORNER_RIGHT_LOWER); ObjectSetInteger(0, "Chart_Sync_ON", OBJPROP_ANCHOR, ANCHOR_RIGHT_LOWER); ObjectSetString(0, "Chart_Sync_ON", OBJPROP_TEXT, CharToString(243)); ObjectSetString(0, "Chart_Sync_ON", OBJPROP_FONT, "Wingdings"); ObjectSetInteger(0, "Chart_Sync_ON", OBJPROP_FONTSIZE, 12); ObjectSetInteger(0, "Chart_Sync_ON", OBJPROP_COLOR, clrSteelBlue); EventSetTimer(Timer_Seconds); return(0); } void OnDeinit(const int reason) { EventKillTimer(); ObjectDelete(0, "Chart_Sync_ON"); ChartRedraw(); } int OnCalculate( const int rates_total, const int prev_calculated, const datetime &Time[], const double &Open[], const double &High[], const double &Low[], const double &Close[], const long &TickVolume[], const long &Volume[], const int &Spread[] ) { return(rates_total); } void OnTimer() { ChartRedraw(); } void OnChartEvent( const int Event_ID, // идентификатор события const long& Event_Long, // параметр события типа long const double& Event_Double, // параметр события типа double const string& Event_String // параметр события типа string ) { if( (Event_ID == CHARTEVENT_KEYDOWN && Event_Long == 46) // нажатие кнопки Delete || Event_ID == CHARTEVENT_MOUSE_MOVE // движение мыши, включая перемещение опорных точек объекта || Event_ID == CHARTEVENT_OBJECT_DRAG // перемещение объекта мышью || Event_ID == CHARTEVENT_OBJECT_DELETE // удаление объекта || Event_ID == CHARTEVENT_OBJECT_CHANGE // изменение свойств объекта || Event_ID == CHARTEVENT_OBJECT_CREATE // создание объекта ) { if(Event_String == "Chart_Sync_ON") return; long ia_Symbol_Charts[]; int i_Symbol_Chart = Get_Chart_IDs(ia_Symbol_Charts, _Symbol), i_Level = 0 ; if(i_Symbol_Chart < 1) return; // не с чем синхронизировать while(i_Symbol_Chart-- > 0) { switch(Event_ID) { case CHARTEVENT_KEYDOWN: ChartRedraw(); break; case CHARTEVENT_OBJECT_CREATE: Sync_Object(ia_Symbol_Charts[i_Symbol_Chart], Event_String); break; case CHARTEVENT_OBJECT_CHANGE: if(ObjectFind(ia_Symbol_Charts[i_Symbol_Chart], Event_String) < 0) ObjectCreate(ia_Symbol_Charts[i_Symbol_Chart], Event_String, ENUM_OBJECT(ObjectGetInteger(0, Event_String, OBJPROP_TYPE)), 0, ObjectGetInteger(0, Event_String, OBJPROP_TIME, 0), ObjectGetDouble(0, Event_String, OBJPROP_PRICE, 0), ObjectGetInteger(0, Event_String, OBJPROP_TIME, 1), ObjectGetDouble(0, Event_String, OBJPROP_PRICE, 1), ObjectGetInteger(0, Event_String, OBJPROP_TIME, 2), ObjectGetDouble(0, Event_String, OBJPROP_PRICE, 2)); Sync_Object(ia_Symbol_Charts[i_Symbol_Chart], Event_String); break; case CHARTEVENT_OBJECT_DELETE: ObjectDelete(ia_Symbol_Charts[i_Symbol_Chart], Event_String); break; case CHARTEVENT_OBJECT_DRAG: if(ObjectFind(ia_Symbol_Charts[i_Symbol_Chart], Event_String) < 0) ObjectCreate(ia_Symbol_Charts[i_Symbol_Chart], Event_String, ENUM_OBJECT(ObjectGetInteger(0, Event_String, OBJPROP_TYPE)), 0, ObjectGetInteger(0, Event_String, OBJPROP_TIME, 0), ObjectGetDouble(0, Event_String, OBJPROP_PRICE, 0), ObjectGetInteger(0, Event_String, OBJPROP_TIME, 1), ObjectGetDouble(0, Event_String, OBJPROP_PRICE, 1), ObjectGetInteger(0, Event_String, OBJPROP_TIME, 2), ObjectGetDouble(0, Event_String, OBJPROP_PRICE, 2)); Sync_Object(ia_Symbol_Charts[i_Symbol_Chart], Event_String); break; case CHARTEVENT_MOUSE_MOVE: if(ObjectFind(ia_Symbol_Charts[i_Symbol_Chart], Event_String) < 0) ObjectCreate(ia_Symbol_Charts[i_Symbol_Chart], Event_String, ENUM_OBJECT(ObjectGetInteger(0, Event_String, OBJPROP_TYPE)), 0, ObjectGetInteger(0, Event_String, OBJPROP_TIME, 0), ObjectGetDouble(0, Event_String, OBJPROP_PRICE, 0), ObjectGetInteger(0, Event_String, OBJPROP_TIME, 1), ObjectGetDouble(0, Event_String, OBJPROP_PRICE, 1), ObjectGetInteger(0, Event_String, OBJPROP_TIME, 2), ObjectGetDouble(0, Event_String, OBJPROP_PRICE, 2)); Sync_Object(ia_Symbol_Charts[i_Symbol_Chart], Event_String); break; } } } } int Get_Chart_IDs(long& ia_Symbol_Charts[], string s_Symbol) { // Собирает в массив ia_Symbol_Charts список ID окон символа s_Symbol, исключая текущий // Возвращает кол-во окон символа ArrayResize(ia_Symbol_Charts, 0); int i_Symbol_Chart = 0 ; long i_Counter = 0, i_This_Chart_ID = ChartID(), i_Chart_ID = ChartFirst() ; while(i_Counter++ < 100) { if(i_Chart_ID != i_This_Chart_ID) if(ChartSymbol(i_Chart_ID) == s_Symbol) { ArrayResize(ia_Symbol_Charts, ++i_Symbol_Chart); ia_Symbol_Charts[i_Symbol_Chart - 1] = i_Chart_ID; } i_Chart_ID = ChartNext(i_Chart_ID); if(i_Chart_ID < 0) break; } return(i_Symbol_Chart); } void Sync_Object(long i_Chart_ID, string s_Obj_Name) { ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_COLOR, ObjectGetInteger(0, s_Obj_Name, OBJPROP_COLOR)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_STYLE, ObjectGetInteger(0, s_Obj_Name, OBJPROP_STYLE)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_WIDTH, ObjectGetInteger(0, s_Obj_Name, OBJPROP_WIDTH)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_BACK, ObjectGetInteger(0, s_Obj_Name, OBJPROP_BACK)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_RAY_LEFT, ObjectGetInteger(0, s_Obj_Name, OBJPROP_RAY_LEFT)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_RAY_RIGHT, ObjectGetInteger(0, s_Obj_Name, OBJPROP_RAY_RIGHT)); ObjectSetDouble(i_Chart_ID, s_Obj_Name, OBJPROP_ANGLE, ObjectGetDouble(0, s_Obj_Name, OBJPROP_ANGLE)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_FILL, ObjectGetInteger(0, s_Obj_Name, OBJPROP_FILL)); ObjectSetDouble(i_Chart_ID, s_Obj_Name, OBJPROP_DEVIATION, ObjectGetDouble(0, s_Obj_Name, OBJPROP_DEVIATION)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_ANCHOR, ObjectGetInteger(0, s_Obj_Name, OBJPROP_ANCHOR)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_ARROWCODE, ObjectGetInteger(0, s_Obj_Name, OBJPROP_ARROWCODE)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_SELECTABLE, ObjectGetInteger(0, s_Obj_Name, OBJPROP_SELECTABLE)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_TIMEFRAMES, ObjectGetInteger(0, s_Obj_Name, OBJPROP_TIMEFRAMES)); ObjectSetString(i_Chart_ID, s_Obj_Name, OBJPROP_TEXT, ObjectGetString(0, s_Obj_Name, OBJPROP_TEXT)); ObjectSetString(i_Chart_ID, s_Obj_Name, OBJPROP_FONT, ObjectGetString(0, s_Obj_Name, OBJPROP_FONT)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_FONTSIZE, ObjectGetInteger(0, s_Obj_Name, OBJPROP_FONTSIZE)); ObjectSetDouble(i_Chart_ID, s_Obj_Name, OBJPROP_ANGLE, ObjectGetDouble(0, s_Obj_Name, OBJPROP_ANGLE)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_XDISTANCE, ObjectGetInteger(0, s_Obj_Name, OBJPROP_XDISTANCE)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_YDISTANCE, ObjectGetInteger(0, s_Obj_Name, OBJPROP_YDISTANCE)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_CORNER, ObjectGetInteger(0, s_Obj_Name, OBJPROP_CORNER)); ObjectSetDouble(i_Chart_ID, s_Obj_Name, OBJPROP_PRICE, 0, ObjectGetDouble(0, s_Obj_Name, OBJPROP_PRICE, 0)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_TIME, 0, ObjectGetInteger(0, s_Obj_Name, OBJPROP_TIME, 0)); ObjectSetDouble(i_Chart_ID, s_Obj_Name, OBJPROP_PRICE, 1, ObjectGetDouble(0, s_Obj_Name, OBJPROP_PRICE, 1)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_TIME, 1, ObjectGetInteger(0, s_Obj_Name, OBJPROP_TIME, 1)); ObjectSetDouble(i_Chart_ID, s_Obj_Name, OBJPROP_PRICE, 2, ObjectGetDouble(0, s_Obj_Name, OBJPROP_PRICE, 2)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_TIME, 2, ObjectGetInteger(0, s_Obj_Name, OBJPROP_TIME, 2)); int i_Level = int(ObjectGetInteger(0, s_Obj_Name, OBJPROP_LEVELS)); if(i_Level > 0) { ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_LEVELS, i_Level); while(i_Level-- > 0) { ObjectSetDouble(i_Chart_ID, s_Obj_Name, OBJPROP_LEVELVALUE, i_Level, ObjectGetDouble(0, s_Obj_Name, OBJPROP_LEVELVALUE, i_Level)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_LEVELCOLOR, i_Level, ObjectGetInteger(0, s_Obj_Name, OBJPROP_COLOR, i_Level)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_LEVELSTYLE, i_Level, ObjectGetInteger(0, s_Obj_Name, OBJPROP_LEVELSTYLE, i_Level)); ObjectSetInteger(i_Chart_ID, s_Obj_Name, OBJPROP_LEVELWIDTH, i_Level, ObjectGetInteger(0, s_Obj_Name, OBJPROP_LEVELWIDTH, i_Level)); ObjectSetString(i_Chart_ID, s_Obj_Name, OBJPROP_LEVELTEXT, i_Level, ObjectGetString(0, s_Obj_Name, OBJPROP_LEVELTEXT, i_Level)); } } ChartRedraw(i_Chart_ID); }