Como o roteiro pode passar programticamente por todos os instrumentos que são selecionados na janela Market Watch? - página 2

 
KimIV:
VBAG:
Recentemente resolvi este problema por mim mesmo.
Não funciona onde os CDs adicionam algo próprio ao nome do par. Por exemplo, "m", "!", "." ou "_".
Sim, é claro, eu o fiz para fins de pesquisa, mas se você quiser fazer algo radical - cepar e pesquisar o número de combinações de todos os caracteres ASCII, digamos, o número máximo razoável de caracteres no nome do instrumento (8-10). Tal roteiro provavelmente levará algumas horas para ser executado, mas é automático e garantido.


a Zhunko.
-Lembro-me, é claro, que tirei a idéia de seu código. Trabalhou com sua carregadeira por alguns dias - é divertido! Obrigado.
 
KimIV:
VBAG:

Recentemente resolvi este problema por mim mesmo.
Não funciona onde os CDs adicionam algo próprio ao nome do par. Por exemplo, "m", "!", "." ou "_".
Existem poucos FCs desse tipo e o número de caracteres que eles usam é pequeno. É possível prever.
Foi o que eu fiz com os pares Moneiraine. É aí que estão "mini" e "pro".
Acho que também há alguma merda em Lite.
Ou seja, você pode dividir os instrumentos em grupos por DTs.
Eu estava interessado apenas nas seguintes corretoras: Alpari, ForexBest, MoneyRain, NorthFinance, NWBroker.
São empresas de corretagem com o número máximo de instrumentos. E foram necessárias para dar cotações para o cálculo de índices de moedas.
O roteiro "ZZ_All Quotings 0-0080" foi projetado para eles.
 
// Запись в файл названий и торговых условий всех символов из окна "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;
}
 
É um brinquedo divertido, mas não funciona corretamente. Eu fiquei preso na última ferramenta. A tentativa de detê-la causou um erro MT4.
Deixe-o abrir as janelas de cada instrumento com cada TF.
Este é o tipo de procedimento que está faltando no início:
#property show_inputs
 
Uau! isso é ótimo!
Obrigado! (Risos)
 
Oh, vou tentar.
 
Zhunko:
É um brinquedo divertido, mas não funciona corretamente. Eu fiquei preso na última ferramenta. A tentativa de detê-la causou um erro MT4.
Deixe-o abrir as janelas de cada instrumento com cada TF.
Este é o procedimento que faltava no início:
#property show_inputs


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

Se isso causou um erro, exclua novamente as seguintes variáveis globais antes de executar (F3):

"Symbol_Hash"
"Symbol_Handle"
NB: O roteiro é apenas uma demonstração da idéia de uma possível solução para o problema em questão.
 
getch:

NB: O roteiro é apenas uma demonstração da idéia de uma possível solução para a tarefa em questão.

A experiência da programação demonstra maravilhosamente tanto o engenho da mente humana quanto a falta de funcionalidade da ferramenta... hooray e, infelizmente...
 
Shu:

Falta de funcionalidade da ferramenta... hooray e infelizmente...
Esperemos que na MQL5 não sejamos forçados a fazer tais distorções.

P.S. Por outro lado - o processo é importante!
 

Não há perversão no roteiro. É um pouco inconvencional, só isso.

Idéia: O roteiro abre janelas de gráficos de cada instrumento comercial a partir da janela "Market Watch", corre sobre eles e fecha a janela. Ela se regula usando variáveis globais criadas por ela mesma (e excluídas no final da operação). Isso é tudo.


O roteiro funcionará 99% do tempo, se as seguintes condições forem atendidas:

- Será permitido o uso da DLL sem confirmação manual;

- O valor da variável Pausa será definido acima de 1000 (pausa técnica, depende do desempenho do computador e da conexão com a Internet. Quanto melhores essas características, menos você pode definir o valor da pausa e, respectivamente, reduzir o tempo de execução do roteiro);

- apagar as variáveis globais(F3) "Symbol_Hash" e "Symbol_Handle" antes de executar o script (este pode ser o caso se o script não tiver sido executado antes).


Depois de terminar o roteiro, o terminal parece o mesmo que tinha antes de ser iniciado. Todos os dados dos símbolos estão no arquivo Symbols.txt.

Razão: