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

 
KimIV:
VBAG:
Recientemente he resuelto este problema por mí mismo.
No funciona cuando los DCs añaden algo propio al nombre de la pareja. Por ejemplo, "m", "!", "." o "_".
Sí, por supuesto, lo hice en los propósitos de investigación, pero si quieres hacer algo radical - para tropezar y buscar el número de combinaciones de todos los caracteres ASCII, digamos, el número máximo razonable de caracteres en el nombre del instrumento (8-10). Este script probablemente tardará unas horas en ejecutarse, pero es automático y está garantizado.


a Zhunko.
-Recuerdo, por supuesto que saqué la idea de su código. Trabajé con tu cargador durante unos días - ¡es divertido! Gracias.
 
KimIV:
VBAG:

Recientemente he resuelto este problema por mí mismo.
No funciona cuando los DCs añaden algo propio al nombre de la pareja. Por ejemplo, "m", "!", "." o "_".
Hay pocas FC de este tipo y el número de caracteres que utilizan es pequeño. Se puede prever.
Eso es lo que hice con las parejas de Moneiraine. Ahí es donde están "mini" y "pro".
Creo que también hay algo de mierda en Lite.
Es decir, puede dividir los instrumentos en grupos por DT.
Sólo me interesaban las siguientes empresas de corretaje: Alpari, ForexBest, MoneyRain, NorthFinance, NWBroker.
Se trata de empresas de corretaje con el máximo número de instrumentos. Y eran necesarios para dar cotizaciones para el cálculo de índices monetarios.
El script "ZZ_All Quotings 0-0080" está diseñado para ellos.
 
// Запись в файл названий и торговых условий всех символов из окна "Market Watch"
// Во время работы скрипта желательно не производить никаких действий в терминале
// NB: Используемая Хэш-функция не является корректной для данной задачи 
 
#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 VAR_HASH "Symbol_Hash"
#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;
}
 
// Хэш-функция перевода строки в целое число
// NB: данная функция не совершенна (приводит к коллизиям)
int Hash( string Str )
{
  int HashRes = 0;
  int i; 
  
  i = StringLen(Str) - 1;
  
  while (i >= 0)
  {  
    HashRes += StringGetChar(Str, i);
    i--;
  }
 
  HashRes %= 101;
  
  return(HashRes);
}
 
// Запускает выбранный в окне "Navigator" скрипт (индикатор или советник) 
void RunScript()
{
  PostMessageA(Parent(), WM_COMMAND, 33042, 0); // исполнить скрипт на текущем графике
  
  return;
}
 
// Записывает характеристика текущего торгового символа в файл
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, i = 1;
  
  if (GlobalVariableCheck(VAR_HASH))  // Запустили не первый раз...
  {
    GlobalVariableSet(VAR_HANDLE, WindowHandle(Symbol(), Period()));
 
    if (GlobalVariableGet(VAR_HASH) != Hash(Symbol())) // проверка достижения конца списка символов окна "Market Watch"
    {  
      GlobalVariableSet(VAR_HASH, Hash(Symbol()));
      WriteSymbol();
    }
    else
      GlobalVariableDel(VAR_HASH);
  }
  else  // запустили первый раз
  {
    GlobalVariableSet(VAR_HASH, -1);
    
    handle = FileOpen(FileName, FILE_WRITE); // обнулили файл с данными
    FileClose(handle);
 
    while(!IsStopped())
    {
      OpenChart(i); // открыли график очередного символа из окна "Market Watch"
      Sleep(Pause);
      
      RunScript(); // запустили на только что открытом графике текущий скрипт
      Sleep(Pause);
      
      CloseChart(GlobalVariableGet(VAR_HANDLE)); // закрыли окно графика
      Sleep(Pause);
      
      if (!GlobalVariableCheck(VAR_HASH)) // Достигнут ли конец списка символов окна "Market Watch"?
        break;
        
      i++;
    }
    
    GlobalVariableDel(VAR_HANDLE);
    i--;
    
    // записали в файл количество символов в окне "Market Watch"
    handle = FileOpen(FileName, FILE_READ|FILE_WRITE);
    FileSeek(handle, 0, SEEK_END);
 
    FileWrite(handle, "AMOUNT OF SYMBOLS = " + i);
    FileClose(handle);
  }
  
 
  return;
}
 
Es un juguete divertido, pero no funciona bien. Me quedé atascado en la última herramienta. Al intentar detenerlo se produce un error en MT4.
Deja que se abran ventanas de cada instrumento con cada TF.
Este es el tipo de procedimiento que falta al principio:
#property show_inputs
 
¡Guau! ¡Eso es genial!
¡Gracias!
 
Oh, lo intentaré.
 
Zhunko:
Es un juguete divertido, pero no funciona bien. Me quedé atascado en la última herramienta. Al intentar detenerlo se produce un error en MT4.
Deja que se abran ventanas de cada instrumento con cada TF.
Este es el procedimiento que faltaba al principio:
#property show_inputs


Hazlo
extern int Pause = 1000; // Техническая пауза в миллисекундах

Si ha provocado un error, borre de nuevo las siguientes variables globales antes de ejecutar (F3):

"Symbol_Hash"
"Symbol_Handle"
Nota: El guión es sólo una demostración de la idea de una posible solución a la tarea en cuestión.
 
getch:

Nota: El guión es sólo una demostración de la idea de una posible solución a la tarea en cuestión.

La experiencia de programación demuestra maravillosamente tanto el ingenio de la mente humana como la falta de funcionalidad de la herramienta... hurra y ay...
 
Shu:

La falta de funcionalidad de la herramienta... hurra y ay...
Esperemos que en MQL5 no nos veamos obligados a hacer tales distorsiones.

P.D. Por otro lado, el proceso es importante.
 

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

Idea: El script abre ventanas de gráficos de cada instrumento de negociación desde la ventana "Market Watch", se ejecuta en ellas y cierra la ventana. Se regula a sí mismo utilizando variables globales creadas por él mismo (y borradas al final de la operación). Eso es todo.


El script funcionará el 99% de las veces, si se cumplen las siguientes condiciones:

- Se permitirá el uso de la DLL sin confirmación manual;

- El valor de la variable Pausa será superior a 1000 (pausa técnica, depende del rendimiento del ordenador y de la conexión a Internet. Cuanto mejores sean estas características, menos se podrá establecer el valor de Pausa y, respectivamente, se reducirá el tiempo de ejecución del script);

- borrar las variables globales(F3) "Symbol_Hash" y "Symbol_Handle" antes de ejecutar el script (esto puede ocurrir si el script no se ejecutó antes).


Después de terminar el script, el terminal tiene el mismo aspecto que tenía antes de iniciarlo. Todos los datos de los símbolos están en el archivo Symbols.txt.