// +——————————————————————————————————————————————————————————————————————————————————————————————+ // ¦ History Downloader Expert HistoryDownloader.mq4 ¦ // ¦ Ñîâåòíèê äëÿ çàãðóçêè â òåêóùèé ÷àðò èñòîðèè êîòèðîâîê. ¦ // ¦ Èäåÿ ïîçàèìñòâîâàíà èç ñêðèïòà s-Downloader (http://codebase.mql4.com/ru/5875) óâàæàåìîãî ¦ // ¦ Talex. ¦ // ¦ Ãëàâíîå îòëè÷èå îò s-Downloader: çàãðóçêà ïðîèçâîäèòñÿ ÒÎËÜÊÎ áàðîâ òåêóùåãî òàéìôðåéìà, è ¦ // ¦ òîëüêî äî óêàçàííîãî âðåìåíè. ¦ // ¦ Äî ïðèñîåäèíåíèÿ ñîâåòíèêà íåîáõîäèìî: ¦ // ¦ •îòêëþ÷èòü Àâòî Ïðîêðóòêó; ¦ // ¦ •ïðîâåðèòü â Îïöèÿõ çíà÷åíèÿ ìàêñ. êîëè÷åñòâà áàðîâ; ¦ // ¦ •ïðèñîåäèíèòü ê ÷àðòó èíäèêàòîð HistoryDownloaderI. ¦ // ¦ Ïðèëàãàåìûé èíäèêàòîð íåîáõîäèì äëÿ ïîëó÷åíèÿ ïåðåìåííîé Bars, è òàéì-ñåðèè Time[]. Äåëî â ¦ // ¦ òîì, ÷òî ñîâåòíèê âûïîëíÿåò âñþ ñâîþ ðàáîòó íà îäíîé èòåðàöèè start(), à ñëåäîâàòåëüíî, íå ¦ // ¦ ïîëó÷àåò îáíîâëåííûõ äàííûõ èç ïðåäîïðåäåëåííûõ ïåðåìåííûõ ÷àðòà. Èíäèêàòîð ñîçäàåò, è ¦ // ¦ îáíîâëÿåò ãëîáàëüíûå ïåðåìåííûå íóæíûìè ñîâåòíèêó äàííûìè. Ýòèì ýòî ôóíêöèè îãðàíè÷èâàþòñÿ. ¦ // ¦----------------------------------------------------------------------------------------------¦ // ¦ [release 1] 23.08.2009 ¦ // ¦ •Ïåðâûé ðåëèç. Áàãðåïîðòû è ïðåäëîæåíèÿ ïî îïòèìèçàöèè ïðèâåòñòâóþòñÿ ;) ¦ // ¦ | © xp3rienced, Ekaterinburg 2009 ¦ // +——————————————————————————————————————————————————————————————————————————————————————————————+ #property copyright "© xp3rienced" #property link "no4ta[at]inbox.ru" #import "user32.dll" int PostMessageA (int hWnd, int Msg, int wParam, int lParam); #import #define PAUSE_ON_UPDWAIT 0 #define KEYPRESS_REPEATS 2 #define WM_KEYDOWN 0x0100 #define WM_KEYUP 0x0101 #define VK_HOME 0x24 #define GVNAME_BAR_COUNT "BarOnChartCount" #define GVNAME_FIRST_BAR_TIME "FirstBarDateTime" #define DELIMITER_STR "————————————————————————————\n" #define ERRSTR_CANT_RECV_HWND "Íå óäàëîñü ïîëó÷èòü îïèñàòåëü îêíà (HWND) ÷àðòà.\nÑîâåòíèê îñòàíîâëåí" #define ERRSTR_CANT_FIND_GV "Íå íàéäåíû ãëîáàëüíûå ïåðåìåííûå. Óáåäèòåñü, ÷òî èíäèêàòîð ïîäêëþ÷åí ê ÷àðòó.\nÑîâåòíèê îñòàíîâëåí" #define ERRSTR_SUCCESS "Çàãðóçêà êîòèðîâîê çàâåðøåíà óñïåøíî.\nÎòêëþ÷èòå ñîâåòíèêà, è çàêðîéòå òåðìèíàë, îñòàâèâ îêíî ÷àðòà, äëÿ çàïèñè èñòîðèè íà äèñê\n(íå îáÿçàòåëüíî, íî ó àâòîðà, çàïèñü íà äèñê ïðîèñõîäèëà òîëüêî ïîñëå äàííûõ ìàíèïóëÿöèé)\n" #define ERRSTR_FAIL "Íå óäàëîñü çàãðóçèòü êîòèðîâêè.\nÓáåäèòåñü, ÷òî Àâòî Ïðîêðóòêà îòêëþ÷åíà, è â Îïöèÿõ óñòàíîâëåíî äîñòàòî÷íîå êîëè÷åñòâî\náàðîâ â îêíå, äëÿ âìåùåíèÿ áàðîâ êîòèðîâîê äî óêàçàííîé äàòû\n" //====[ ïàðàìåòðû ñîâåòíèêà ]==== extern string d1 = "Ëèìèò çàãðóçêè. Ò.å. äî êàêîé äàòû çàãðóæàòü èñòîðèþ"; extern datetime ToDate = D'01.01.2009'; extern string d2 = "Òàéìàóò çàïðîñà (ìñ). Åñëè çà óêàçàííîå âðåìÿ, â ÷àðòå íå äîáàâèòñÿ áàðîâ, ïîïûòêà çàãðóçèòü áàðû áóäåò ïðèçíàíà íåóäà÷íîé"; extern int Timeout = 1000; extern string d3 = "Ìàêñèìàëüíî äîïóñòèìîå êîëè÷åñòâî íåóäà÷íûõ ïîïûòîê ïîäðÿä. Ïðè äîñòèæåíèè óêàçàííîãî ÷èñëà íåóäà÷íûõ ïîïûòîê, ñîâåòíèê îñòàíîâèò âûïîëíåíèå"; extern int MaxFailsInARow = 10; //====[ ãëîáàëüíûå ïåðåìåííûå ]==== string CurrSymbol; // Èíñòðóìåíò òåêóùåãî ÷àðòà int CurrPeriod; // Ïåðèîä òåêóùåãî ÒÔ int ChartHWND; // Îïèñàòåëü îêíà ãðàôèêà int BarsAtStart; // Êîëè÷åñòâî áàðîâ íà ÷àðòå, äî çàïóñêà int ExecStartTime; // Âðåìÿ íà÷àëà âûïîëíåíèÿ ñîâåòíèêà int LastLatency; // Ïîñëåäíÿÿ çàäåðæêà îáíîâëåíèÿ ãðàôèêà string ErrorString; //+------------------------------------------------------------------+ //| Ôóíêöèÿ èíèöèàëèçàöèè ýêñïåðòà | //+------------------------------------------------------------------+ int init() { //---- CurrSymbol = Symbol(); CurrPeriod = Period(); ErrorString = ""; GetLastError(); // Îáíóëÿåì çíà÷åíèå last_error ChartHWND = WindowHandle(CurrSymbol, CurrPeriod); if(ChartHWND == 0) ErrorString = StringConcatenate(ERRSTR_CANT_RECV_HWND, "\nÊîä îøèáêè: ", GetLastError(), "\n"); if(!GlobalVariableCheck(GVNAME_BAR_COUNT) || !GlobalVariableCheck(GVNAME_FIRST_BAR_TIME)) ErrorString = StringConcatenate(ErrorString, ERRSTR_CANT_FIND_GV); if(ErrorString != "") { Alert(ErrorString); return(0); } BarsAtStart = Bars; ExecStartTime = GetTickCount(); start(); // Çíàþ, íåëüçÿ òàê äåëàòü :) ýòî íà ñëó÷àé îòñóòñòâèÿ ïðèõîäÿùèõ òèêîâ //---- return(0); } //+------------------------------------------------------------------+ //| Ôóíêöèÿ äåèíèöèàëèçàöèè ýêñïåðòà | //+------------------------------------------------------------------+ int deinit() { //---- UnpressHOME(); // (?) ïî êàêèì-òî ïðè÷èíàì, íå âñåãäà ñðàáàòûâàåò //---- return(0); } //+------------------------------------------------------------------+ //| Ôóíêöèÿ èòåðàöèè ýêñïåðòà | //+------------------------------------------------------------------+ int start() { if(ErrorString != "") return(0); //---- bool success = DownloadHistory(ToDate); string s = StringConcatenate(DELIMITER_STR, "Áàðîâ çàãðóæåíî: ", WindowFirstVisibleBar() - BarsAtStart + 1, "\nÇàòðà÷åíî âðåìåíè: ", FormatTime(GetTickCount() - ExecStartTime) ); if(success) s = StringConcatenate(ERRSTR_SUCCESS, s); else s = StringConcatenate(ERRSTR_FAIL, s); Alert(s); //---- return(0); } //+----------------- Äàëåå ïîëüçîâàòåëüñêèå ôóíêöèè -----------------+ //+------------------------------------------------------------------+ //| Ôóíêöèÿ çàêà÷êè èñòîðèè êîòèðîâîê | //| Çàêà÷êà îñóùåñòâëÿåòñÿ ýìóëÿöèåé íàæàòèÿ êëàâèøè HOME â îêíî | //| ÷àðòà, ê êîòîðîìó ïðèêðåïëåí ñîâåòíèê. Çàêà÷èâàþòñÿ òîëüêî | //| áàðû òåêóùåãî òàéìôðåéìà, äî âðåìåíè, óêàçàííîãî â ïàðàìåòðå | //+------------------------------------------------------------------+ bool DownloadHistory(datetime EndTime) { int FailCount = 0; // Ñ÷åò÷èê íåóäà÷íûõ ñ÷èòûâàíèé, èäóùèõ ïîäðÿä datetime FirstBarTime; while(!IsStopped()) { PressHOME(); // Ýìóëèðóåì çàæàòèå êëàâèøè HOME if(WaitForChartUpdate()) // Æäåì îáíîâëåíèÿ ÷àðòà FailCount = 0; // Åñëè ïîëó÷èëè êîòèðîâêè - îáíóëÿåì ñ÷åò÷èê îøèáîê else FailCount++; // Íåóäà÷íî, óâåëè÷èì ñ÷åò÷èê îøèáîê UnpressHOME(); // Îòæèìàåì HOME FirstBarTime = GlobalVariableGet(GVNAME_FIRST_BAR_TIME); Comment(StringConcatenate("Èäåò çàãðóçêà èñòîðèè äî ", TimeToStr(EndTime), "\nÒåêóùàÿ ïîçèöèÿ ÷àðòà: ", TimeToStr(FirstBarTime), "\nÁàðîâ íà ÷àðòå: ", GlobalVariableGet(GVNAME_BAR_COUNT), "\nÏîñëåäíÿÿ çàäåðæêà îáíîâëåíèÿ ÷àðòà: ", LastLatency, "ìñ\nÑ ìîìåíòà çàïóñêà ïðîøëî: ", FormatTime(GetTickCount() - ExecStartTime))); if(FirstBarTime <= EndTime) return(true); if(FailCount >= MaxFailsInARow) return(false); } } //+------------------------------------------------------------------+ //| Ôóíêöèÿ îæèäàíèÿ îáíîâëåíèÿ ÷àðòà | //| Îáíîâëåíèå ÷àðòà ïðîâåðÿåòñÿ ïî èíäåêñó ïåðâîãî âèäèìîãî áàðà. | //| Âîçâðàùàåìûå çíà÷åíèÿ: true - ÷àðò îáíîâèëñÿ (áàðû ïîäãðóæåíû); | //| false - èñòåêëî âðåìÿ òàéìàóòà, îáíîâëåíèÿ íå ïðîèçîøëî. | //| Åñëè, ïî êàêèì-òî ïðè÷èíàì, ïîòîê ñîâåòíèêà òîðìîçèò ñèñòåìó(?) | //| èçìåíèòå êîíñòàíòó PAUSE_ON_UPD_WAIT, óñòàíîâèâ âðåìÿ ïàóçû | //| ìåæäó èòåðàöèÿìè öèêëà ôóíêöèè | //+------------------------------------------------------------------+ bool WaitForChartUpdate() { int FirstVisBar = WindowFirstVisibleBar(); int Start = GetTickCount(); while(true) { if(WindowFirstVisibleBar() > FirstVisBar) return(true); LastLatency = GetTickCount() - Start; // Ïîñëåäíåå çíà÷åíèå çàäåðæêè îáíîâëåíèÿ ÷àðòà if(LastLatency >= Timeout) return(false); Sleep(PAUSE_ON_UPDWAIT); } } //+------------------------------------------------------------------+ //| Ôóíêöèÿ ýìóëÿöèè íàæàòèÿ êëàâèøè HOME | //| Ýìóëÿöèÿ îñóùåñòâëÿåòñÿ îòïðàâêîé WM-ñîîáùåíèÿ îêíó ÷àðòà. | //| Êîíñòàíòîé KEYPRESS_REPEATS îïðåäåëÿåòñÿ êîëè÷åñòâî ïîâòîðîâ | //| íàæàòèÿ êëàâèøè. Äèàïàçîí çíà÷åíèé: 0..255 | //+------------------------------------------------------------------+ void PressHOME() { PostMessageA(ChartHWND, WM_KEYDOWN, VK_HOME, KEYPRESS_REPEATS); } //+------------------------------------------------------------------+ //| Ôóíêöèÿ ýìóëÿöèè îòæàòèÿ êëàâèøè HOME | //| Ýìóëÿöèÿ îñóùåñòâëÿåòñÿ îòïðàâêîé WM-ñîîáùåíèÿ îêíó ÷àðòà. | //+------------------------------------------------------------------+ void UnpressHOME() { PostMessageA(ChartHWND, WM_KEYUP, VK_HOME, 1); } //+------------------------------------------------------------------+ //| Ôóíêöèÿ ôîðìàòèðîâàíèÿ ìèëëèñèêóíä âî âðåìåííÎå ïðåäñòàâëåíèå | //+------------------------------------------------------------------+ string FormatTime(int milliseconds) { int seconds = milliseconds / 1000; return(StringConcatenate(TimeHour(seconds), "÷ ", TimeMinute(seconds), "ì ", TimeSeconds(seconds), "ñ")); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
user32
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen