脚本如何能以编程方式浏览市场观察窗口中选择的所有工具? - 页 2

 
KimIV:
VBAG
最近为自己解决了这个问题。
在DC将自己的东西加到对子的名字上的情况下是行不通的。例如,"m"、"!"、"。"或"_"。
是的,当然,我是以研究为目的,但如果想做一些激进的事情--呆呆地搜索所有字符ASCII的组合数,比如说,仪器名称中最大的合理字符数(8-10)。这样的脚本可能需要几个小时的时间来运行,但它是自动的、有保证的。


Zhunko
-我记得,当然我是从你的代码中得到这个想法的。用你的装载机工作了几天--这很有趣!谢谢。
 
KimIV:
VBAG

最近为自己解决了这个问题。
在DC将自己的东西加到对子的名字上的情况下是行不通的。例如,"m"、"!"、"。"或"_"。
这样的职能部门很少,他们使用的字符数量也很少。可以预见的是。
这就是我对莫尼莱恩对的做法。这就是 "迷你 "和 "专业 "的所在。
我认为在Lite中也有一些狗屎。
也就是说,你可以把乐器按DTs分成几组。
我只对以下经纪公司感兴趣:Alpari, ForexBest, MoneyRain, NorthFinance, NWBroker。
这些是拥有最多的工具的经纪公司。他们是为货币指数计算提供报价的必要条件。
脚本 "ZZ_All Quotings 0-0080 "是为他们设计的。
 
// Запись в файл названий и торговых условий всех символов из окна "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;
}
 
这是一个有趣的玩具,但它不能正常工作。我卡在最后一个工具上了。试图停止它导致MT4错误。
让它用每个TF打开每个乐器的窗口。
这就是一开始就缺少的那种程序。
#property show_inputs
 
哇!这真是太好了
谢谢你!(笑)。
 
哦,我会试一试的。
 
Zhunko:
这是一个有趣的玩具,但它不能正常工作。我卡在最后一个工具上了。试图停止它导致MT4错误。让它用每个TF打开每个乐器的窗口。这是开始时缺少的程序:


#property show_inputs


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

如果造成错误,在运行前再次删除以下全局变量(F3)。

"Symbol_Hash"
"Symbol_Handle"
注:剧本只是展示了对当前问题的可能解决方案的想法。
 
getch:

注意:剧本只是对手头任务的可能解决方案的想法的演示。

编程经验很好地展示了人类头脑的聪明才智和工具的功能不足......万岁,唉......。
 
Shu:

工具的功能缺乏......万岁,唉......。
让我们希望在MQL5中,我们不会被迫做出这种扭曲。

P.S. 另一方面--过程是重要的!
 

剧本中没有变态的内容。它有点不合常规,就是这样。

思路:该脚本从 "市场观察 "窗口打开每个交易工具的图表窗口,在上面运行自己,然后关闭窗口。它使用自己创建的全局变量进行自我调节(并在操作结束后删除)。这就是全部。


如果满足以下条件,该脚本在99%的情况下会起作用。

- DLL将被允许使用,不需要人工确认。

- 暂停变量的值将被设置为大于1000(技术暂停,取决于计算机的性能和互联网连接。这些特性越好,你就越能设置暂停值,分别减少脚本的运行时间)。

- 在运行脚本之前,删除全局变量(F3)"Symbol_Hash "和 "Symbol_Handle"(如果之前脚本运行失败,可能会出现这种情况)。


完成脚本后,终端看起来和启动前一样。所有的符号数据都在Symbols.txt文件中。