さて前回は、MT4用EAで実現したい機能をまとめたところまで話しました。今回は、EAを作るにあたっての基礎知識として、プログラムの構造と情報源、失敗した事等を書いて見たいと思います。
まず大雑把にMT4用EAの構造を説明すると、何か発生した毎にMT4から呼び出される関数が3つあって、それぞれ呼び出されるタイミングが決まってる。その中で、トレードに密着に関係する関数がstart()で、ティックデータ(Ask/Bid等)を受信する毎に呼び出される。このstart()関数内で、売買判断と発注/決済の関数を呼び出すプログラムを書けばOK。
そして、EAを作るためのプログラムの言語が「MQL4」。言語体系としてはC言語に似ているけど、C言語と比べると、簡単に作れる様になってる。(というか難しい箇所をカットしている)
プログラムを書くためのアプリは、MT4をインストールすると一緒にインストールされる「MetaEditor」。
プログラムは、拡張子「.mq4」というファイルに保存され、「MetaEditor」でコンパイルを実行すると、拡張子「.ex4」のファイルが生成されて、無事EA作成完了。
そして、EAの基本構造でもある、前述のMT4から呼び出される関数について。
EAを作るには、これらの関数を自分でプログラミングする必要がある。
【MT4から呼び出される関数】
--------------------------
●init()関数
これは、EAをチャートに追加した時とか、EAをチャートに追加した後に、MT4
を終了させ、起動した後とかに呼び出される。
主に変数の初期化等のプログラムを書く。
●deinit()関数
これが結構クセモノで重要。
いろんな理由で呼び出されるし、2.5秒以内に実行する必要があったりする。
そして、呼び出された理由を知るには、UninitializeReason()という関数の戻り値で
わかって、以下の様なパターンがある。
・EAがチャートから削除された。
・チャート上の通貨ペアか時間枠が変更された。
・チャートが閉じた。
・EAのプロパティが変更された。
・他のアカウントが有効になった。
●start()関数
ティックデータ受信(価格が変わった時)毎に呼び出される。
この関数内に、売買する為のプログラムを書く。
--------------------------
具体的な話は、MT4の方が「ForexTester2」よりも日本語サイトも多いし、書籍も出てるので、MT4用EAを作るにあたって必要な情報源を纏めてみた。
【MetaTrader4日本語情報源】
--------------------------
1.MetaTrader4関連書籍
メジャーなのは以下の2つの書籍。
・「FXメタトレーダー入門」
「実践」の方だけ先に購入してたけど、結局両方必要になっちゃいました。。
2.ブログ/サイト
●MT4初めての人に判りやすく説明しているサイト
●辞書的に調べれるサイト
●深い事が書いてあるサイト
やりたい事や悩み事を検索すると、よくここにたどり着く。
実際使うにあたっての、いろんなアイデアや考察、情報が書かれているサイト。
--------------------------
で、情報の洪水に埋もれない様に、良く使う関数/予約変数を纏めてみた。
【よく使う関数/予約変数】
--------------------------
●マーケットの価格情報の取得
Ask、Bid、Bars、Open、Close、High、Low等
●各種テクニカル指標
40個弱のテクニカル指標の値を取得できる。iXXXXみたいな関数名。
独自で作ったり、入手したインジケータは、iCustom()で使用することができる。
●注文関係
そもそも、これ使わなかったらEAの意味無いけど。。
発注(OrderSend)、 注文内容の変更(OrderModify)、決済(OrderClose)
ペンディング中オーダの削除(OrderDelete)。
●保有ポジション情報の取得
まず、OrdersTotal()で保有ポジション数を求めて、その回数分までOrderSelect()をループで
呼び出す。そして、MAGICが同じで、通貨ペアも同じものだったらループを抜ける。
選択が成功したら、OrderTicket()とか、OrderMagicNumber()、OrderSymbol()、
OrderOpenPrice()、OrderStopLoss()、OrderTakeProfit()等のオーダに関する情報を引数無し
で取得できる様になる。
手仕舞いするときとか、トレーリングしたりするときに使ったり、保有ポジション有無の
確認につかったりする。
●エラー情報取得
エラーが発生する関数は大体、成功か失敗かだけを返す。
なぜエラーになったのかは、GetLastError()を呼び出せば、エラーコードを取得できる。
で、エラーコードは数字。この数字だけだと原因が感覚的にわからないので、エラーコードが
意味している文言を取得するのが、ErrorDescription()という関数。
エラー原因が文言で文字列として返却される。英語だけど。
●「Experts」タブに、任意の文字列を出力する関数
Print文でログ出力できます。私の場合主な用途は、デバッグ用。
変数の内容を出力したりとかして、バグが発覚したときの原因究明に使ってる。
あとは、エラー検出時に、エラー箇所と原因を出力するとか。
●口座情報の取得
口座残高(AccountBalance)、余剰証拠金(AccountFreeMargin)等。
●状態をチェックする関数
IsStoped:結構重要。EAを停止する指示があった場合にTRUEが返却される。
指示があったら2.5秒以内に処理を終了させなければならない。
なぜ重要かと言うと、リトライすると、合計2.5秒以上かかる
様な場合、リトライする毎にこれでリトライをやめるべきかどうか
を判断しなければならないから。
2.5秒以上かかると強制終了させられてしまう。
IsTesting:Strategy Testerで動いているか。たまに使うかな。
テストの時は高速で動いてほしいから、一部処理をスキップ
させる為とか。
●その他
Sleep()関数。一定時間お休みする。指定するお休み時間はミリ秒単位。
オーダ失敗時のリトライするときとかに使ってる。
--------------------------
使う必要があるかどうかは別として、個人的に便利だと思った関数。
【便利だと思った関数/機能】
--------------------------
●メール送信機能
異常を検出して携帯にメール送信できたら、どこにいてても
異常を知る事ができて便利。最初に設定しておけば、SendMail関数で、
メール送信可能。
●グローバル変数関連機能
いわゆるC言語のグローバル変数とは違って、MT4を再起動しても
値が消えないので便利。普通の変数と違って、グローバル変数にアクセス
する関数を呼び出す必要あり。
profiles\gvariables.datに格納されてるっぽい。
●ファイル入出力機能
トレードの結果はCSV形式にして、後でExcelとかで集計したいところ。
私が知らないだけかもしれないけど、MT4の画面上からはトレード結果を、
CSV形式で保存できないっぽい(MT4の画面からだとHTML形式になる)。
なので、独自にトレード結果をCSVにファイル出力するために使っている。
--------------------------
で、実際にプログラムを作ってて、MT4で特徴的なところ、失敗したところ、意外だったところを纏めてみた。
【はまった点/「へ~」って思った点】
--------------------------
●そもそもEAを動かし始める時にはまった点
使いたいEAをチャートにドラッグ・アンド・ドロップすればええんやけど、
そのEAプロパティの「全般」→「Allow live trading」にチェックしてなかったから、
動かなかった。
●MT4起動中にEAをコンパイルすると自動的に動作中EAが置き換わる
MT4を起動して、チャート上にEAを登録。
その状態で、そこから「MetaEditor」を起動して、プログラム修正してコンパイルすると、
チャート上で動いているEAが自動的に修正後のEAに置き換わる。
●WindowsVista/7で動かすとき。
実はMT4はWindows7ではサポートしてないっぽい。今Windows7で使ってるけど。。
で、Vistaも含めて、気をつけなければならない点。
・インストールディレクトリ
デフォルトのディレクトリだとダメ。(セキュリティ制約の影響らしい)
なので、Users\[ユーザ名]配下のディレクトリのどこかにインストールが必要。
・「MetaEditor」でプログラムを書くときに、コピー&ペーストするとき
Microsoft Office IME 2010だと落ちます。
変わりに他のIME(Microsoft IME等)を使う必要がある。
●MT4の画面からEAのプロパティで変数を設定できる様にする方法
単に、関数の外に"extern"を冒頭につけて、変数定義するだけ。
ForexTester2の時は、いろいろ関数呼び出ししなきゃいけなかったけど、
変数定義だけで済むので楽ちん。
●「MAGIC」という概念
存在意義を理解するにに苦労した。
簡単に言うと、EAを識別する番号で、番号そのものは自由。
このブログ記事にわかり易くかいてある。
●チャート上の価格がAskベースなのか、Bidベースなのか
Bidでした。
●TimeLocal関数
現在時刻を取得する関数だけど、テスターで動かしている時と、デモ口座/本番で動かした
時で、挙動が異なる。
●ファイル出力する為に、オープンするとき
MQL4のFileOpenで、FILE_READとFILE_WRITE両方指定しないと、ファイルの中身消える。
--------------------------
以上
しかも内容は
他力本願。
だって、試行錯誤中だから。
そして、他力本願なまま、「FXシステムトレード初心者奮闘記」の「MT4用EA開発時代」は、次のネタに悩みつつ、続くのでした。
#やっと最適化後パラメータを求めて、デモ口座上のMT4用EAに設定した。
0 件のコメント:
コメントを投稿