2011/05/09

MT4用EA開発時代 - 必要な機能と設定項目をまとめてみた+ERR_TRADE_CONTEXT_BUSY



さて前回は、無事「トレーディング・プラン」を1つに纏め、プラン工程完了したところまで話しました。今回は、「トレーディング・プラン」と「MT4用EA開発時代」で今まで検討してきた内容に基づいて、MT4用EAで開発する機能とか、設定項目をまとめてみた様子を書いてみたいと思います。

まずは、想定している実行環境。

【実行環境(予定)】
------------------------


普通、ここまで機器を用意する必要は無いと思う。。

でも、同じPCででも、MT4は開発用とトレード用の2つインストールする必要があるはず。
#そうしないと、実トレードで使用しているEAを修正するとうっかり、修正中EAでトレードが開始してしまうから。

もしくは、VPSを使うか。FX業者によっては、条件さえ満たせばタダで利用できるし。
今のところ、自宅→VPSが通信不可になった場合の事を考えて、上記構成に。

こういう絵を描いておくメリットは、それぞれの機器が故障した場合に何ができなくなるかを考える事が
できる点。事前に考えておけば、故障したときにどうすべきか考える事もできる。
------------------------


そして、前回まででの「MT4用EA開発時代」で洗い出した考慮すべき点と、「トレーディング・プラン」で作った計画から、必要となる機能(トレーディング・ルール以外)をまとめてみた。

これらの機能は共通化して、次のEAを開発する時に流用しやすくする予定。
#部品を公開できたらいいなぁ。

やっぱり、トレード手法の有効性をテストする為のEAと、実際にトレードする為のEAでは、作りが違う様な気がする。 下記の機能は、テストするにはほとんど必要の無い機能ばっかりで、最適化とかをMT4ですると、とっても遅くなると思う。

【MT4用EA自体に必要な機能】
----------------------
1.オーダ送信時(発注・変更・決済)
  以下のエラーの区分毎のハンドリング機能
  ・サーバ側起因/価格不一致/コンテキスト・ビジー
   ログ出力を実施。その後スリープ&価格データ最新化&リトライを実施。
   リトライアウトの場合は、さらにメール通知。
  ・マーケットが閉じていた場合
   ログ出力及びメール通知。
  ・証拠金不足/バグ起因/不明なエラーの場合
   新規オーダ発注禁止にする。ログ出力及びメール通知
2.マネージメント関連機能
  ・ドローダウンもしくは資金残高が一定額以下になった場合に、新規発注を停止する
   機能。
3.運用系機能
  ・トレードログ出力機能
   MAGIC、通貨ペア、買い/売り、発注日時、決済日時、発注約定価格、決済約定価格、
   ロット数、手数料、スワップ、損益、スリッページ、保有バー数、
   最適化対象パラメータ値
  ・MT4を再起動した場合でも、保有中ポジションをルール通り決済できる様に
   する機能。(変数をディスクに保存し、起動時に読み込む)
  ・新規発注を手動で停止する機能
   保有ポジションはルール通りに手仕舞うが、新規には発注しない様にする
  ・ディスクに保存した大域変数を変更する機能
   (バグ発覚後のデータ補正の為)
  ・最適化パラメータ変更時に、新パラメータを新規オーダから適用する機能
----------------------

作りかけのMT4用EAを6通貨ペアで、デモ口座で動かしてるけど、OrderModifyでエラーが発生。エラー内容は、ERR_SERVER_BUSY(だったはず。3分20秒ぐらいかかってた)が1回、ERR_TRADE_CONTEXT_BUSY(後述)が2回。なので、スリープ&リフレッシュ&リトライは必要やと思う。
#次のティックデータ受信まで待つという手もあるけど。

【その他開発ツール】
----------------------
1.最適化パラメータをForexTester2によるスキャン結果から取得するツール
2.サーバとのセッション切断時に、メール通知するツール
3.MT4プロセスダウン時に、メール通知するツール
4.実トレード結果を集計して、異常を検出する為のツール
----------------------

そして、いろいろな設定する内容を整理してみた。

【MT4用ノートPCへの設定】
----------------------
1.UltraVNCサーバ機能の設定
  ※普段使いPCにはUltraVNCクライアントを設定
2.Windows Live Messengerの設定
3.バックアップ(BunBackup)の設定
  → 「GlobalVariables」とログを定期的(1H毎?)にバックアップ
4.サーバとのセッション切断検出ツールの設定
5.MT4プロセスダウン検出ツールの設定
6.トレサポの設定(検討中)
----------------------

【MT4設定手順概略】
----------------------
1.実際にトレードする為のMT4をインストール
2.作成したEAと関連インジケータ、ライブラリをインストール
3.「ツール」→「オプション」→「E-メール」で、メール送信用の設定
4.取引する通貨ペアのチャートを開く
5.使用するEAをチャートにドラッグ&ドロップ
6.EAプロパティ「全般」で、"Allow live trading"にチェックする
  ※MT4用ノートPCのみ
7.EAプロパティで、最適化で得られたパラメータを設定する
8.「ツール」→「Global Variables」の設定を全てクリアする
9.「Expert Adviser」をクリックし、EAによる取引を開始する
  ※MT4用ノートPCのみ
----------------------

そして、「後述」としていた「ERR_TRADE_CONTEXT_BUSY」について。
   
【「ERR_TRADE_CONTEXT_BUSY」について】
----------------------
返却されるエラーのうち、「ERR_TRADE_CONTEXT_BUSY」って何者かよくわからなかったけど、ヘルプとか挙動とかみて、発生原因の仮説をたててみた。

2本のHTTPSセッションを張っていて、片方はどうもデータ・センタ用みたい。
なので、MT4一つに対して、オーダ関連の通信しているセッションは1つだけなのかなと。

で、ヘルプで見つけたのが、「通信用のスレッド」があるという事。

実質1セッションしかないHTTPSでつなげてて、通信用スレッドがあるという事は、通信用スレッドも1つしかないという事(それ以上あっても意味無いし)。

で、ログの出力順序とか見てると、1つのオーダ関連リクエスト送信後、応答が返ってくる前に、次のオーダ関連リクエストを出したら、ERR_TRADE_CONTEXT_BUSYになるのではないかと。
#応答受信前にリクエスト送ったってええと思うんやけど。。リクエスト出した順に、応答が返ってくればええんやから。。

そして、いくらIsTradeAllowed()とか、IsTradeContextBusy()を事前にしていても、以前の記事の通り、必ず隙間ができるので、1つのMT4で同時実行している以上、避ける事はできないと思う。

今回のケースで言うと、6通貨ペア分同時トレードしていて、4Hに一回トレーリングの為に、OrderModifyをしている。トレーリングのタイミングは、前のバーが完成された直後のティックデータ受信時。なので、保有ポジションの数だけ一斉にOrderModifyする事になってしまうので、ERR_TRADE_CONTEXT_BUSYになりやすい状況かも。
#裏を返すと、1MT4で1通貨ペア+1EAだと、ERR_TRADE_CONTEXT_BUSYは発生しないと思う。
----------------------










もっともらしく書いてますが、

あくまで仮説。

間違えてたら教えてください。



そして、場つなぎ的な内容でお茶を濁して、「FXシステムトレード初心者奮闘記」の「MT4用EA開発時代」は続くのでした。
#追加したMT4用EAの機能、ちゃんと動くかなぁ。。

0 件のコメント:

コメントを投稿