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

 
getch:

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

当然,剧本本身并无变态之处--我说得并不完全正确。变态是在访问列表的方式上。但你应该同意,对工具列表的访问应该通过终端实现,而不是通过窗口。而且这个脚本非常有用,特别是对于像我这样没有使用Windows工作经验的初学者来说。再次感谢你,它有很多有用的解决方案,这将花费我大量的时间来学习。
 

你为什么要编造这样一个变态的...写一个外部DLL比较容易,其中所需的数据是从MarketWatch对象中提取的。你不能用MQL4来做,因为需要内存分配程序

 
在MQL4中,不需要写DLL就可以拉出这些数据,这是现实的(经过测试)。但上述方法的用途更广。因为你可以很容易和方便地将大量的数据塞进WriteSymbol()函数中...
 
 
你的视频不工作...
尽管从原则上讲,已经很清楚这个剧本将如何运作。但这显然是一个不可靠的解决方案,而且可能会导致终端的频繁挂起。它经常挂起,因为它是...

getch:
在MQL4中,你可以(尝试)获得这些数据,而不需要写一个DLL。但上述方法更具有普遍性。你可以轻松方便地把大量的数据塞进WriteSymbol()函数中...

我想知道如何把它弄出来?用什么命令?如果这样的事情真的有可能,我将非常感激......。尽管我严重怀疑这是否可能......


我自己也从Market Watch中提取过数据,但只是在C++中。 要做到这一点,你首先要创建一个新的进程(OpenProcess),在其中保留内存(VirtualAllocEx),将所需的数据结构 放在那里,并从该对象中保存必要的信息。然后我们从那里读取必要的数据。 但你不能只通过信息传递获得信息,我试过了。该对象是ListView类型的。

 

由于我不知道的原因,论坛无法正确显示视频。因此,我把它作为一个ZIP-archive附件。


我没有遇到过这个脚本的不可靠或无法操作的情况。

附加的文件:
symbols.zip  1630 kb
 

更简单(只有一个全局变量)和更可靠(没有哈希函数)的脚本版本。

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

我可以用什么命令将一个符号 "重置 "到一个已经打开的图表 上? 也就是说,将当前图表切换到我想要的符号上?

 

这里做了 ZG_所有报价1-80924!!!

谢谢 getch 的伟大想法和思想的飞跃!!。

很想知道英雄的名字 :-)

这个脚本是获得经纪人报价的最后途径。

一个更艰难的方法是亲自到你的经纪人那里用特殊工具敲出报价。

 
用铁杆,是吗?