Как из MQL-программы получить и изменить период истории, выставленный в терминале ?

 

Всех приветствую.

Такой вопрос: есть ли возможность узнать из эксперта, какой период выставлен в истории сделок в терминале ? И поменять его ?

Что-то сколько ни искал - не могу найти такой возможности... Плохо искал ?

 
Georgiy Merts:

Всех приветствую.

Такой вопрос: есть ли возможность узнать из эксперта, какой период выставлен в истории сделок в терминале ? И поменять его ?

Что-то сколько ни искал - не могу найти такой возможности... Плохо искал ?

Период показа истории выставленный в терминале MetaTrader 5

вообще никаким боком не влияет на функции получения истории HistorySelect

 
в МТ5, это не влияет на глубину истории для эксперта
 

Понял.

Это радует. Я думал, что эксперт получает историю только ту, что видна во вкладке "история".

 

Что-то не то.

Функция OrdersHistoryTotal() в МТ4 зависит от числа ордеров в загруженной истории.

Вопрос остается - как сделать так, чтобы загружалась нужная часть истории (или вся) ?

Похоже, для скрипта в МТ4 такой возможности не предусмотрено.

Я понимаю, что МТ4 - устаревший терминал, но счета на МТ4 есть. А поэтому код должен быть универсальным. Какой функцией в МТ4 получать ордера так, чтобы это не зависело от установок в терминале ?

 
Georgiy Merts:

Что-то не то.

Функция OrdersHistoryTotal() в МТ4 зависит от числа ордеров в загруженной истории.

Вопрос остается - как сделать так, чтобы загружалась только часть истории ?

Я понимаю, что МТ4 - устаревший терминал, но счета на МТ4 есть. А поэтому код должен быть универсальным. Какой функцией в МТ4 получать ордера так, чтобы это не зависело от установок в терминале ?

Боюсь что только "заботится о зарубках в истории" самому. То есть всё сам. И в MT5 тоже. Твоя (и моя) личная история по большому счёту не волнует никого кроме каждого из нас. DC будет хранить историю сделок пока это юридически ему значимо. Дольше - исключительно по доброй воле
 
Maxim Kuznetsov:
Боюсь что только "заботится о зарубках в истории" самому. То есть всё сам. И в MT5 тоже. Твоя (и моя) личная история по большому счёту не волнует никого кроме каждого из нас. DC будет хранить историю сделок пока это юридически ему значимо. Дольше - исключительно по доброй воле

Да мне не надо получать ВСЮ историю.

Я просто хочу получать известную часть этой истории, лично мне надо полгода. Но для этого - я должен быть уверен, что в терминале выставлен именно такой период истории. И, хорошо бы выставить его, если он иной.

Как это можно сделать в МТ4 ? Никак ?

 
Georgiy Merts:

...Я понимаю, что МТ4 - устаревший терминал, но счета на МТ4 есть. А поэтому код должен быть универсальным. Какой функцией в МТ4 получать ордера так, чтобы это не зависело от установок в терминале ? 

В этом случае универсального кода нет. В МТ4 получим то, что выбрано на вкладке "История Счёта". Если там выбрана история например за сегодня, то за вчерашний день не получим ничего. В МТ5 такой привязки нет.

 
Denis Kirichenko:

В этом случае универсального кода нет. В МТ4 получим то, что выбрано на вкладке "История Счёта". Если там выбрана история например за сегодня, то за вчерашний день не получим ничего. В МТ5 такой привязки нет.

Да вот же...

Собственно, проблема возникла из-за разделения Лиги ТС на три дивизиона (три счета).

Скрипт статистики должен собирать информацию по всем счетам, переключаясь между ними, и выдавать общий список ТС, которые должны быть либо переоптимизированы, либо переведены в другой дивизион.

Но, проблема в том, что при переключении аккаунта история в МТ4 появляется не сразу. А значит, скрипт должен понять, то ли истории нет потому, что она еще не подгружена, то ли ее нет, потому, что она не отображается на вкладке "История". Вот эту задачу и решаю. Пока приходится самому следить за отображаемой историей.

 
Georgiy Merts:

Да вот же...

Собственно, проблема возникла из-за разделения Лиги ТС на три дивизиона (три счета).

Скрипт статистики должен собирать информацию по всем счетам, переключаясь между ними, и выдавать общий список ТС, которые должны быть либо переоптимизированы, либо переведены в другой дивизион.

Но, проблема в том, что при переключении аккаунта история в МТ4 появляется не сразу. А значит, скрипт должен понять, то ли истории нет потому, что она еще не подгружена, то ли ее нет, потому, что она не отображается на вкладке "История". Вот эту задачу и решаю. Пока приходится самому следить за отображаемой историей.

Если это Вам поможет.

В случае, когда ручных назначений глубины истории не было, то у MT4 в \config\terminal.ini в строке "HistoryPeriod=..." указана глубина истории, назначаемая при запуске терминала. Перед запуском ее можно менять, вручную или программно.

Варианты значений: вся история (=7)  месяц (=4), три (=5), за сегодня (=1), за три дня (=2), неделю (=3), полгода (=6), иной период (=0). Не проверял их уже несколько лет, могли измениться.

P.S. Если этой строки в файле нет, я вставляю ее перед "LastScanTime=...". Почему - уже не помню.

Кажется, вот почему: "После этого ручное изменение настройки отражается в этой же строке, т.е. HistoryPeriod остается на прежнем месте, после LastScanTime.". Это не из документации, всего лишь мой комментарий в том месте, где перед запуском терминала назначается HistoryPeriod. Так ли это сейчас, сказать не могу. Различия между перед "LastScanTime=..." и после - в своем сообщении вижу, но оставил так, как у меня записано. Возможно, перед или после роли не играет.

 

Чистым MQL не обойтись. Только посылать сообщение через WinAPI:

#define WM_COMMAND                  int(0x0111)
#define MENU_ALL_HISTORY_ID         int(0x8122)                                                    

#import "user32.dll"
   int GetParent(int hWnd);
   int SendMessageW(int hWnd, int msg, int wParam, int lParam);   
   
#import      

   int g_hChart = WindowHandle(Symbol(), Period());
   if (g_hChart <= 0)
      return;
   
   int g_hSymbol = GetParent(g_hChart);
   if (g_hSymbol <= 0)
      return;

   int g_hMDIClient = GetParent(g_hSymbol);
   if (g_hMDIClient <= 0)
      return;

   int g_hMT = GetParent(g_hMDIClient);
   if (g_hMT <= 0)
      return;

   SendMessageW(g_hMT, WM_COMMAND, MENU_ALL_HISTORY_ID, 0);          // Запрос всей доступной истории счета
Причина обращения: