HistoryDownloader





// +——————————————————————————————————————————————————————————————————————————————————————————————+
// ¦     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