Как просмотреть из советника историю заданного периода?

 
Вопрос на самом деле не тупой.
Просмотреть тот период времени, который выведен в Account History терминала - вопросов нет, без проблем. Но мне нужно в МТ4 из робота просматривать либо всю историю счета, либо указывать нужный период.
Тщательно пересмотрел все функции в ручном режиме. Увы. Нужное не нашел.
В том что это можно делать не сомневаюсь, в противном случае ни один сервис мониторинга счетов не смог бы выдавать инфу об истории предыдущей торговли. Вопрос только один: КАК?
 
Vasily Temchenko:
Вопрос на самом деле не тупой.
Просмотреть тот период времени, который выведен в Account History терминала - вопросов нет, без проблем. Но мне нужно в МТ4 из робота просматривать либо всю историю счета, либо указывать нужный период.
Тщательно пересмотрел все функции в ручном режиме. Увы. Нужное не нашел.
В том что это можно делать не сомневаюсь, в противном случае ни один сервис мониторинга счетов не смог бы выдавать инфу об истории предыдущей торговли. Вопрос только один: КАК?

только один вариант - сохранять историю в свою базу.

на самом деле несложно, открыл/закрыл ордер, записал результат в базу. А потом SELECT (openTime,closeTime,ticket,side,lots,profit) FROM orders WHERE openTime BETWEEN (.....)

 
Maxim Kuznetsov:

только один вариант - сохранять историю в свою базу.

на самом деле несложно, открыл/закрыл ордер, записал результат в базу. А потом SELECT (openTime,closeTime,ticket,side,lots,profit) FROM orders WHERE openTime BETWEEN (.....)

А если история уже набрана достаточно большая и запись не делалась? И если это пишется не только для себя?

 

На чистом МТ4 выбрать период истории невозможно. Только просить пользователя сделать.

Но можно при помощи 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, g_hSymbol, g_hMDIClient, g_hMT;

...
   g_hChart = WindowHandle(Symbol(), Period());
   if (g_hChart <= 0)
   {
      Alert(WindowExpertName(), ": не удалось получить дескриптор окна чарта. Эксперт отключен.");
      return false;
   }
   
   g_hSymbol = GetParent(g_hChart);
   if (g_hSymbol <= 0)
   {
      Alert(WindowExpertName(), ": не удалось получить дескриптор окна символа чарта. Эксперт отключен.");
      return false;
   }

   g_hMDIClient = GetParent(g_hSymbol);
   if (g_hMDIClient <= 0)
   {
      Alert(WindowExpertName(), ": не удалось получить дескриптор окна родителя всех открытых графиков. Эксперт отключен.");
      return false;
   }

   g_hMT = GetParent(g_hMDIClient);
   if (g_hMT <= 0)
   {
      Alert(WindowExpertName(), ": не удалось получить дескриптор главного окна терминала. Эксперт отключен.");
      return false;
   }



...
      SendMessageW(g_hMT, WM_COMMAND, MENU_ALL_HISTORY_ID, 0);
...
 
Maxim Kuznetsov:

только один вариант - сохранять историю в свою базу.

на самом деле несложно, открыл/закрыл ордер, записал результат в базу. А потом SELECT (openTime,closeTime,ticket,side,lots,profit) FROM orders WHERE openTime BETWEEN (.....)

Увы, это не проходит. "Для себя" я могу еще проще - вывел всю историю, нажал кнопку, сов просчитал все что требуется. Но я то пишу "для народа". Не прикажешь же каждому открывать всю историю при запуске сова. Была бы функция, которой я из кода мог бы открывать в терминале всю историю при первом запуске сова - нет проблем. Но увы,  нет такой функции.

 
Ihor Herasko:

На чистом МТ4 выбрать период истории невозможно. Только просить пользователя сделать.

Но можно при помощи WinAPI:

Спасибо за ответ и попытку помочь, но, увы, подгрузка .dll категорически запрещена дурацкими правилами Маркета, такой сов не опубликуют. Даже если пытаться подгружать абсолютно штатные .dll от самого Билла ;)
Так что вижу определенно - строку initial_deposit из меню убрать аж никак не получится. Да и много чего другого тоже не сделаешь, если нет возможности ковыряться в истории из кода. А жаль. Я то надеялся на то что авось чего не знаю, что-то недочитал...

 
Vasily Temchenko:
Вопрос на самом деле не тупой.
Просмотреть тот период времени, который выведен в Account History терминала - вопросов нет, без проблем. Но мне нужно в МТ4 из робота просматривать либо всю историю счета, либо указывать нужный период.
Тщательно пересмотрел все функции в ручном режиме. Увы. Нужное не нашел.
В том что это можно делать не сомневаюсь, в противном случае ни один сервис мониторинга счетов не смог бы выдавать инфу об истории предыдущей торговли. Вопрос только один: КАК?

Тут по ходу, если рассуждать логически, то компания владеющая терминалом Вам не обязана регулировать Ваши отношения с брокером и по идее - им должно быть все по барабану, для них это чужее. Тут по ходу нужна функция обращение к брокеру, что бы можно было все это по счету с ним(брокером), согласовать. Так, обращения к брокеру функции есть(это я рассуждаю), только если предварительно с брокером оговаривать такого рода вопросы по телефону, что на запросы они будут отвечать и таким образом можно будет из советника такую штуковину сотворить, что будет отправлено сообщение по запросу, о счете, с чистым файлом, в который брокер пропишет информацию и которая считается советником, такие функции точно есть. Но такие манипуляции надо оговаривать с брокером, а то могут приписать ст УК РФ 158 ч 3 попытка кражи в особо крупных размерах и т.д. А так не знаю?! 

 
Vasily Temchenko:

Увы, это не проходит. "Для себя" я могу еще проще - вывел всю историю, нажал кнопку, сов просчитал все что требуется. Но я то пишу "для народа". Не прикажешь же каждому открывать всю историю при запуске сова. Была бы функция, которой я из кода мог бы открывать в терминале всю историю при первом запуске сова - нет проблем. Но увы,  нет такой функции.

В таких случаях пишутся "Правила использования", в которых черным по белому прописывается требование к корректной работе советника: должна быть доступна вся история. В противном случае правильность работы алгоритма не гарантируется. Другого пути нет.

 
Ihor Herasko:

В таких случаях пишутся "Правила использования", в которых черным по белому прописывается требование к корректной работе советника: должна быть доступна вся история. В противном случае правильность работы алгоритма не гарантируется. Другого пути нет.

Да нет. Это того не стоит, там и так менюшка на 3 экрана и мануал к ней трехтомный ;). Просто останется в меню строка "Начальный депозит", в которую нужно вводить корректные данные. Можно и некорректные, можно  вообще не вводить - на работе не скажется, но вывод статистики по счету будет искажен. Хотел сделать красиво, исключить "человеческий фактор". Не получается. Ну и фиг с ним. Кто захочет видеть корректные данные, тот будет вводить то что есть.
"Задачу по истории", которая на самом деле для работы нужна я решил давно (просчет текущего профита/убытка индивидуально по каждой паре. Нужно для работы Разруливателя). И это главное.

Всем спасибо.

 
Ihor Herasko:

На чистом МТ4 выбрать период истории невозможно. Только просить пользователя сделать.

Но можно при помощи WinAPI:

Спасибо огромное, мне это очень помогло!
 
Ihor Herasko #:

На чистом МТ4 выбрать период истории невозможно. Только просить пользователя сделать.

Но можно при помощи WinAPI:

День добрый . Подскажите пожалуйста почему в OnTimer() не отображает всю историю при таком коде ? 
При вставке в OnTick() все работает .

 if(TotalHistOrders != OrdersHistoryTotal())
     {
      SendMessageW(g_hMT, WM_COMMAND, MENU_ALL_HISTORY_ID, 0);
      // Print("TotalHistOrders = ",TotalHistOrders, "   OrdersHistoryTotal() = ",OrdersHistoryTotal());
      TotalHistOrders = OrdersHistoryTotal();
      // Print("/////TotalHistOrders = ",TotalHistOrders, "   OrdersHistoryTotal() = ",OrdersHistoryTotal());
     }