Market Watchウィンドウで選択されているすべての金融商品をスクリプトでプログラム的に確認するにはどうしたらよいでしょうか。 - ページ 3

 
getch:

脚本に曲解はない。ちょっと型破りなんですよ、それ。

もちろん脚本自体に曲解はないのですが......正確には言ってませんでしたね。曲解はリストへのアクセスの仕方にある。しかし、ツールのリストへのアクセスは、ウィンドウズではなく、ターミナルによって実現されるべきであることに同意してください。そして、このスクリプトは、特に私のようなWindowsを扱った経験のない初心者にとって、とても便利なものです。また、独学では時間がかかるような有用な解決策がたくさん載っていて、ありがとうございました。
 

なぜそんな曲解をする必要があったのか...。必要なデータはMarketWatchオブジェクトから取得し、外部DLLを作成する方が簡単です。MQL4ではメモリ確保の 手順が必要なため、できません。

 
MQL4では、DLLを書かずにこのデータを引き出すことが現実的(テスト済み)です。しかし、上記の方法は、より普遍的なものです。WriteSymbol()関数に多くのデータを簡単に便利に詰め込むことができるから...。
 
 
動画が動かない...
とはいえ、原理的には、このスクリプトがどのように機能するかは、すでに明らかになっています。しかし、これは明らかに信頼性の低い解決策であり、おそらく端末のハングアップを頻繁に引き起こすでしょう。このままでも十分ハングアップするのですが...

getch:
MQL4では、DLLを書かずにこれらのデータを取得することができる(つもり)です。しかし、上記の方法は、より普遍的なものです。WriteSymbol()関数に大量のデータを簡単に、便利に突っ込める...。

不思議なんですが、これってどうやったら引き出せるんですか?どんな命令で?そんなことが本当に可能なら、とてもありがたいのですが...。マジでありえないと思うけれども...


私自身、Market Watchからデータを取り出したことがありますが、C++のみです。 そのためには、まず新しいプロセスを作り(OpenProcess)、そこにメモリを確保し(VirtualAllocEx)、必要なデータ構造を そこに配置し、オブジェクトから必要な情報をそこに保存することになります。そして、そこから必要なデータを読み出していくのです。 しかし、メッセージだけでは情報は得られません、試してみました。オブジェクトは ListView 型である。

 

理由は不明ですが、フォーラムでは動画を正しく表示することができません。そのため、ZIP-archiveとして添付しました。


このスクリプトの信頼性の低さ、操作性の悪さには遭遇していない。

ファイル:
symbols.zip  1630 kb
 

よりシンプル(グローバル変数が 1つだけ)で信頼性の高い(ハッシュ関数がない)バージョンのスクリプトです。

// Запись в файл названий и торговых условий всех символов из окна "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_All Quotings 1-80924を 作りました!!!!

getch さん、素晴らしいアイデアと飛翔をありがとうございました!!!!

主人公の名前をぜひ教えてください :-)

このスクリプトは、ブローカーから見積もりを取る最後の方法です。

さらに厳しい方法は、専用のツールで見積もりをたたき出し、直接ブローカーを訪ねることです。

 
アイアンで、ですか?