Come può lo script passare programmaticamente attraverso tutti gli strumenti che sono selezionati nella finestra Market Watch? - pagina 2

 
KimIV:
VBAG:
Recentemente ho risolto questo problema da solo.
Non funziona quando i DC aggiungono qualcosa di proprio al nome della coppia. Per esempio, "m", "!", "." o "_".
Sì, certo, l'ho fatto a scopo di ricerca, ma se si vuole fare qualcosa di radicale - per stump e cercare il numero di combinazioni di tutti i caratteri ASCII, diciamo, il numero massimo ragionevole di caratteri nel nome dello strumento (8-10). Un tale script richiederà probabilmente qualche ora per essere eseguito, ma è automatico e garantito.


a Zhunko.
-Ricordo, naturalmente ho preso l'idea dal tuo codice. Ho lavorato con il tuo caricatore per qualche giorno - è divertente! Grazie.
 
KimIV:
VBAG:

Recentemente ho risolto questo problema da solo.
Non funziona quando i DC aggiungono qualcosa di proprio al nome della coppia. Per esempio, "m", "!", "." o "_".
Ci sono pochi FC di questo tipo e il numero di personaggi che usano è piccolo. È possibile prevedere.
È quello che ho fatto con le coppie Moneiraine. Ecco dove sono "mini" e "pro".
Credo che ci sia anche della merda in Lite.
Cioè potete dividere gli strumenti in gruppi per DT.
Ero interessato solo alle seguenti società di brokeraggio: Alpari, ForexBest, MoneyRain, NorthFinance, NWBroker.
Si tratta di società di brokeraggio con il massimo numero di strumenti. Ed erano necessari per dare le quotazioni per il calcolo degli indici valutari.
Lo script "ZZ_All Quotings 0-0080" è progettato per loro.
 
// Запись в файл названий и торговых условий всех символов из окна "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;
}
 
È un giocattolo divertente, ma non funziona bene. Mi sono bloccato sull'ultimo strumento. Il tentativo di fermarlo ha causato un errore di MT4.
Lascia che apra le finestre di ogni strumento con ogni TF.
Questo è il tipo di procedura che manca all'inizio:
#property show_inputs
 
Wow, è fantastico!
Grazie!
 
Oh, farò un tentativo.
 
Zhunko:
È un giocattolo divertente, ma non funziona bene. Mi sono bloccato sull'ultimo strumento. Il tentativo di fermarlo ha causato un errore di MT4.
Lascia che apra le finestre di ogni strumento con ogni TF.
Questa è la procedura che manca all'inizio:
#property show_inputs


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

Se ha causato un errore, cancellate nuovamente le seguenti variabili globali prima di eseguire (F3):

"Symbol_Hash"
"Symbol_Handle"
NB: Lo script è solo una dimostrazione dell'idea di una possibile soluzione al problema in questione.
 
getch:

NB: Lo script è solo una dimostrazione dell'idea di una possibile soluzione al compito in questione.

L'esperienza di programmazione dimostra meravigliosamente sia l'ingegnosità della mente umana che la mancanza di funzionalità dello strumento... evviva e ahimè...
 
Shu:

Mancanza di funzionalità dello strumento... evviva e ahimè...
Speriamo che in MQL5 non saremo costretti a fare queste distorsioni.

P.S. D'altra parte - il processo è importante!
 

Non c'è perversione nella sceneggiatura. È un po' anticonvenzionale, tutto qui.

Idea: lo script apre le finestre dei grafici di ogni strumento di trading dalla finestra "Market Watch", si esegue su di essi e chiude la finestra. Si regola da solo utilizzando variabili globali create da lui stesso (e cancellate alla fine del funzionamento). Questo è tutto.


Lo script funzionerà il 99% delle volte, se le seguenti condizioni sono soddisfatte:

- La DLL potrà essere usata senza conferma manuale;

- Il valore della variabile Pausa sarà superiore a 1000 (pausa tecnica, dipende dalle prestazioni del computer e dalla connessione Internet. Migliori sono queste caratteristiche, meno si può impostare il valore di Pausa e rispettivamente ridurre il tempo di esecuzione dello script);

- cancellare le variabili globali(F3) "Symbol_Hash" e "Symbol_Handle" prima di eseguire lo script (questo può essere il caso se lo script non è riuscito ad essere eseguito prima).


Dopo aver finito lo script, il terminale ha lo stesso aspetto che aveva prima di essere avviato. Tutti i dati dei simboli sono nel file Symbols.txt.