2011/05/11

MT4用EA開発時代 - EAプログラミング時の基礎知識と情報源、そして失敗談



さて前回は、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つの書籍。
  「実践」の方だけ先に購入してたけど、結局両方必要になっちゃいました。。  
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 件のコメント:

コメントを投稿