/* iStockTimes_v1_5.mq4 Отображает время работы основных торговых площадок, а также некоторую дополнительную информацию. Занимает минимум места на графике и не мешает оценке основной информации. Цветовая гамма подобрана для удобного восприятия как на светлом, так и на темном фоне. Индикатор самостоятельно определяет часовой пояс брокера. Для этого необходимо разрешить импорт DLL на вкладке свойств. Показывается время в следующих временных зонах: UTC Broker Wellington Sydney Tokyo Hong Kong, Singapore Moscow Europe Union (Frankfurt, Zurich, Paris) London New York Chicago Открытые торговые площадки подсвечиваются зеленым цветом. Также индикатор отображает некоторую информацию по текущему бару графика: оставшееся время до открытия следующего бара текущий тиковый объем и прогнозируемое значение его по отношению к предыдущему бару в процентах (относитесь скептически к этому показателю) размер спреда размер маржинального залога (в скобках - лотность, для которой ведется расчет; можно изменить через quantity_lots, по умолчанию 1) стоимость 1 пункта (рассчитывается для той же лотности, что и маржа) размер свопа для длинных позиций (рассчитывается для той же лотности, что и маржа) размер свопа для коротких позиций (рассчитывается для той же лотности, что и маржа) 2 значения ATR с настраиваемыми периодами и актуальную информацию по торговому счету (большая часть этой информации скрывается, если нет открытых позиций): Equity - текущее количество средств на счете Free - доступное для торговли количество средств Buy - количество открытых ордеров на покупку и суммарная лотность buy_profit - прибыль по ордерам на покупку с учётом свопов и комиссий Sell - количество открытых ордеров на продажу и суммарная лотность sell_profit - прибыль по ордерам на продажу с учётом свопов и комиссий Total - общее количество открытых ордеров и суммарная лотность total_profit - суммарная прибыль по счету с учётом свопов и комиссий Comissions - общая сумма комиссий для открытых ордеров Swaps - общая сумма свопов для открытых ордеров Level - маржинальный уровень (отношение текущих средств к текущему залогу)(*NEW*) StopOut - значение маржинального уровня, когда возникнет состояние Stop Out (принудительное закрытие убыточных позиций)(*NEW*) Marg/Bal - отношение залога к балансу в процентах При необходимости можно отключить отображение часов (show_clocks) и информации по счету (show_trade), оставив только информацию по бару (например, при работе с несколькими графиками одновременно). Это снизит нагрузку и ускорит работу индикатора. Также можно отдельно настроить отображение каждого элемента с помощью соответствующей опции. Можно изменить угол привязки индикатора на графике (obj_corner) или просто на время переместить его в любое место графика выделив строку Next (появится рамка вокруг нее) и перетащив мышкой. Можно отключить функцию автоматического определения 5-значного брокера (autodetect_fivedigbroker), тогда данные по спреду и стоимсти пункта будут выдаваться в разрядности поступающих котировок. Внешний вид индикатора также настраивается: размер шрифта (font_size), междустрочный интервал (interval), цвета групп строк.(*NEW*) - Спасибо за предложения и критику участникам форума www.mql4.com/ru/: M.E.R.lin, Batman. - http://24timezones.com http://www.worldtimezone.com http://www.timeanddate.com http://www.worldtimeserver.com/current_time_in_UTC.aspx - New Zealand Daylight Saving commences on the last Sunday in September, when 2.00am becomes 3.00am, and ends on the first Sunday in April the following year, when 3.00am becomes 2.00am. Australia Across the south-eastern states and the ACT, daylight saving for future summers begins at 2am Eastern Standard Time on the first Sunday in October and ends at 2am Eastern Standard Time (3am summer time) on the first Sunday in April. European Union DST Begins 1 a.m. UTC=GMT (Last Sunday in March) DST Ends 1 a.m. UTC=GMT (Last Sunday in October) USA, Canada DST Begins 2 a.m. (Second Sunday in March) DST Ends 2 a.m. (First Sunday in November) */ #property copyright "midorum, 2012" #property link "midorum@gmail.com" #property indicator_chart_window #import "kernel32.dll" int GetSystemTime(int& SYSTEMTIME[]); #import #define def_numInfo 10 #define def_numStocks 11 #define def_numTrade 13 #define def_hour 3600 #define def_day 86400 #define def_label_size 18 #define def_ini_trade_flag 0x1fff #define def_y_offset 20 extern string a1="отображать временнЫе зоны"; extern bool show_clocks=true; extern string a2="отображать информацию по торговому счету"; extern bool show_trade=true; extern string a4="период первого ATR"; extern int ATR1_period=14; extern string a5="период второго ATR"; extern int ATR2_period=5; extern string a6="размер шрифта"; extern int font_size=8; extern string a7="междустрочный интервал"; extern int interval=1; extern string a10="угол привязки индикатора (0-3)"; extern int obj_corner=1; extern string a12="расчет для лотности:"; extern double quantity_lots=1.0; extern string a11="распознавать 5-значного брокера"; extern bool autodetect_fivedigbroker=true; extern string a8="цвет 1"; extern color color1=SaddleBrown; extern string a9="цвет 2"; extern color color2=RoyalBlue; extern string a91="цвет 3"; extern color color3=RoyalBlue; extern string a92="цвет 4"; extern color color4=Gray; extern string a70="цвет для открытых площадок"; extern color open_color=Green; extern string a71="цвет для закрытых площадок"; extern color close_color=Gray; extern string a14="показывать информацию по бару"; extern bool Volumes_=true, Spread_=true, Margin_=true, Point_=true, SwapLong_=true, SwapShort_=true, ATR1_=true, ATR2_=true; extern string a13="показывать мировое время"; extern bool UTC_=true, Broker_=true, Wellington_=true, Sydney_=true, Tokyo_=true, HongKong_=true, Moscow_=true, EuropeUnion_=true, London_=true, NewYork_=true, Chicago_=true; extern string a15="показывать торговую информацию"; extern bool Equity_=true, Free_=true, Buy_=true, Sell_=true, Total_=true, Comissions_=true, Swaps_=true, MarginLevel_=true, StopOut_=true, MarginBalance_=true; string ind_name="iST_", font_name="Courier New"; int obj_x=15, obj_y=def_y_offset; int cur_offset, offset; datetime current_time; double five_dig_broker=1, lot_size, tick_size; string symbol; int trade_flag=def_ini_trade_flag, stocks_flag; bool move_basic_label=false; bool user_move=false; //имена временнЫх зон/площадок string stock_name[def_numStocks]={"UTC","Broker","Wellington","Sydney","Tokyo","HongKong","Moscow","EuropeUnion","London","NewYork","Chicago"}; //временнЫе зоны для объектов (http://www.worldtimezone.com/datetime.html) //0 - текущий выбор зоны (настраивается в init()) //1 - стандартное время зоны (для северного полушария)(для южного - летнее время зоны) //2 - летнее время зоны (Daylight saving time) (для северного полушария)(для южного - стандартное время зоны) //3 - месяц начала DST (для северного полушария)(для южного - месяц завершения DST) //4 - неделя (воскресенье) начала DST (0-Last) (для северного полушария)(для южного - неделя завершения DST) //5 - месяц завершения DST (для северного полушария)(для южного - месяц начала DST) //6 - неделя (воскресенье) завершения DST (0-Last) (для северного полушария)(для южного - неделя начала DST) int stock_zone[def_numStocks][7]={ 0,0,0,0,0,0,0, //UTC 0,0,0,0,0,0,0, //Broker 0,13,12,4,1,9,0, //Wellington 0,11,10,4,1,10,1, //Sydney 0,9,9,0,0,0,0, //Tokyo - не переводят 0,8,8,0,0,0,0, //Hong Kong - не переводят 0,4,4,0,0,0,0, //Moscow - не переводят 0,1,2,3,0,10,0, //Europe Union 0,0,1,3,0,10,0, //London 0,-5,-4,3,2,11,1, //New York 0,-6,-5,3,2,11,1}; //Chicago //время работы основных площадок (http://en.wikipedia.org/wiki/Stock_exchange)(http://www.worldtimezone.com/markets24.php) //0 - час и минуты открытия //1 - час и минуты зарытия int stock_time[def_numStocks][2]={ 0000,0000, //UTC 0000,0000, //Broker 1000,1600, //New Zealand Exchange (https://www.nzx.com/) (не проверено) 1000,1600, //Australian Securities Exchange (http://www.asx.com.au/products/ASX-Trading%20hours-Market-phases.htm) //Normal Trading takes place from 10:00 am to 4:00 pm, Sydney time. 0900,1510, //Tokyo Stock Exchange (http://www.tse.or.jp/english/index.html) (не проверено) 0930,1600, //Hong Kong Exchanges (http://www.hkex.com.hk/eng/rulesreg/traderules/sehk/Documents/chap-5_eng.pdf) //The Morning Session shall commence at 9:30 a.m. and end at 12:00 noon; and //The Afternoon Session shall commence at 1:30 p.m. and end at 4:00 p.m. provided that with effect from 5 March 2012, //the Afternoon Session shall commence at 1:00 p.m. and end at 4:00 p.m..) 1000,1900, //MICEX-RTS (http://rts.micex.ru/s223) //FX market is open from 10:00am until 19:00pm MSK 0900,1730, //Euronext (https://europeanequities.nyx.com/en/trading/trading-hours-and-holidays) //OFFICIAL TRADING HOURS (CET) Continuously-traded securities 09:00-17:30 //Frankfurt (http://deutsche-boerse.com/dbag/dispatch/en/kir/gdb_navigation/trading) //Trading times: 9.00 a.m. – Start of stock trading, 5.30 p.m. – End of stock trading 0800,1630, //London Stock Exchange (http://en.wikipedia.org/wiki/London_Stock_Exchange) //Normal trading sessions on the main orderbook (SETS) are from 08:00 to 16:30 //every day of the week except Saturdays, Sundays and holidays declared by the Exchange in advance. 0930,1600, //New York Stock Exchange (http://corporate.nyx.com/holidays-and-hours/nyse) //NYSE, NYSE Amex and NYSE Amex Options are open from Monday through Friday 9:30 a.m. to 4:00 p.m. ET. 0930,1600}; //Chicago (не проверено) string info_name[def_numInfo]={"Next","Vol","vol_delta","Spread","Margin","Point","SwapLong","SwapShort","ATR1","ATR2"}; string trade_name[def_numTrade]={"Equity","Free","Buy","buy_profit","Sell","sell_profit","Total","total_profit","Comissions","Swaps","Level","StopOut","Marg/Bal"}; int ord_buy, ord_sell; double ord_buy_lots, ord_sell_lots, ord_buy_profit, ord_sell_profit, ord_comissions, ord_swaps; //----------------------------------------------------------------------------------------------------- int init() { int i, _handle, _time_zone_information[43], _systemtime[4], _cur_month=Month(); datetime _first_time; int _first_day, _first_sunday,_last_sunday; symbol=Symbol(); if(autodetect_fivedigbroker && StringFind(symbol,"#",0)!=0 && (MarketInfo(symbol,MODE_DIGITS)==5 || MarketInfo(symbol,MODE_DIGITS)==3)) five_dig_broker=10; lot_size=MarketInfo(symbol,MODE_LOTSIZE)*quantity_lots; tick_size=MarketInfo(symbol,MODE_TICKSIZE)*five_dig_broker; _first_time=TimeCurrent()-(Day()-1)*def_day; _first_day=TimeDayOfWeek(_first_time); _first_sunday=(7-_first_day)+1; if(_first_sunday>7) _first_sunday-=7; if(TimeMonth(_first_time+(_first_sunday+28-1)*def_day)==_cur_month) { _last_sunday=_first_sunday+28; } else { _last_sunday=_first_sunday+21; } for(i=0;istock_zone[i][3] && _cur_month0) { if(Day()>_first_sunday+7*(stock_zone[i][4]-1)) { stock_zone[i][0]=stock_zone[i][2];//DST } else { stock_zone[i][0]=stock_zone[i][1];//standart } } else { if(Day()>_last_sunday) { stock_zone[i][0]=stock_zone[i][2];//DST } else { stock_zone[i][0]=stock_zone[i][1];//standart } } continue; } if(_cur_month==stock_zone[i][5]) { if(stock_zone[i][4]>0) { if(Day()<_first_sunday+7*(stock_zone[i][4]-1)) { stock_zone[i][0]=stock_zone[i][2];//DST } else { stock_zone[i][0]=stock_zone[i][1];//standart } } else { if(Day()<_last_sunday) { stock_zone[i][0]=stock_zone[i][2];//DST } else { stock_zone[i][0]=stock_zone[i][1];//standart } } continue; } stock_zone[i][0]=stock_zone[i][1];//standart } if(obj_corner>1) { _handle=FileOpen("iStockTimes.txt",FILE_READ|FILE_CSV); if(_handle>0) { while(!FileIsEnding(_handle)) { if(FileReadString(_handle)==symbol) { obj_y=StrToInteger(FileReadString(_handle)); cur_offset=StrToInteger(FileReadString(_handle)); break; } } FileClose(_handle); } } if(IsDllsAllowed()) { GetSystemTime(_systemtime); stock_zone[1][0]=TimeHour(TimeCurrent())-(_systemtime[2]&0x0000ffff); } else { if(show_clocks) { Alert("iStockTimes("+symbol+")-разрешите импорт DLL на вкладке свойств!"+ "\nЭто необходимо для правильного отображения времени индикатором."); show_clocks=false; } } if(UTC_) stocks_flag|=0x0001; if(Broker_) stocks_flag|=0x0002; if(Wellington_) stocks_flag|=0x0004; if(Sydney_) stocks_flag|=0x0008; if(Tokyo_) stocks_flag|=0x0010; if(HongKong_) stocks_flag|=0x0020; if(Moscow_) stocks_flag|=0x0040; if(EuropeUnion_) stocks_flag|=0x0080; if(London_) stocks_flag|=0x0100; if(NewYork_) stocks_flag|=0x0200; if(Chicago_) stocks_flag|=0x0400; if(obj_corner>1) offset=-font_size-interval; else offset=font_size+interval; return(0); } //----------------------------------------------------------------------------------------------------- int deinit() { int i; for(i=ObjectsTotal()-1;i>=0;i--) { if(StringFind(ObjectName(i),ind_name)==0) ObjectDelete(ObjectName(i)); } return(0); } //----------------------------------------------------------------------------------------------------- int start() { static datetime _last_run; current_time=TimeCurrent(); if((current_time-_last_run)<1) return(0); _last_run=current_time; if(obj_corner>1 && !user_move) { if(obj_y+cur_offset<0 || obj_y+cur_offset>def_y_offset) { obj_y=MathAbs(cur_offset)+def_y_offset; move_basic_label=true; int _handle=FileOpen("iStockTimes.txt",FILE_READ|FILE_WRITE|FILE_CSV); if(_handle>0) { while(!FileIsEnding(_handle)) if(FileReadString(_handle)==symbol) break; if(FileIsEnding(_handle)) FileWrite(_handle,symbol); FileSeek(_handle,0,SEEK_CUR); FileWrite(_handle,obj_y); FileWrite(_handle,cur_offset); FileClose(_handle); } } } cur_offset=0; Info(); if(show_clocks) Stocks(); if(show_trade) Trade(); WindowRedraw(); return(0); } //----------------------------------------------------------------------------------------------------- // void Info() { string _name,_str1,_str2; color _color; int i; int _sign=0,_sec_zero=0,_min_zero=0,_period,_sec,_hour,_min,_delta; bool _existing_object; _period=Period()*60; _sec=Time[0]+_period-current_time; _hour=_sec/3600; _sec%=3600; _min=_sec/60; if(_min<10) _min_zero='\x30'; _sec%=60; if(_sec<10) _sec_zero='\x30'; if(current_time>Time[0]) { _delta=((_period*Volume[0]/(current_time-Time[0]))-Volume[1])/Volume[1]*100; } if(_delta<0) { _color=Red; } else { _color=Green; _sign='\x2B'; } for(i=0;i=stock_time[i][0] && _opcl_time0) _color=Green; ObjectSetText(_name,_str1,font_size,font_name,color4); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; case 3: if(Buy_ && CheckBin(trade_flag,i)) { _str1=""; _str2=DoubleToStr(ord_buy_profit,2); GlueStrings(_str1,_str2); if(ord_buy_profit<0) _color=Red; if(ord_buy_profit>0) _color=Green; ObjectSetText(_name,_str1,font_size,font_name,_color); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; case 4: if(Sell_ && CheckBin(trade_flag,i)) { _str1=StringConcatenate(trade_name[i]," ",ord_sell); _str2=DoubleToStr(ord_sell_lots,2); GlueStrings(_str1,_str2); if(ord_sell_profit<0) _color=Red; if(ord_sell_profit>0) _color=Green; ObjectSetText(_name,_str1,font_size,font_name,color4); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; case 5: if(Sell_ && CheckBin(trade_flag,i)) { _str1=""; _str2=DoubleToStr(ord_sell_profit,2); GlueStrings(_str1,_str2); if(ord_sell_profit<0) _color=Red; if(ord_sell_profit>0) _color=Green; ObjectSetText(_name,_str1,font_size,font_name,_color); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; case 6: if(Total_ && CheckBin(trade_flag,i)) { _str1=StringConcatenate(trade_name[i]," ",ord_buy+ord_sell); _str2=DoubleToStr(ord_buy_lots+ord_sell_lots,2); GlueStrings(_str1,_str2); if(ord_buy_profit+ord_sell_profit<0) _color=Red; if(ord_buy_profit+ord_sell_profit>0) _color=Green; ObjectSetText(_name,_str1,font_size,font_name,color4); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; case 7: if(Total_ && CheckBin(trade_flag,i)) { _str1=""; _str2=DoubleToStr(ord_buy_profit+ord_sell_profit,2); GlueStrings(_str1,_str2); if(ord_buy_profit+ord_sell_profit<0) _color=Red; if(ord_buy_profit+ord_sell_profit>0) _color=Green; ObjectSetText(_name,_str1,font_size,font_name,_color); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; case 8: if(Comissions_ && CheckBin(trade_flag,i)) { _str1=trade_name[i]; _str2=DoubleToStr(ord_comissions,2); GlueStrings(_str1,_str2); if(ord_comissions<0) _color=Red; ObjectSetText(_name,_str1,font_size,font_name,_color); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; case 9: if(Swaps_ && CheckBin(trade_flag,i)) { _str1=trade_name[i]; _str2=DoubleToStr(ord_swaps,2); GlueStrings(_str1,_str2); if(ord_swaps<0) _color=Red; if(ord_swaps>0) _color=Green; ObjectSetText(_name,_str1,font_size,font_name,_color); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; case 10: if(MarginLevel_ && CheckBin(trade_flag,i)) { _str1=trade_name[i]; _str2=StringConcatenate(DoubleToStr(_acc_equity/_acc_margin*100,2),"%"); GlueStrings(_str1,_str2); ObjectSetText(_name,_str1,font_size,font_name,color3); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; case 11: if(StopOut_ && CheckBin(trade_flag,i)) { _str1=trade_name[i]; if(AccountStopoutMode()==0) _str2=StringConcatenate(DoubleToStr(AccountStopoutLevel(),0),"%"); else _str2=StringConcatenate(DoubleToStr(AccountStopoutLevel(),2)," ",AccountCurrency()); GlueStrings(_str1,_str2); ObjectSetText(_name,_str1,font_size,font_name,color3); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; case 12: if(MarginBalance_ && CheckBin(trade_flag,i)) { _str1=trade_name[i]; _str2=StringConcatenate(DoubleToStr(_acc_margin/AccountBalance()*100,2),"%"); GlueStrings(_str1,_str2); ObjectSetText(_name,_str1,font_size,font_name,color4); cur_offset+=offset; ObjectSet(_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS); } else ObjectSet(_name,OBJPROP_TIMEFRAMES,EMPTY); break; } } return; } //----------------------------------------------------------------------------------------------------- // void GlueStrings(string& _buf1,string& _buf2) { string _spases=" "; int _lenght=def_label_size-StringLen(_buf1)-StringLen(_buf2); if(_lenght>0) _spases=StringSubstr(_spases,0,_lenght); else _spases=""; _buf1=StringConcatenate(_buf1,_spases,_buf2); return; } //----------------------------------------------------------------------------------------------------- // void EnumOrders() { int i; ord_buy=0; ord_sell=0; ord_buy_lots=0; ord_sell_lots=0; ord_buy_profit=0; ord_sell_profit=0; ord_comissions=0; ord_swaps=0; for(i=0;i