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

 
KimIV:
VBAG です。
最近、自分自身でこの問題を解決しました。
DCがペアの名前に独自のものを追加する場合は機能しません。例えば、"m"、"!"、"."、"_"などです。
はい、もちろん、私は研究目的でそれをやったが、あなたは根本的な何かをしたい場合 - すべての文字のASCIIの組み合わせの数をスタンプして検索するには、楽器の名前(8-10)の文字の最大合理的な数を言う。このようなスクリプトは、おそらく実行に数時間かかるだろうが、自動で保証される。


Zhunkoへ
-そういえば、もちろん、あなたのコードからヒントを得ました。数日間、あなたのローダーで作業しました。ありがとうございます。
 
KimIV:
VBAG です。

最近、自分自身でこの問題を解決しました。
DCがペアの名前に独自のものを追加する場合は機能しません。例えば、"m"、"!"、"."、"_"などです。
そのようなFCは少なく、使用するキャラクターも少ない。予見することが可能です。
モネラインペアの時もそうでしたね。そこで「ミニ」「プロ」です。
Liteにも糞があると思う。
つまり、DTによって楽器をグループ分けすることができるのです。
アルパリ、フォレックスベスト、マネーレーン、ノースファイナンス、NWブローカーに興味がありました。
これらは、商品数が最大の証券会社です。そして、為替指数の算出のための相場を出すのに必要なものでした。
そのためのスクリプトが「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. 一方、-プロセスは重要です!
 

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

アイデア: "Market Watch "ウィンドウから各取引商品のチャートウィンドウを開き、その上で自己実行し、ウィンドウを閉じるスクリプトです。自ら作成したグローバル変数(動作終了時に削除)を用いて自己制御を行う。以上です。


このスクリプトは、以下の条件を満たせば、99%動作します。

- DLLは、手動で確認することなく使用を許可されます。

- Pause変数の値は1000より大きく設定されます(技術的な一時停止は、コンピューターの性能やインターネット接続に依存します)。これらの特性が優れていればいるほど、Pauseの値を小さく設定でき、それぞれスクリプトの実行時間を短くすることができます)。

- グローバル変数(F3) "Symbol_Hash" と "Symbol_Handle" を削除してからスクリプトを実行してください(以前にスクリプトの実行に失敗したことがある場合にも有効です)。


スクリプトを終了すると、ターミナルは起動前と同じ状態になります。すべてのシンボルデータは、Symbols.txtファイルにあります。