2011/04/16

MT4用EA開発時代 - EA開発で考慮すべき点について2



さて前回は、 旧SmoothMADIシステム 」の「ウォークフォワード分析 」結果を纏めようとしたところ、設定ミスがあり再スキャン中でForexTester2が使えないので、MT4EA開発するにあたっての方針について考えている様子の第一弾を書いてみました。
今回はその第二弾で、「タイミングのズレ」「運用性」「障害対策で書き忘れた事」についてです。

そしたら、さっそく。

【タイミングのズレ】
----------------------------
タイミングのズレも、バックテストの時との大きな違い。
つまり何かと言うと、通信しているが故に以下の様な例が出てきてしまう。

●タイミングのズレの例
 ・サーバ側で認識しているAsk/Bidとクライアント側のMT4で認識しているAsk/Bidが
  異なる可能性がある。
 ・クライアントで処理中にポジションがまだあると思っていても、サーバ側では
  ポジションがロスカットされてしまっているタイミングがある
 ・クライアント側ではまだマーケットが開いていると思っていても、サーバ側では
  マーケットが閉まっているタイミングがある。
 ・サーバが元気だと思って処理をしていても、サーバ側がダウンしている。

一応、MT4にもIsTradeAllowed()とか、IsConnected()とか用意されているけど、オーダ発注時直前に確認したところで、タイミングの隙間は必ず発生するので、正常時にあらゆるところでこれらのチェック関数を呼び出したとしても、発注関連でエラーが出る可能性がある。

たとえばIsTradeAllowed()を例にとると。


この図で言うと、OrderSend()の直前でIsTradeAllowed()でOKが返ってきたとしても、次のOrderSned()では、エラーになるタイミングがあるんじゃないかと。

なので、start()入ったときの最初に1回だけ実施した後は、実際にエラー検出後のスリープした後にIsTradeAllowed()を実施すればいいんじゃないかなと。

そして、同じことは前述の【タイミングのズレの例】で書いた他の点でも言えるハズ。
なので結局、直前にIsTradeAllowed等のチェック関数を呼んだところで、OrderSend等のエラーチェックを簡易化できない。
----------------------------



MT4初めてなので、

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



そして、前回記事 「障害対応」と前述の「タイミングのズレ」ときっても切れない機能が「運用性」。なので、「運用性」について今思っている事を書いてみると。

【運用性について】
----------------------
1.異常を検出して、利用者(つまり自分)に通知できる事
  →外出中でも検出した異常を知りたい。
  →場合によっては外出中に対処できるかもしれない。
  →かといって、オオカミ少年になってはいけない。
2.問題を検出したら原因を調査できること。
3.原因がわかれば対処できること。
4.ポジション保有中の、パラメータの変更やEAの変更
5.ポジション保有中でも、Windowsのパッチや、定期再起動
  を実施しても問題無い事。
6.トレード成績自体の変調に気づけること
----------------------

それぞれをもう少しみてみると。

----------------------
●「1.異常を検出して、自分に通知できる事」について
 ・携帯電話に異常をメールで通知する予定。
  MT4には幸いメール送信機能があるし。
  そして、携帯電話で特定の送信元からメールを受信した場合は、メール受信音や
  イルミネーションを変えれば、EAのシステム異常に気づきやすい。
 ・異常の検出時の動作は、前回記事 のエラー分類毎に行う。
  ただすべてのエラーでメール通知すると単なる瞬断レベルでも通知され、
  結局面倒なことに。(オオカミ少年状態)
  メール通知するケースは以下の通り
   1.プログラムミス起因によるエラーが発生した場合
   2.原因不明なエラーが発生した場合
   3.新規オーダ発注/トレーリング/手仕舞いでリトライ・アウトした場合
   4.マーケットが閉じていて手仕舞いに失敗した場合 (これは迷い中)
   5.証拠金不足によるもの
  エラー発生時にログ出力のみをするケース
   1.リトライが発生した場合
   2.エラーがクライアント側とサーバ側の価格のズレに起因する場合

●「2.問題を検出したら原因を調査できること」について
 これは、ログ出力時にできるだけ詳細な情報を出力すること。
 例えば、検出した関数や失敗したAPI名、GetLastError() , ErrorDescription()
 各価格情報等。ソースファイルの中のどの行で失敗したかを識別でき、
 その処理で使用している変数を出力する。

