можно ли с помощью скрипта в одном из открытых графиков менять финансовый инструмент (валютную пару) ?? - страница 3

 
#include <WinUser32.mqh>

#import "user32.dll"
  int GetParent( int hWnd );
  int GetDlgItem( int hDlg, int nIDDlgItem );
#import

#define VK_RETURN 0x0D
#define VK_ESCAPE 0x1B

#define PAUSE 2000

//Активирует строку Str в строке быстрой навигации hwnd-чарта
// NB: При изменении символа или таймфрэйма
// требуется отсутствие запущенного скрипта на hwnd-чарте!
void ActivateString( int hwnd, string Str )
{
  hwnd = GetDlgItem(hwnd, 0x45A);
  SetWindowTextA(hwnd, Str);
  PostMessageA(hwnd, WM_KEYDOWN, VK_RETURN, 0);
  
  return;
}

// Возвращает хэндл следующего чарта за hwnd-чартом
int NextChart( int hwnd ) 
{
  int handle;
  
  hwnd = GetParent(hwnd);
  handle = GetWindow(hwnd, GW_HWNDNEXT);
  
  if (handle == 0)
    handle = GetWindow(hwnd, GW_HWNDFIRST);
    
  hwnd = GetDlgItem(handle, 0xE900); 
  
  return(hwnd);
}

// Активирует строку Str в строках быстрой навигации
// всех графиков , кроме основного.
// NB: При изменении символа или таймфрэйма
// требуется отсутствие запущенных скриптов!
void ChangeAllCharts( string Str )
{
  int hwnd;
  int hwnd_base = WindowHandle(Symbol(), Period());
  
  hwnd = NextChart(hwnd_base);
  
  while (hwnd != hwnd_base)
  {
    ActivateString(hwnd, Str);
    hwnd = NextChart(hwnd);
  }
  
  return;
}

// Инициализирует все строки быстрой навигации
void InitAllFNB()
{
  int hwnd;
  int hwnd_base = WindowHandle(Symbol(), Period());

  hwnd = NextChart(hwnd_base);
  
  while (hwnd != hwnd_base)
  {
    PostMessageA(hwnd, WM_KEYDOWN, VK_RETURN, 0);
    Sleep(100); // ждем инициализацию
    PostMessageA(GetDlgItem(hwnd, 0x45A), WM_KEYDOWN, VK_ESCAPE, 0);
    
    hwnd = NextChart(hwnd);
  }

  PostMessageA(hwnd, WM_KEYDOWN, VK_RETURN, 0);
  Sleep(100); // ждем инициализацию
  PostMessageA(GetDlgItem(hwnd, 0x45A), WM_KEYDOWN, VK_ESCAPE, 0);
  
  return;
}

void start()
{
  int hwnd = WindowHandle(Symbol(), Period());
  
  InitAllFNB();
  
  ActivateString(hwnd, TimeToStr(Time[Bars - 1]));
  Sleep(PAUSE);

  ChangeAllCharts("EURUSD,1");
  Sleep(PAUSE);

  ChangeAllCharts("GBPUSD,5");
  Sleep(PAUSE);

  ChangeAllCharts(Symbol() + "," + Period());
  Sleep(PAUSE);

  ActivateString(hwnd, TimeToStr(Time[0]));
  
  return;
}
 

спасибо на зачем менять символ во всех окнах

можно ли выбрать нужное окно из профиля (например chart01.chr) и только там сменить символ?

 
Это только демонстрация рабочей идеи, которая значительно надежнее эмуляции клавиатуры и универсальней. С помощью приведенных функций возможно решение различных задач, в частности вашей - ActivateString.
 

ну я понял что демонстрация но есть ли возможность выбрать конкретное окно не перебирая их Cntrl-Tab'ом ?

хотелось бы именно по порядковому номеру окна а не по его имени

 

я такой злодей.. отловил щас команды как выбрать конкретный профиль..

34100 первый профиль

34101 второй

34102 третий

341.. и т д

 
sabluk писал (а) >>

ну я понял что демонстрация но есть ли возможность выбрать конкретное окно не перебирая их Cntrl-Tab'ом ?

хотелось бы именно по порядковому номеру окна а не по его имени

По порядковому номеру вы знаете как... Мне видется следующий способ удобнее в некоторых ситуациях.

1. Выполняем подобный скрипт на графике-жертве.

extern string GlobalName = "Handle";

void PutHandle()
{
  int hwnd = WindowHandle(Symbol(), Period());

  GlobalVariableSet(GlobalName, hwnd);
  
  return;
}

void start()
{
  PutHandle();
  
  return;
}

2. Вешаем на подобие следующего скрипта горячую клавишу и меняем ей график-жертву из любого окна.

extern string GlobalName = "Handle";

#include <WinUser32.mqh>

#import "user32.dll"
  int GetDlgItem( int hDlg, int nIDDlgItem );
#import

#define VK_RETURN 0x0D

//Активирует строку Str в строке быстрой навигации hwnd-чарта
// NB: При изменении символа или таймфрэйма
// требуется отсутствие запущенного скрипта на hwnd-чарте!
void ActivateString( int hwnd, string Str )
{
  hwnd = GetDlgItem(hwnd, 0x45A);
  SetWindowTextA(hwnd, Str);
  PostMessageA(hwnd, WM_KEYDOWN, VK_RETURN, 0);
  
  return;
}

int GetHandle()
{
  int hwnd;

  hwnd = GlobalVariableGet(GlobalName);
  
  return(hwnd);
}

void start()
{
  ActivateString(GetHandle(), "eurusd,15");
  
  return;
}
 
Не забудьте после запуска терминала инициализировать строку быстрой навигации графика-жертвы. Для этого достаточно будет один раз войти в нее (и выйти).
 
getch писал (а) >>
Не забудьте после запуска терминала инициализировать строку быстрой навигации графика-жертвы. Для этого достаточно будет один раз войти в нее (и выйти).

к сожалению такая реализация на мой взгляд не удобная ((

уж проще тогда на эмуляции клавиш сделать

выбор окна командами а ввод эмуляцией

 
Посмотрите функцию InitAllFNB() - запустить один раз ее. Больше не надо вообще. Идея простая и относительно надежная, развивайте.