Очень сложная задача. Решение вознаграждается полным рабочим кодом.

 

Занялся я разработкой автоматического запуска тестера стратегий из любого эксперта. Удалось реализовать все, кроме ввода дат начального периода тестирования и конечного.

Если кто-то хорошо разбирается в программировании и использовании функций WinAPI прошу помощи в реализации кода для вставки нужной даты в конкретное окно.


Вот реализованный код в который осталось дописать только вставк даты, это небольшой кусок из основного алгоритма.


#property show_inputs

#property stacksize   4048

#import "user32.dll"
   int      SendMessageA(int hWnd,int Msg,int wParam,string lParam);
   int      PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int      GetWindowTextA(int hWnd,string lpString,int nMaxCount);
   int      GetDlgItem(int hDlg, int nIDDlgItem);
   int      GetAncestor(int hWnd, int gaFlags);
   int      GetLastActivePopup(int hWnd);
   int      IsDlgButtonChecked(int hWnd, int idButton);
   int      CheckDlgButton(int hWnd, int idButton,int gaFlags);
   int      GetWindow(int hWnd,int uCmd);
   int      GetNextWindowA(int hWnd,	int wCmd);
#import


#include <WinUser32.mqh>


int start() {
   int hMetaTrader, hTerminal, hTester, hButtonStart, hSave, hDlg, hButtonSave,hButtonDa,hButtonOpim,hTester2,hOt,hDo;      
   string sButtonStartName = "      ";
   
   hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2);              // Дескриптор основного окна терминала
   hTerminal = GetDlgItem(hMetaTrader,0xE81E);                                // Дескриптор окна валютной пары
   hTester = GetDlgItem(hTerminal,0x53);                                      // Дескриптор окна тестера стратегий
   hTester2 = GetDlgItem(hTester,0x81BF);                                     // Дескриптор подокна тестера стратегий

// Находим дескриптор окна идущий следующим после статического окна "От:"   
   hOt  =  GetWindow(FindHendlKey( GetDlgItem(hTester,0x81BF), "От:" ), GW_HWNDNEXT);
	Print("hOt = ", hOt," || ", DecToHex(hOt));
	
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   ПОМОГИТЕ НАПИСАТЬ КОД КОТОРЫЙ ВСТАВИТ В ОКНО ВВОДА ДАТЫ СЛЕДУЮЩИЮ ДАТУ 2008.01.01
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

// Находим дескриптор окна идущий следующим после статического окна "до:"   	
	hDo  =  GetWindow(FindHendlKey( GetDlgItem(hTester,0x81BF), "до:" ), GW_HWNDNEXT);
	Print("hDo = ", hDo," || ", DecToHex(hDo));

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   ПОМОГИТЕ НАПИСАТЬ КОД КОТОРЫЙ ВСТАВИТ В ОКНО ВВОДА ДАТЫ СЛЕДУЮЩИЮ ДАТУ 2009.05.01
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   
return(0);
}


int FindHendlKey( int Current, string findname ){
   string p1=  "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234";
  int temp = GetWindow( Current , GW_CHILD ); // ищем
  while ( temp != NULL ){
     GetWindowTextA( temp , p1 , StringLen(findname )+1 ); 
     if ( p1 == findname){ // проверим а не  тот ли это объект
        return( temp ); // это то что мы ищем
     }
     int r =   FindHendlKey( temp  ,   findname   ) ; // не значит не она , обойдем ее дочерние объекты
     if ( r != NULL ){
        return (r); // опс нашли дочку
     }
     temp = GetWindow( temp , GW_HWNDNEXT ); // проверяем следующий объект, дочерний 
  }
  return (0);
}

string DecToHex(int n)
  {
   string s = "", c;
   while(n != 0)
     {
      if(n%16 < 10)
          c = CharToStr(n % 16 + '0');
      else 
          c = CharToStr(n % 16 + 'A'-10);
      s = c + s;
      n = n / 16;
     }
   return(s);
  }


Кто поможет решить данную задачу получит полный исходный код автоматического запуска тестера стратегий, где реализованы функции тестирования и оптимизации экспертов.

Желательно что-бы еще программисты из MetaQutes помогли, потому как работать с окнами SysDateTimePick32 достаточно тяжело.


Прошу не предлагать решения по вводу дат с помощью эмуляции нажатия клавишь, метод не совсем подходит, потому как курсор не всегда встаёт именно в нужную позицию и вместо года, можно ввести месяц, а это не правильно.

 

Зачем так сложно ?

Если внимательно почитать доку к терминалу необходимые настройки/парамерты можно передать через ini файл

Terminal -> press F1->Содержание->Сервис-> Конфигурация при старте

 ;)

 
JavaDev >>:

Зачем так сложно ?

Если внимательно почитать доку к терминалу необходимые настройки/парамерты можно передать через ini файл

Terminal -> press F1->Содержание->Сервис-> Конфигурация при старте

;)

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

 
HIDDEN >>:

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

Запусти другой терминал и на нём оптимизируй, а лишние игры с winapi при автопилоте могут боком выйти.

 
JavaDev >>:

Запусти другой терминал и на нём оптимизируй, а лишние игры с winapi при автопилоте могут боком выйти.

Задача ставится сделать все в одном терминале. Решения для вызова и загрузки другого терминала уже имеются. Но не особо мне нравятся. Хочу в одном сделать и все тут. Все решилось кроме ввода даты.

 
Когда коту делать нечего он ...( далее всем известно), а когда якобы "великому программисту" "желта вода в голову ударяет", он "изобретает" всякую фигню.
 

Я сильно не разбирался. Но если в переменные hOt и hDo попадает номер окошка (hWnd), в которое нужно загнать текст, то делается это с помощью того же самого API с помощью команды SetWindowText.

На языке Visual Basic это описание (прикрепление) библиотеки будет выглядить так:

Public Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String) As Long

На MQL наверно так:

#import "user32.dll"
   int      SetWindowTextA(int hWnd, string txt);
#import

Попробуй!

-------

p/s: Блин, почему string фиолетовый?

 
EvgeTrofi >>:

Я сильно не разбирался. Но если в переменные hOt и hDo попадает номер окошка (hWnd), в которое нужно загнать текст, то делается это с помощью того же самого API с помощью команды SetWindowText.

На языке Visual Basic это описание (прикрепление) библиотеки будет выглядить так:

На MQL наверно так:

Попробуй!

-------

p/s: Блин, почему string фиолетовый?

Побывал, не работает у меня лично. Код я выложил специально, что-бы можно любой Ваш вариант самостоятельно проверить и тут отписать готовое решение поставленной задачи.

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

 

У КСЕОНА вроде даты вставлены.

Файлы:
 
FION >>:

У КСЕОНА вроде даты вставлены.

Xeon используем метод 2-х терминалов. Формирует ini файл и запускает еще 1 терминал. У меня условие работать в одном терминале и ничего внешнего не запускать.

 
EvgeTrofi писал(а) >>

p/s: Блин, почему string фиолетовый?

В настройках редактора поменяй..

Причина обращения: