¿Cómo puede el script recorrer mediante programación todos los instrumentos seleccionados en la ventana de Market Watch? - página 3

 
getch:

No hay ninguna perversión en el guión. Es poco convencional, eso es todo.

Por supuesto que no hay perversión en el propio guión, no lo he dicho exactamente. La perversión está en la forma de acceder a la lista. Pero debes estar de acuerdo en que el acceso a la lista de herramientas debe realizarse mediante el terminal, no a través de las ventanas. Y el script es muy útil, sobre todo para los principiantes como yo que no tienen experiencia en trabajar con el Windows. Gracias de nuevo, tiene un montón de soluciones útiles, que me habría llevado mucho tiempo aprender por mi cuenta.
 

¿Por qué tuviste que inventarte semejante perversión... Es más fácil escribir una DLL externa, en la que los datos necesarios se extraen del objeto MarketWatch. No se puede hacer con MQL4, porque se requiere el procedimiento de asignación de memoria.

 
En MQL4 es realista (probado) sacar estos datos sin escribir una DLL. Pero el enfoque anterior es mucho más universal. Porque puedes meter fácil y cómodamente muchos datos en la función WriteSymbol()...
 
 
Tu video no funciona...
Aunque, en principio, ya está claro cómo funcionará el guión. Pero es claramente una solución poco fiable, y probablemente causará frecuentes cuelgues del terminal. Ya se cuelga bastante a menudo...

getch:
En MQL4 se puede (intentar) obtener estos datos sin escribir una DLL. Pero el enfoque anterior es mucho más universal. Puedes meter fácil y cómodamente un montón de datos en la función WriteSymbol()...

Me pregunto cómo sacarlo. ¿Con qué órdenes? Si tal cosa es realmente posible, sería muy apreciado... Aunque dudo mucho que sea posible...


Yo mismo he sacado datos de Market Watch, pero sólo en C++. Para ello, primero se crea un nuevo proceso (OpenProcess), se reserva memoria en él (VirtualAllocEx), se coloca allí la estructura de datos necesaria y se guarda allí la información necesaria del objeto. Y a partir de ahí leemos los datos necesarios. Pero no se puede obtener la información sólo por mensajería, lo he probado. El objeto es de tipo ListView.

 

Por razones que desconozco, el foro no puede mostrar el vídeo correctamente. Por lo tanto, lo he adjuntado como archivo ZIP.


No he encontrado ninguna falta de fiabilidad o inoperatividad de este script.

Archivos adjuntos:
symbols.zip  1630 kb
 

Versión más sencilla (sólo una variable global) y más fiable (sin función hash) del script:

// Запись в файл названий и торговых условий всех символов из окна "Market Watch"
// Во время работы скрипта желательно не производить никаких действий в терминале

#include <WinUser32.mqh>

extern string FileName = "Symbols.txt";  // Имя файла для записи информации по символам
extern int Pause = 200; // Техническая пауза в миллисекундах

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

#define VK_HOME 0x24
#define VK_DOWN 0x28

#define LVM_GETITEMCOUNT 0x1004

// Названия используемых глобальных переменных
#define VAR_HANDLE "Symbol_Handle"

// Возвращает хэндл основного окна терминала
int Parent()
{
  int hwnd = WindowHandle(Symbol(), Period());
  int hwnd_parent = 0;

  while (!IsStopped())
  {
    hwnd = GetParent(hwnd);
     
    if (hwnd == 0)
      break;
       
    hwnd_parent = hwnd;
  }
   
  return(hwnd_parent);
}

// Открывает окно графика символа, расположенного в строке номер Num окна "Market Watch"
void OpenChart( int Num )
{
  int hwnd = Parent();
   
  if (hwnd != 0)  // нашли главное окно
  {
    hwnd = GetDlgItem(hwnd, 0xE81C); // нашли "Market Watch"
    hwnd = GetDlgItem(hwnd, 0x50);
    hwnd = GetDlgItem(hwnd, 0x8A71);
   
    PostMessageA(hwnd, WM_KEYDOWN, VK_HOME,0); // верхняя строчка окна "Market Watch"
     
    while (Num > 1)  
    {
      PostMessageA(hwnd, WM_KEYDOWN,VK_DOWN, 0); // сместились на нужную строчку
      Num--;
    }
  }

  PostMessageA(Parent(), WM_COMMAND, 33160, 0); // открыли график

  return;
}

