
ギャップ ー 収入戦略か50/50か?
概論
D1時間枠でギャップの有価証券市場をチェックします。市場はギャップに向かってどのくらいの頻度で移動し続けているでしょうか?もしくはギャップの後に市場が展開しているか?これらの質問に、この記事でお答えし、カスタムグラフィックスCGraphicを使用して結果を視覚化します。 通貨ペアのファイルの選択は、関数GetOpenFileNameのDLLシステムを使用して行われます。
どの市場を選ぶか?
始めから私は専らD1時間枠のギャップに関心があると申し上げておきます。
明らかに、ギャップは外国為替のシンボルではなく、有価証券上に沢山あります。有価証券は朝から夕方まで取引され、夜間は取引されないからかもしれません。具体的には、ギャップを探す中で特に私は株式に興味があります。株式にはかなり深い歴史があります。しかし、先物はあまり適していません。なぜなら、しばしば3か月または6か月の期間を持っているからです。これは、D1時間枠の歴史を研究するには十分ではありません。
現在のシンボルとサーバー上にD1時間枠のバーの数がいくつあるかを調べるには、 "TestLoadHistory.mq5"スクリプト(ヘルプページの"データへのアクセスの構成")を使用して行うことができます。"ABBV"シンボル上のD1時間枠のバーの数をチェックする例。
図 1. シンボル "ABBV"
手順:
- まず、ヘルプからスクリプトを保存します。このために、新しいスクリプトがMetaEditor 5のコードエディタで作成されます(ヘルプ:スクリプトの作成")。スクリプトの名前はすぐに"TestLoadHistory.mq5"に与えた方が良いです。ここでヘルプからスクリプトのテキストを選択し、コピーしたテキストをスクリプト "TestLoadHistory.mq5"に貼り付ける必要があります(この時ヘルプのテキストは、スクリプト内のすべてのテキストを置き換える必要があります)。
- 出来上がったスクリプトをコンパイルします(コンパイル後、ナビゲータウィンドウのターミナルにスクリプトが表示されます)。
- MetaTrader 5ターミナルでスクリプトを実行します。シンボル"ABBV"のチェックが始まったら、グラフを作成する必要があります。シンボル"ABBV"のグラフを開き、D1時間枠に変更します。『ナビゲーター』ウィンドウからスクリプトを取り出し、オープンチャートにシンボル "ABBV"をいれます。スクリプトのパラメータで、シンボルの名前を "ABBV"にし、D1時間枠を選択して日付を1970年のものに設定します。
図2. スクリプト "TestLoadHistory.mq5"の実行
スクリプトの結果:
TestLoadHistory (ABBV,D1) Start loadABBV,Dailyfrom1970.03.16 00:00:00 TestLoadHistory (ABBV,D1) Loaded OK TestLoadHistory (ABBV,D1) First date 2015.09.18 00:00:00 - 758 bars
- 履歴は2015年に始まり、履歴内には758のD1バーがあります。これは分析には十分な数です。
シンボルグループの取り扱い
何らかの基準を分析し計算するには、1つのシンボルグループのシンボルを比較する必要があります。原則として、MetaTrader 5端末のシンボルは、既にグループに分けられています(マーケットウォッチウィンドウとシンボル、またはショートカットキー "Ctrl" + "U"で右クリック)。
図3.NASDAQ(SnP100)グループのシンボル
この図では『NASDAQ(SnP100)』グループを表示しています。このグループには、"ABBV"が含まれています。シンボルのグループを扱う最も便利な方法は、そのグループのシンボル上でスクリプトが実行されるようにすることです。このように、各グループを反復するためには、各グループから1つのシンボルのグラフを手動で開いてから、動作するグラフで"Symbols on symbol tree.mq5"を起動する必要があります。このスクリプトは、グループのすべてのシンボル(シンボルの名前)を別のファイルにまとめます。
スクリプト"Symbols on symbol tree.mq5"は、次のアルゴリズムに従って動作します。文字ツリー内のパスを取得する"SYMBOL_PATHシンボルツリーの中でパスを取得し(この例では"NASDAQ(SnP100)"グループになります)、このグループからすべてのシンボルを選択し、選択したシンボルをファイルに保存します。ファイル名はシンボルツリーのパスで、 "/"と"\"の文字はすべて "_"で置き換えられます(置換はスクリプトによって自動的に実行され、ファイル名も自動的に取得されます)。NASDAQ(SnP100)シンボルグループのシンボルを置き換えた後、 "Stock Markets_USA_NYSE_NASDAQ_(SnP100)_.txt"という名前のファイルを受け取ります。
各グループを別々のファイルに配置するのはなぜか?続いて、すべてのシンボルを列挙することなく、グループファイルからシンボルの名前を読み込み、ギャップの方向性を調べることができます。一般に、"Symbols on symbol tree.mq5"スクリプトは、特定のシンボルグループから手動でシンボルを選択するルーチンを削除します。
スクリプト "Symbols on symbol tree.mq5"
このスクリプトの動作に焦点を当てます。
注意:「エキスパート」タブの"Everything is fine. There are no errorsというテキストの出力のみ、スクリプトがエラーなしで動作し、シンボルを含む結果ファイルを今後の作業に使用できることが保証されています。
ファイル操作のコードを短縮するにはCFileTxtクラスが接続し、m_file_txt(CFileTxtオブジェクトクラス)がテストファイルを使用して動作します。スクリプトは7つのステップを行います。
//+------------------------------------------------------------------+ //| Symbols on symbol tree.mq5 | //| Copyright © 2018, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" //--- #include <Files\FileTxt.mqh> CFileTxt m_file_txt; // file txt object //--- string m_file_name=""; // File name //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- STEP 1 string current_path=""; if(!SymbolInfoString(Symbol(),SYMBOL_PATH,current_path)) { Print("ERROR: SYMBOL_PATH"); return; } //--- STEP 2 string sep_="\\"; // A separator as a character ushort u_sep_; // The code of the separator character string result_[]; // An array to get strings //--- Get the separator code u_sep_=StringGetCharacter(sep_,0); //--- Split the string to substrings int k_=StringSplit(current_path,u_sep_,result_); //--- STEP 3 //--- Now output all obtained strings if(k_>0) { current_path=""; for(int i=0;i<k_-1;i++) current_path=current_path+result_[i]+sep_; } //--- STEP 4 string symbols_array[]; int symbols_total=SymbolsTotal(false); for(int i=0;i<symbols_total;i++) { string symbol_name=SymbolName(i,false); string symbol_path=""; if(!SymbolInfoString(symbol_name,SYMBOL_PATH,symbol_path)) continue; if(StringFind(symbol_path,current_path,0)==-1) continue; int size=ArraySize(symbols_array); ArrayResize(symbols_array,size+1,10); symbols_array[size]=symbol_name; } //--- STEP 5 int size=ArraySize(symbols_array); if(size==0) { PrintFormat("ERROR: On path \"%s\" %d symbols",current_path,size); return; } PrintFormat("On path \"%s\" %d symbols",current_path,size); //--- STEP 6 m_file_name=current_path; StringReplace(m_file_name,"\\","_"); StringReplace(m_file_name,"/","_"); if(m_file_txt.Open("5220\\"+m_file_name+".txt",FILE_WRITE|FILE_COMMON)==INVALID_HANDLE) { PrintFormat("ERROR: \"%s\" file in the Data Folder Common folder is not created",m_file_name); return; } //--- STEP 7 for(int i=0;i<size;i++) m_file_txt.WriteString(symbols_array[i]+"\r\n"); m_file_txt.Close(); Print("Everything is fine. There are no errors"); //--- } //+------------------------------------------------------------------+
スクリプトのアルゴリズムの動作。
- ステップ1:現在のシンボルに対して、シンボルツリー内でSYMBOL_PATHを判別する。
- ステップ2:取得したパスを、セパレータ"\"を含む部分文字列に分ける。
- STEP 3:最後の部分文字列はシンボル名なので、現在のパスを再構築する。
- ステップ4:使用可能なすべてシンボル上を回り、シンボルツリーのシンボルパスが現在のパスと一致する場合は、シンボル名を選択して検出されたシンボルの配列に追加する。
- ステップ5:見つかったシンボルの配列のサイズを確認する。
- ステップ6:ファイル名を作成する(シンボルの名前から"/"と"\"を削除してファイルを作成する)。
- STEP 7:見つかったシンボルの配列をファイルに書き込み、ファイルを閉じる。
STEP 6に注意してください。ファイルは共有ファイルディレクトリの "5220"フォルダに作成されます(FILE_COMMONフラグが使用されます)。
また、スクリプトがエラーなく実行されたかを確認する必要があります。『エキスパート』タブに、『Everything is fine. There are no errors. Create file』というメッセージが表示されるはずです。そして次の行にファイルの名前が表示されます。この名前をコピーして『Getting gap statistics ...』スクリプトに貼り付けることができます。以下はファイルの作成に成功した例になります。
On path "Stock Markets\USA\NYSE/NASDAQ(SnP100)\" 100 symbols
Everything is fine. There are no errors. Create file:
Stock Markets_USA_NYSE_NASDAQ(SnP100)_
その結果に、各行に1シンボルがあるファイル(この例ではStock Markets_USA_NYSE_NASDAQ(SnP100)_)を取得します。このファイルの最初の5行は次のとおりです。
AAPL ABBV ABT ACN AGN
データを収集する
OHLCの履歴データをシンボルで取得し、統計を計算することは、メインスクリプトの『Getting gap statistics.mq5』が行います。シンボルごとにSGapStatistics構造で満たされます。
struct SGapStatistics { string name; // symbol name int d1_total; // total number of D1 bars int gap_total; // total number of gaps int gap_confirmed; // gap was confirmed };
name —シンボル名
d1_total —シンボルごとのD1バーの数
gap_total —検出されたギャップの数
gap_confirmed —確認されたギャップの数(例えば、その日にギャップが上に開き、下向きに閉じた場合)
シンボルごとにOHLC価格を取得するには、最も適切な関数は『CopyRates』です。必要な時間間隔の最初と最後の日付に従って、3番目のフォームが使用されます。開始時間は、取引サーバTimeTradeServerの推定現在時間プラス1日で、最終日は1970年1月1日です。
エラーの処理方法(リクエストの結果として「-1」が返される)、またはリクエストの結果としてすべてのデータが戻されない場合(例えば、すべてのデータがサーバーからまだダウンロードされていないなど)を判別する問題が残されます。簡単な方法(リクエスト - 一時停止N - 1秒 - 再リクエスト)または正しい方法を実行することができます。正しい方法は、『TestLoadHistory.mq5』スクリプト(ヘルプページの『データへのアクセスの構成』)の完成に基づいています。
スクリプトクエリの結果を以下に示します。
switch(res) { case -1 : Print("不明なシンボル",InpLoadedSymbol); break; case -2 : Print("リクエストされたバーがグラフ上に表示できるものより多い"); break; case -3 : Print("ユーザーによって実行が中断された"); break; case -4 : Print("インジケータは自分のデータを読み込まない"); break; case -5 : Print("ダウンロードに失敗しました"); break; case 0 : Print("全てのデータがダウンロードされました"); break; case 1 : Print("タイムシリーズ内にすでにある利用可能なデータで十分です"); break; case 2 : Print("タイムシリーズは端末のデータから構成されます"); break; default : Print("実行結果が定義されていません"); }
— つまり実行結果がゼロ以下で、これはエラーです。次の動作スキームは、シンボルでファイルを開き、シンボルごとにをリクエストを行います。否定的な結果を総合します。少なくとも1つの否定結果が存在する場合は、リクエスト時の問題に関するメッセージを表示します。この場合、ユーザーはスクリプトを再度実行する必要があります(おそらく、履歴は既にロードされているか、その時点で作成されている可能性があります)。エラーがなければ、OHLCデータを取得し、ギャップの数を数えます。
スクリプト『Getting gap statistics.mq5』
このスクリプトは、端末の『エキスパート』タブのギャップに関する統計情報を表示します。以下では、『ギャップの確認』という言葉が用いらます。確認されたギャップとは、毎日のバーがギャップの方向に閉じられていることを意味し、逆方向のギャップではありません。
図4.確認されたギャップと確認されなかったギャップ
それは1つの入力パラメータ『File name』ー補助スクリプト『Symbols on symbol tree.mq5』でコンパイルされたファイル名を持っています(このファイルはディレクトリ5220のパブリックフォルダに作成されます)。ファイル名は、ディレクトリや拡張子を指定せずに入力します。たとえば、次のようになります。
図5. 『Getting gap statistics』スクリプトの入力パラメータ
このように、統計を取得するには、いくつかの手順を実行する必要があります。
- ギャップの計算が実行されるシンボルのグループで決定されます。
- 選択したグループから、任意のシンボルを選択し、選択したシンボルのグラフを開きます。
- 開いているグラフにスクリプト『Symbols on symbol tree.mq5』を配置します。その結果、選択したシンボルグループのすべてのシンボルを含むファイルが作成されます。スクリプトの実行中にエラーがないことを確認する必要があります。『エキスパート』タブで、『Everything is fine. There are no errors』というメッセージが表示されます。
- チャート上にスクリプト『Getting gap statistics.mq5』を配置する
その結果、『エキスパート』タブにギャップの数に関する統計が表示されます。最初の5つのシンボルの表示は以下のようになります。
[name] [d1_total] [gap_total] [gap_confirmed] [ 0] "AAPL" 7238 3948 1640 [ 1] "ABBV" 759 744 364 [ 2] "ABT" 762 734 374 [ 3] "ACN" 759 746 388 [ 4] "AGN" 761 754 385
それではCGraphicを使ってみよう
『エキスパート』タブ内のすべての情報を表示するのはあまり有益ではないので、スクリプト 『Getting gap statistics CGraphic.mq5』をカスタムグラフCGraphicを表示するために使用します。スクリプトに入力パラメータがあります。
- "File name" ー シンボルを含むファイルの名前(このファイルは、"Symbols on symbol tree.mq5"スクリプトを使用して事前に作成する必要があります)
- "Log CheckLoadHistory" ー 『エキスパート』タブのシンボルによる履歴のロード結果の表示/非表示
- "Log Statistics" ー 『エキスパート』タブにギャップ統計を表示/非表示
動作の結果は、確認されたギャップの数(パーセント)のグラフです。
図6. スクリプト "Get gap statistics CGraphic.mq5"の動作の結果
図では数字が付されています。
- "1" - 確認されたギャップの線の名前
- "2" - 縮尺率
- "3" - シンボルを取得したファイルの名前
グラフは、ギャップの値が50%プラスマイナス6%のレベルで変動していることを示しています(最大6%ですが、42%未満の3つのドロップがあります)。ギャップが42%未満であることを確認したこれらの3つのドロップは、確率が58%の3つのシンボルがギャップに対する1日バーがあることを意味します。
ここで別のシンボルグループをチェックすることができます ー Stock Markets\\RussiaMICEX20。Stock Markets\RussiaMICEX20グループの為のスクリプトの結果 "Getting gap statistics CGraphic.mq5"です。
図7. Stock Markets\RussiaMICEX20グループのギャップ統計
2つの異常なドロップがあります。しかし、現在のバージョンでは、画像とシンボルをリンクすることはできません。したがって、スクリプトを少し改善する必要があります。
スクリプト "Getting gap statistics CGraphic 2.mq5
変更点:バージョン2.0では、『エキスパート』タブで確認されたギャップの統計がパーセンテージで表示されます。このおかげで、Stock Markets\RussiaMICEX20グループの為の"Log Statistics"の設定を有効にしたときに、簡単に2つの異常シンボルが見つけることができます。
[name] [d1_total] [gap_total] [gap_confirmed] [confirmed_per] *** [14] "NVTK.MM" 757 737 347 47.08 [15] "PIKK.MM" 886 822 282 34.31 [16] "ROSN.MM" 763 746 360 48.26 [17] "RSTI.MM" 775 753 357 47.41 [18] "RTKM.MM" 753 723 324 44.81 [19] "SBER.MM" 762 754 400 53.05 [20] "SBER_p.MM" 762 748 366 48.93 [21] "SNGS.MM" 762 733 360 49.11 [22] "TATN.MM" 765 754 370 49.07 [23] "SNGS_p.MM" 751 708 305 43.08 [24] "URKA.MM" 765 706 269 38.10 [25] "VTBR.MM" 763 743 351 47.24 [26] "RASP.MM" 778 756 354 46.83
『PIKK.MM』シンボルの34%、『URKA.MM』の38%の確認されたギャップとは、これらのシンボル上で66%と62%の確率で、毎日のバーがギャップと反対に閉じていることを意味しています。
ファイル内のシンボル(ツール)の数を制限する
さまざまなシンボルグループを分析すると、1000以上のシンボルを持つグループが見つかりました。このような大きい量を扱うことは非常に不便であることが判明しました。このような膨大なシンボル数が『Market Watch』ウィンドウにかなり長く追加され、最終的なチャートは判読不能になります。
したがって、スクリプト"Symbols on symbol tree.mq5"をモデルにして、"Symbols on symbol tree 2.mq5"バージョンを書くことにしました。バージョン2では、ファイルの最大文字数は200以下で、ファイル名に部品番号が追加されます。たとえば、 "Stock Markets\USA\NYSE/NASDAQ(SnP100)\"のシンボルグループには100個のシンボルがあるとします。つまり、1つの部分のみが存在し、ファイル名は "Stock Markets_USA_NYSE_NASDAQ(SnP100)_part_0.txt"となります。
システムダイアログ "ファイルを開く"を使用してファイルを選択する
この記事のスクリプトを数日間動作させた後、スクリプト"Getting gap statistics CGraphic 2.mq5"の入力パラメータにファイルの名前を入力することがとても不便であることがわかりました。いくつかの操作を行う必要があります。すべての端末の共有フォルダを開き、ファイルの名前をコピーして、コピーしたファイル名をスクリプトに貼り付けます。
したがって、ファイル選択はGetOpenFileNameDLL関数を使用して行います。これを行うために、"GetOpenFileNameW.mqh"ファイルを紐づけます。このファイルから"Openfilename関数は、選択された* .txtファイルにフルパスが返されます。たとえば、 "C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\Common\Files\5220\Stock Markets_USA_NYSE_NASDAQ(SnP100)_part_0.txt"のように長いものになります。ここから、パスファイル名を区別する必要があります。
スクリプトGetting gap statistics CGraphic 3.mq5は、DLL関数を使用するGetOpenFileNameDLL関数を使用します。
図8. "Getting gap statistics CGraphic 3.mq5"スクリプトの実行時にDLLの許可をリクエストします。
これは『ファイルを開く』システムダイアログを使用してファイルを選択します。
図9. ファイル選択
その他の有価証券の統計
ここで、他のシンボルグループのギャップに関する統計を収集することができます。
Stock Markets\USA\NYSE\NASDAQ(ETFs)グループ
グループシンボルは7つのファイルに分割されます。
図10. Stock Markets\USA\NYSE\NASDAQ(ETFs)グループ、パート0
図11. Stock Markets\USA\NYSE\NASDAQ(ETFs)グループ、パート1
図12. Stock Markets\USA\NYSE\NASDAQ(ETFs)グループ、パート2
図13. Stock Markets\USA\NYSE\NASDAQ(ETFs)グループ、パート3
図14. Stock Markets\USA\NYSE\NASDAQ(ETFs)グループ、パート4
図15. Stock Markets\USA\NYSE\NASDAQ(ETFs)グループ、パート5
図16. Stock Markets\USA\NYSE\NASDAQ(ETFs)グループ、パート6
"Stock Markets\United Kngdom\LSE Intグループ(ADR/GDR)\"
図17. "Stock Markets\United Kngdom\LSE Intグループ(ADR/GDR)\"
"Stock Markets\United Kngdom\LSE (FTSE350)\"グループ
このグループには350のシンボルが含まれているため、シンボルは2つのファイルに分割されています。
図18. "Stock Markets\United Kngdom\LSE (FTSE350)\"グループ、パート0
図19. "Stock Markets\United Kngdom\LSE (FTSE350)\"グループ、パート1
"Stock Markets\Germany\XETRA (IBIS)\Dax100\"グループ
図20. "Stock Markets\Germany\XETRA (IBIS)\Dax100\"グループ
"Stock Markets\France\Eurnext (CAC40)\"グループ
図21. "Stock Markets\France\Eurnext (CAC40)\"グループ
まとめ
いくつかの証券市場の調査で、ギャップの後に継続的な動きと逆転の可能性は50%に近く、すなわちギャップが起こるのは50/50であることがわかりました。しかし同時に、確率が65%を大幅に上回る有価証券が存在します(これは継続確率と逆転の確率のいずれかになります)。そして、これらの証券の中には、ギャップで取引を行うことができます。
記事に記事内で説明したスクリプトのアーカイブを添付します。
スクリプト名 | 説明 |
---|---|
Symbols on symbol tree.mq5 | 動作スクリプトシンボルツリー内のグループを定義し、このグループのすべてのシンボルを、ファイル、共有フォルダ、5220ディレクトリに保存します。 |
Symbols on symbol tree 2.mq5 | 動作スクリプトこれは、シンボルツリー内のグループを定義し、このグループのすべてのシンボルをファイル、共有フォルダ、ディレクトリ5220に保存します。シンボルのグループを200シンボルごとにファイルに分割します。 |
Getting gap statistics.mq5 | スクリプトは動作スクリプトを作成したファイルからシンボルを読み込み、ギャップ統計を『エキスパート』タブに表示します |
Getting gap statistics CGraphic.mq5 | スクリプトは、動作スクリプトを作成したファイルからシンボルを読み込み、カスタムグラフィックスCGraphicを使用してギャップ統計をグラフとして表示します |
Getting gap statistics CGraphic 2.mq5 | スクリプトは、動作スクリプトを作成したファイルからシンボルを読み込み、カスタムグラフィックスCGraphicを使用してギャップ統計をグラフとして表示します。『エキスパート』タブの統計情報もパーセントで表示されます。 |
Getting gap statistics CGraphic 3.mq5 | スクリプトは、動作スクリプトを作成したファイルからシンボルを読み込み、カスタムグラフィックスCGraphicを使用してギャップ統計をグラフとして表示します。 『エキスパート』タブの統計情報もパーセントで表示されます。シンボルを含むファイルを選択するには、システムダイアログの『ファイルを開く』を使用します |
GetOpenFileNameW.mqh | システムダイアログの操作ー『ファイルを開く』を含むファイル |
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/5220





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索