正確にチャートを同期させる00-TimeSync_v101.mq4を script 化する。

ジム・ジャロース
こんにちは。

00-timesync_v101_modbyfai.mq4ですが、たまったタスクが悪さをして不可解な挙動が多いため自分的には使えない感じですので、scriptにしてドラックアンドドロップした時に1度だけ同期を実行するように改造しようと試みたのですが、APIの部分が理解できず、ペンディング状態です。
もし、ご無理でなければ、scriptを作っていただけないでしょうか。n(_ _)n
興味のないネタでしたら華麗にスルーしていただいて結構ですが。(;^_^A

これは・・・確かにAPIをよく知らないと出来ないので、こちらに用意しました。


・インジケータとスクリプトでは、実行時のスレッドが異なる。
インジケータはウィンドウを表示しているスレッドで動いているので、SetFocus()が可能だが、スクリプトは別のスレッドなので、SetFocus()できず、代わりに SetForegroundWindow()を使う必要がある。(SetForegroundWindowでも、見た目はアクティブにならないが、キーイベントだけは送れるようになる。)


スクリプトを実行するウィンドウは必ずしもアクティブとは限らない。
ナビゲーターウィンドウからスクリプトを非アクティブなウィンドウにドロップすることもあり得るので、GetTopWindow()でアクティブなウィンドウを取得してから、GetWindow(hWnd,2)で次のウィンドウを取得する必要がある。


・・・という点に注意して改造する必要がありました。
実行時の確認ダイアログが煩わしい人は、
#property show_inputs
の一行を削除してください。



ちなみに、AutoHotkey の Accela.ahk を使用していると正常動作しません。(数字入力が被ってしまうため..)

1::
   if CheckFN()==0
     PostMessage, 0x111,33137,0  ;Period M1
   else
     Send 1
  return

↑Accela.ahk で、1から9の数字にショートカットを割り当てている部分をすべて削除するか、

#1::
   if CheckFN()==0
     PostMessage, 0x111,33137,0  ;Period M1
   else
     Send 1
  return

↑ # を加えて「Win + 1」に割り当てる等で回避してください。

MT4のチャート上に画像を表示する(?)


前回得た知識は、Webdings フォントの g が四角であるというコトでした。
この四角を最小化して隙間なく埋めることができれば、、、チャート上に画像を表示することが出来るかも知れません。
・・・という訳で早速試してみました。


下準備として、JPEG画像をPPM (ASCII P3)形式に変換しておきます。
画像がRGB値のテキストデータになるので、MQL4のスクリプトでも簡単に扱えます。
変換ソフトには、IrfanView32を使います。

続きを読む

直近の値幅とスプレッドとの比が大きな銘柄を探す。

以前は、メジャーなドルストレートだけ見てればいいじゃん!スプレッドも小さいし・・・。
なんて思っていたのだけれど、CHFがEURと固定的相場になって、円が政治的にも経済的にも迷走し始め、ドルストレートのボラティリティが残念なことになってくると、マイナー通貨を含むユーロクロスや、今まで見ていなかった銘柄にも注目せざるを得ないと思ってます。
CFDも含めて120銘柄もある業者では、1銘柄ずつ見てゆくのも面倒なので、直近の値幅とスプレッドの比が大きな銘柄を見つけやすくなるようなインジケータをこちらに作成しました。

気配値表示しているすべての銘柄に対して、直近60本の中の最高値-最安値 をスプレッドで割って、スプレッドに対する変動倍率をランキング表示させています。


起動時は、全銘柄の2048本分のヒストリカルデータを取得しに行ってしまうので、若干、重くなります。



フォントサイズ等を調整すれば小さく表示できます。
変動するスプレッドの代表値をどう採るか?や、値幅の算出方法も検討の余地がありますが、自作派の方の参考になればと思います。
(ブローカーによっては異常にスプレッドを狭く見せている場合もあるので、モニョモニョ・・


個人的には、

・OBJ_LABEL でテキストを複数行 縦に並べるときは、フォントサイズの1.72倍だけ下にずらせば良い
 (横方向は、適当なフォントサイズでデザインして、フォントサイズに比例してずらす。厳密な対応は無理。)


・OBJ_LABEL の重なりの前後関係は、オブジェクト名で決まる(=命名法を工夫すると背景用に文字を置ける)


・文字部分に背景を付けるときは、Webdingsフォントの g(=■) で塗りつぶすのが良い
 (本記事の上図が背景有り、下図が背景無しです。背景があると読みやすくなります。)

という知見が得られたので十分です。。

ZigZag指標に相場の周期性を夢見る・・

時系列データに周期性があるのかどうか?を調べる方法としては、コレログラム、フーリエ変換、ARモデル・・・等を使うのが一般的のようです。ただ、投機市場に見られる周期性は、私の想像では、連続する2〜3つの山が近い周期になるだけ(3〜4つ目の山で周期が崩れる)なので、長期のデータから固定長の周期性を見つけ出すのは困難なのでは?と思ってたりします。
(一時的に周期性が存在しても、投機筋が他者を出し抜く過程で周期性が失われてしまう・・・



なので、相場に周期性は存在しないという前提でいろいろ考えているのですが、せっかく、ヒストグラム表示インジケータを作ったので、今日はZigZagインジケータの周期分布を調べてみます。
ZigZag.mq4 を改造し、山の頂点間の期間データ(top.csv)、谷底間の期間データ(btm.csv)、一辺の期間データ(full.csv)を保存するようにしたものが、ZigZag_output.mq4 です。
csvデータをそのまま表示させるのが、CSVView.mq4 です。(一行に一個しか数字が入っていないので、CSVとは言えないのはさておき...
Hist-NF-Meter.mq4 は、top.csv ファイルを読み込んでヒストグラム表示します。

↑山頂と山頂の期間(Top to Top) のデータを生で見るとランダムに見えますが(2段目)、ヒストグラムでは20〜25期間にピークがあることが分かります。



ZigZagインジケータを眺めていると、そこに周期性らしきものを感じるのは、錯覚ではなく、実際に特定の周期付近での頻度が多いからだったのですね。。。

続きを読む

ヒストグラムを描く

統計学の基本は、データを観察することにあるのであ〜る。

‥‥という訳で、ヒストグラムを表示させるインジケータをこちらに作りました。
階級幅の自動決定には、フリードマン=ダイアコニスの選択を採用しています。(スタージェスの公式はサンプル数が多いと当てはまらないらしい..
階級幅を自分で指定したい場合は、ClassWidth で設定できます。
チャートをかなり縮小して表示させている人向けに、HistWidth で、ヒストグラム一本の柱の幅を何本の Bar で表示させるか?も指定できるようにしました。
平均や分散といった、基本統計量を計算する機能はありません。(平均よりも中央値、分散よりも Q3-Q1幅の方が好きなので...。必要な人は自分で改造してくださいっ



↑過去何本目から何本分のデータを対象とするか?を指定すれば、異なる期間のデータを比較できます。
二つのグラフで自動計算した階級幅が異なる場合は直接指定してください。
グラフの右側を揃えるために、FixedMinimum を同一の値(0)に設定してください。
現在の値は、赤塗りされた位置で分かります。


上のグラフは、EURUSD の週足で、直近の過去1年(下段)と、その前の一年(上段)の高値-安値 の幅の分布を示しています。
中央値でみると、120pips も振れ幅が減っていることがわかります。。。
これでは、ボラティリティの低下に嘆くトレーダーが増えているのも仕方ないですね。。^^;

MetaTrader4 から別のエディタを選択して起動する。

Notepad++ de MQL4の記事を読んで、『A better editor for MQL4 using SciTE!』を導入してみたら、かなり便利だった...のですが、微妙に欠点があって、やはり純正 MetaEditor も手放せなかったりします。
そこで、MetaTrader4 から、両方のエディタを選んで起動できるようにしてみました。
動作イメージは・・・

↑MT4から起動すると
↓選択ダイアログがでて、「はい」 ならMetaEditor 、「いいえ」 なら SciTE が起動します。


手順は以下の通りです。
(1) MetaEditor.exe -> _MetaEditor.exe にリネームしておく。
(2) 以下の6行の MetaEditor.ahk を作成し、右クリ&コンパイルして MetaEditor.exe を作成して配置する。(要 AutoHotkey)

SetWorkingDir %A_ScriptDir%
MsgBox, 4,, Open MetaEditor ?
IfMsgBox Yes
    Run , %A_ScriptDir%\\_MetaEditor.exe "%1%"
else
    Run , "C:\\MT4\\scite-mql-1.4.2\\SciTE.exe" "%1%"

↑SciTE.exeのパスは適宜書き換えてください。

注意1)MetaTrader がアップデートされると、MetaEditor.exe が上書きされて元に戻ります。その場合は、やり直してください。
注意2)既に、MetaEditor.exe が起動している場合は、そちらがアクティブになるだけなので、SciTEは起動しません。





『A better editor for MQL4 using SciTE!』は、そのままでは日本語設定になっていないのと、キーワードの色設定が MetaEditor と異なっています。
このセットを解凍して、SciTE.exe のあるフォルダに上書きすると簡単に上記設定に変更できます。
メニューが日本語では困る人は、locale.properties ファイルを削除してください。


フォントを変えたい場合は、オプションから
SciTEGlobal.properties (共有特性設定)ファイルの下記を変更してください。
font.base=font:MS ゴシック,size:10


ツールの Code Beatifierでソース整形する際のオプションを変更する場合は、
Commands.properties ファイルの下記を変更してください。
command.14.*="$(SciteDefaultHome)\\additions\\astyle\\astyle.exe" -s2A3Dp "$(FileNameExt)"


コンパイラのパスを変えたい場合は、
langs/mql.properties ファイルの下記を変更してください。
metalang=$(SciteDefaultHome)\other\metalang.exe


#include しているファイルがある場合、metalang.exeのパスを本来のパスに変えるか、
scite-mql-1.4.2\other\experts\include
に必要なファイルを置くしかないようです。


デフォルトの補完機能では、MQL4のすべてのキーワードが補完候補には出てきません。不便であれば、
api\mql.api に追記しておくと改善します。とりあえず、これで上書きして、不要な単語を消すと良いかも?

00-EcoIndi用経済指標ファイルをForexFactoryやDailyFXから自動取得する。

00-EcoIndiは、00(ダブルオー)先生の作られた、経済指標時刻を MT4 のチャート上に表示するインジケータです。
これは、ローカルにある EcoIndi.txt を読み取ってチャートに表示させる為、常に最新の EcoIndi.txt が必要なのですが、現在は更新が滞っているようです。なので、ForexFactoryやDailyFXから定期的に取得して、保存するインジケータをこちらに用意しました。


GetFFCalData.ex4 をチャートに貼っておけば、ForexFactoryのデータを取得します。
files フォルダに FFCalTransJP.csv を置いておけば、既知の指標は日本語で表示されます。
GetDailyFXData.ex4 は、DailyFXから取得しますが、日本語未対応です。

↑平日であれば、00-EcoIndi に設定すべき serverGMT の値がわかります。


↑00-EcoIndi の xTitleOffset = 50; yStep = 20; 辺りで適宜調整すれば見やすくなります。