// Закрывает окно графика
void CloseChart( int hwnd )
{
  PostMessageA(GetParent(hwnd), WM_CLOSE, 0, 0);
  
  return;
}

// Запускает выбранный в окне "Navigator" скрипт (индикатор или советник) 
void RunScript()
{
  PostMessageA(Parent(), WM_COMMAND, 33042, 0); // исполнить скрипт на текущем графике
  
  return;
}

// Возвращает количество символов в окне "Market Watch"
int SymbolCount()
{
  int hwnd = Parent();
  int Count = 0;    

  if (hwnd != 0)  // нашли главное окно
  {
    hwnd = GetDlgItem(hwnd, 0xE81C); // Нашли список символов
    hwnd = GetDlgItem(hwnd, 0x50);
    hwnd = GetDlgItem(hwnd, 0x8A71);
   
    Count = SendMessageA(hwnd, LVM_GETITEMCOUNT, 0, 0); // получили количество элементов списка
  }
   
  return(Count);
}

// Записывает характеристика текущего торгового символа в файл
void WriteSymbol()
{
  int handle;
  string Str;
  
  
  Str = "\n" + Symbol() + ":";
  Str = Str + "\n  Spread = " + DoubleToStr(MarketInfo(Symbol(), MODE_SPREAD), 0);
  Str = Str + "\n  StopLevel = " + DoubleToStr(MarketInfo(Symbol(), MODE_STOPLEVEL), 0);
  Str = Str + "\n  Digits = " + DoubleToStr(MarketInfo(Symbol(), MODE_DIGITS), 0);
  Str = Str + "\n  Price(Example) = " + DoubleToStr(Bid, Digits);

  handle = FileOpen(FileName, FILE_READ|FILE_WRITE);
  FileSeek(handle, 0, SEEK_END);

  FileWrite(handle, Str);
  FileClose(handle);
  return;
}

void start()
{
  int handle, Count, i = 1;
  
  if (GlobalVariableCheck(VAR_HANDLE))  // Запустили не первый раз...
  {
    GlobalVariableSet(VAR_HANDLE, WindowHandle(Symbol(), Period()));
    WriteSymbol();
  }
  else  // запустили первый раз
  {
    GlobalVariableSet(VAR_HANDLE, WindowHandle(Symbol(), Period()));

    handle = FileOpen(FileName, FILE_WRITE); // обнулили файл с данными
    FileClose(handle);
    
    Count = SymbolCount();

    while(!IsStopped())
    {
      if (i > Count)
        break;
      
      OpenChart(i); // открыли график очередного символа из окна "Market Watch"
      Sleep(Pause);
      
      RunScript(); // запустили на только что открытом графике текущий скрипт
      Sleep(Pause);
      
      CloseChart(GlobalVariableGet(VAR_HANDLE)); // закрыли окно графика
      Sleep(Pause);

      i++;
    } 
    
    GlobalVariableDel(VAR_HANDLE);
    
    // записали в файл количество символов в окне "Market Watch"
    handle = FileOpen(FileName, FILE_READ|FILE_WRITE);
    FileSeek(handle, 0, SEEK_END);

    FileWrite(handle, "\nAMOUNT OF SYMBOLS = " + Count);
    FileClose(handle);
  }
  
  return;
}
 
getch:

// Открывает окно графика символа, расположенного в строке номер Num окна "Market Watch"
void OpenChart( int Num )

¿qué comando puedo utilizar para "reiniciar" un símbolo en un gráfico ya abierto? es decir, cambiar el gráfico actual por el símbolo que quiero?

 

¡¡Aquí hizo ZG_All Quotings 1-80924!!

¡¡¡Gracias getch por la gran idea y vuelo de pensamiento!!!

Me encantaría saber el nombre del héroe :-)

Esta secuencia de comandos es la última forma de obtener cotizaciones de un corredor.

Una forma aún más difícil es visitar a su agente en persona con herramientas especiales para sacar presupuestos.

 
Con hierros, ¿verdad?
Razón de la queja: