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

 
getch:

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

Naturalmente non c'è nessuna perversione nella sceneggiatura stessa - non l'ho detto proprio bene. La perversione è nel modo di accedere alla lista. Ma dovreste essere d'accordo che l'accesso all'elenco degli strumenti dovrebbe essere realizzato per mezzo del terminale, non attraverso le finestre. E lo script è molto utile, soprattutto per i principianti come me che non hanno esperienza di lavoro con Windows. Grazie ancora, ha un sacco di soluzioni utili, che mi avrebbero richiesto molto tempo per imparare da solo.
 

Perché hai dovuto inventare una tale perversione... È più facile scrivere una DLL esterna, in cui i dati richiesti sono estratti dall'oggetto MarketWatch. Non si può fare con MQL4, perché è necessaria la procedura di allocazione della memoria.

 
In MQL4 è realistico (testato) estrarre questi dati senza scrivere una DLL. Ma l'approccio di cui sopra è molto più universale. Perché si può facilmente e convenientemente stipare un sacco di dati nella funzione WriteSymbol()...
 
 
Il tuo video non funziona...
Anche se, in linea di principio, è già chiaro come funzionerà lo script. Ma è chiaramente una soluzione inaffidabile, e probabilmente causerà frequenti blocchi del terminale. Si blocca abbastanza spesso così com'è...

getch:
In MQL4 è possibile (provato) ottenere questi dati senza scrivere una DLL. Ma l'approccio di cui sopra è molto più universale. Puoi facilmente e comodamente infilare un sacco di dati nella funzione WriteSymbol()...

Mi chiedo come fare per tirarlo fuori? Con quali comandi? Se una cosa del genere è davvero possibile, sarebbe molto apprezzata... Anche se dubito seriamente che sia possibile...


Io stesso ho estratto dati da Market Watch, ma solo in C++. Per fare questo, si crea prima un nuovo processo (OpenProcess), si riserva la memoria in esso (VirtualAllocEx), vi si colloca la struttura dati richiesta e vi si salvano le informazioni necessarie dell'oggetto. E poi leggiamo i dati necessari da lì. Ma non si può ottenere l'informazione solo con la messaggistica, l'ho provato. L'oggetto è di tipo ListView.

 

Per ragioni a me sconosciute, il forum non è in grado di visualizzare correttamente il video. Perciò l'ho allegato come ZIP-archive.


Non ho riscontrato alcuna inaffidabilità o inoperatività di questo script.

File:
symbols.zip  1630 kb
 

Versione più semplice (solo una variabile globale) e più affidabile (nessuna funzione hash) dello 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 )

quale comando posso usare per "resettare" un simbolo su un grafico già aperto? cioè passare il grafico corrente al simbolo che voglio?

 

Qui fatto ZG_Tutti i preventivi 1-80924!!!

Grazie getch per la grande idea e il volo di pensiero!!!

Mi piacerebbe sapere il nome dell'eroe :-)

Questo script è l'ultimo modo per ottenere preventivi da un broker.

Un modo ancora più duro è quello di visitare il vostro broker di persona con strumenti speciali per battere le quotazioni.

 
Con i ferri da stiro, vero?