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

 
getch:

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

É claro que não há perversão no próprio roteiro - eu não disse isso exatamente certo. A perversão está no modo de acessar a lista. Mas você deve concordar que o acesso à lista de ferramentas deve ser feito por meio do terminal, não através de janelas. E o roteiro é muito útil, especialmente para iniciantes como eu, que não têm experiência de trabalho com o Windows. Obrigado mais uma vez, tem muitas soluções úteis, o que teria me levado muito tempo para aprender por conta própria.
 

Por que você teve que inventar uma perversão tão grande... É mais fácil escrever uma DLL externa, na qual os dados necessários são extraídos do objeto MarketWatch. Você não pode fazê-lo com MQL4, porque o procedimento de alocação de memória é necessário.

 
Na MQL4 é realista (testado) puxar estes dados sem escrever uma DLL. Mas a abordagem acima é muito mais versátil. Porque você pode, fácil e convenientemente, acumular muitos dados na função WriteSymbol()...
 
 
Seu vídeo não funciona...
Embora, em princípio, já esteja claro como o roteiro vai funcionar. Mas é claramente uma solução não confiável, e provavelmente causará pendências freqüentes do terminal. Já é bastante freqüente como está...

getch:
Na MQL4 você pode (tentou) obter estes dados sem escrever uma DLL. Mas a abordagem acima é muito mais universal. Você pode facilmente e convenientemente enfiar muitos dados na função WriteSymbol()...

Pergunto-me, como isto pode ser tirado? Com que comandos? Se tal coisa for realmente possível, seria muito apreciada... Embora eu duvide seriamente que seja possível...


Eu mesmo retirei dados do Market Watch, mas somente em C++. Para fazer isso, você primeiro cria um novo processo (OpenProcess), reserva memória nele (VirtualAllocEx), coloca a estrutura de dados necessária lá, e guarda as informações necessárias do objeto lá. E então lemos os dados necessários a partir daí. Mas você não pode obter as informações apenas por mensagens, eu tentei. O objeto é do tipo ListView.

 

Por razões desconhecidas para mim, o fórum é incapaz de exibir o vídeo corretamente. Portanto, eu o anexei como um arquivo ZIP.


Eu não encontrei nenhuma falta de confiabilidade ou inoperabilidade deste roteiro.

Arquivos anexados:
symbols.zip  1630 kb
 

Versão mais simples (apenas uma variável global) e mais confiável (sem função hash) do roteiro:

// Запись в файл названий и торговых условий всех символов из окна "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 )

que comando posso usar para "redefinir" um símbolo para um gráficoaberto? ou seja, mudar o gráfico atual para o símbolo que eu quero?

 

Aqui ZG_All Quotings 1-80924!!!

Obrigado getch pela grande idéia e pelo vôo do pensamento!!!

Gostaria de saber o nome do herói :-)

Este roteiro é a última maneira de obter citações de um corretor.

Uma maneira ainda mais difícil é visitar seu corretor pessoalmente com ferramentas especiais para derrubar as citações.

 
Com ferros, não é?