●「3.原因がわかれば対処できること」について
 要は、ログ出力する際に、トレードとして何が発生したかがわかる様な
 内容のメール通知内容にすること等。
 手仕舞い時のエラーでプログラムミスであれば、ポジションを手動で閉じるべき
 かどうかがわかる様にしておくとか。

 なので、それをしようとすると、注文内容だけでなく、MAGICや通貨ペア、チケット番号等
 の情報が必要。
 単に、サーバ障害によるリトライアウトであれば、FX会社に問い合わせるとか、
 状況を注視するとか。トレードの観点としての情報が見れること。
 バグ起因の場合は、ケース・バイ・ケース。
 
●「4.ポジション保有中の、パラメータの変更やEAの変更」について
 これが難しい。MT4が自動で変更を行ってくれるが、ポジション保有中の場合、
 すぐに新パラメータ/新EAを適用して処理継続していいのか?ということ。
 具体例は見つからないけど、何か弊害がある様な気がしてならない。

●「5.ポジション保有中にWindows再起動をしても問題無い事」について
 Windowsのパッチで再起動が必要なケースや、OSの安定動作のため、
 マーケットが閉じている土日などで定期的に再起動する運用を想定。
 (なので、WindowsUpdateの設定は自動で再起動されない様にしておく)

 ただ、ポジションを保有したまま週を跨いでしまうケースもあるはず。
 この場合、ポジション固有の情報を変数に格納していれば、その変数が再起動
 により消えてしまう。

 なので、該当情報を更新する際、その変数の情報をファイルに出力するとか、
 大域変数に格納する等しておき、次回起動時にその情報を読み込んで、
 内容を変数に格納するロジックが必要。

 悩みどころは、ロジックが簡単なのは大域変数への格納だけど、
 その状態でPC故障で立ち上がらなくなれば、その情報を取得できずに、
 予備のPCで、EAの実行を再開できない。
 
 それに対処するには、NASに情報を出力しておけば、別のPCで継続可能に。
 ただ、そのプログラムを書くのが面倒だし、利用機器が増えるので、
 必然的に故障発生率が高くなる事も懸念点。

 今のところ、PC起動不可になるのは稀なので、その場合はすぐにポジションを閉じる運用
 にしたとすると、大域変数にすると思う。

●「6.トレード成績自体の変調に気づけること」について
 どうもMT4のトレード結果をCSV形式には出力できないっぽい。
 #やり方知ってたら教えて!

 で、トレードの成績を集計して、システムがまだ継続して使えるのかどうか
 を定期的に見るとすると、CSV形式でトレード結果を出力して、集計して
 判断したいところ。なので、システム障害系のログとは別に、トレード結果
 ログを出力する予定。

 あと、戦略ストップ機能を作る予定。
 何かと言うと、ドローダウン(もしくは資金残高の低下)が想定以上に拡大した場合、
 自動的に検出し、新規発注を停止する機能をつけたいところ。当然そのときは、
 メールで通知。
 この機能、ある意味、プログラムミスによる大量誤発注への対策にもなるし。

 このメールを受け取ったらショックだけど。。

----------------------


運用性については、本当にサジ加減が難しい。


なんでもかんでも通知してたら、オオカミ少年になってしまうし、逆に抑制しすぎると、致命的なエラーを見過ごしかねない。

PC見てたらきづくじゃないか、という方もいると思うのですが、ずっと見てたら他の事ができないし、外出もできないし、夜も寝れない。そして、VPSとか、普段見ない専用PCで利用していればなおさら気づきずらい。






ずぼらなだけ

という見方もありますが。。


あと、障害対策で書き忘れていた事。

【障害対策で書き忘れていた事】
-------------------------------
それは、今の私の理解では、MT4自体が障害で落ちてしまった場合や、サーバとの通信ができなくなっていた場合、EAのstart()関数が動き始めない事への対策。

そもそもインタネットに接続できなくなっていたら、通知は不可。外出先から自宅PCにアクセスできる様にして時々見てみるぐらいしか思いつかない。
例えば、WindowsLiveMessengerを立ち上げといて、携帯からそのアカウントがオフラインになっていないか確認するぐらいかな?

なので、インタネットに通信できる前提とすると、start()関数で処理中にサーバ障害が発生するとエラーを検出して気づく事ができるけど、単にAsk/Bid情報が来ないだけであれば、流動性が無くなっただけなのか、障害によるものなのかはEAのプログラムでは判断できない。

当然、MT4が落ちてしまえばstart()が動き始めるはずがない。
PCが落ちていてもEAのプログラムではわかるわけがない。

で、どうするかというと、



それは次回!
-------------------------------








お前はテレビドラマか。



そしてまたしても、中途半場な状態のまま「FXシステムトレード初心者奮闘記」は、MT4のEA開発での「EA開発時の考慮すべき観点」が続くのでした。
#「ウォークフォワード分析 」のスキャン結果を集計作業中。

0 件のコメント:

コメントを投稿