2011/04/17

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



さて前回は、 旧SmoothMADIシステム 」の「ウォークフォワード分析 」結果を集計中なので、MT4用EA開発するにあたっての方針について考えている「タイミングのズレ」「運用性」「障害対策で書き忘れた事」について書きました。
今回は、「障害対策」として、「MT4プロセスダウン」「サーバとの回線が切断」を検出する方式と、MT4をインストールしているPCがダウンしていることを検出する方式について考えている事を書いてみたいと思います。

前回書いたの通り、自動売買で異常をメールで通知しなきゃいけない理由は、画面みてなくても、異常に気づけて、すぐに対処できる様にするため。


先に言っておくと、構想だけでまだ実績ありません。
#個々の要素技術を組み合わせればできるんじゃないかと。

では、さっそく、「MT4プロセス]のダウンを検出する方式について。

【MT4プロセスダウン検出方式(案)】
-----------------------------------
PCが元気で、MT4がダウンしている事を検出する方法。
これは、「tasklist」というコマンド・プロンプトから起動できるWindows標準コマンドを実行すれば、今起動しているプロセスの一覧を取得できる事を利用します。ここに、"terminal.exe"がなければ、MT4がダウンしていると判断できるということです。

今回、MT4のプロセス名は、"terminal.exe"なので、実行してみると。

●実行結果例
イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0         24 K
System                           4 Services                   0     10,104 K
  :
terminal.exe                  2116 Console                    1     37,212 K
  :

で、これに「find」という検索コマンドを使うと、"terminal.exe"だけを抽出できます。
さらに、「find」のオプションとして、「/C」を使うと、検索結果の行数を取得できるので、MT4を1つだけ起動する運用であれば、結果が「1」であればいいわけです。

具体的にコマンドで書くと、以下の様な感じに

C:\Windows\system32>tasklist | find /C "terminal.exe"
1 ← 実行結果

で、これが「1」であればOK。でも、これを通知できないと意味がないので、メールで通知。かといって、メール送信を自作するのは大変。

でも、メール送信するフリーソフトがあった!!

この結果が「1」でなければメール送信するバッチファイル(.bat)を作成し、「タスク・スケジューラ」(「アクセサリ」→「システムツール」)に組み込んで、定期的に起動する様にしておけば、MT4がダウンした時にメール通知できる事になります。

で、候補としているコマンドタイプのメール送信フリーソフトとして、以下のものがあったのですが、まだ試していません。

●コマンドタイプのメール送信フリーソフト
 ・ CMAIL WRITER 

ここまで上手くいったとして、悩みどころは、自動で再起動させるべきかどうか。

・再起動させなければ、MT4プロセスダウンを通知するメールが延々と来つづける。
・再起動させればメールはこなくなるけど、落ちたのには理由があるはずで、不安定な
 状態でMT4だけ再起動させて大丈夫なのか?というところ。
 もしかしたら、「MT4プロセスダウン → MT4起動 → またプロセスダウン」を
 延々と繰り返してしまうかもしれない。そして延々と繰り返す事で被害が拡大する
 可能性だってある。
  #例えば、新規発注した後に落ちるケースがあった場合、再起動のたびに発注しつづけるとか。
   今回は、ポジションを持っていれば新規発注しない予定なので、問題無いかもしれない。

もし、もう少し凝るとしたら、3回程再起動してまたダウンしたら、もう再起動しない様にするぐらいかな。

気をつけなきゃいけないのは、運用上MT4を停止させる場合、勝手に起動してしまうこと。
なので、運用上MT4を停止させる場合、一旦「タスクスケジューラ」で該当バッチを無効化してからしなきゃいけない事。

今のところ、1時間か、30分に1回ぐらいの間隔でバッチを起動させて、MT4も再起動させる予定。


上手くいけばですが。
-----------------------------------

で、次はMT4は元気だけど、サーバとの回線が不通になったことを検出する方法。
つまり、インタネットにはつながるけど、サーバがダウンしていることを想定。

【MT4回線切断検出方式】
-----------------------------------
EA作っているとき、実はEA内ではネットワーク異常を検出できないことにやっと気づいた。
#まさにOrderSend()とかしていれば別だけど。
つまり、Ask/Bidがこなかったら、MT4のEAでは何もわからない。

なので、通信セッションの一覧を取得して、そのセッションを使っているプロセス名を取得できればできそう。

具体的なコマンドで言うと、「netstat -b」を使うということ。
これを実行すると、以下の様な感じに。

C:\Windows\system32>netstat -b

アクティブな接続

  プロトコル  ローカル アドレス          外部アドレス        状態
   :
   :
  TCP    192.168.1.6:51851      74.125.235.152:https   ESTABLISHED
 [chrome.exe]
  TCP    192.168.1.6:52210      74.217.53.15:https     ESTABLISHED
 [terminal.exe]
  TCP    192.168.1.6:52211      74.217.53.15:https     ESTABLISHED
 [terminal.exe]
  TCP    192.168.1.6:52433      219x123x129x106:http   ESTABLISHED
 [chrome.exe]
  TCP    192.168.1.6:52460      121.119.254.49:http    ESTABLISHED
   :

なので、この結果に、「terminal.exe」が2つ含まれていればいいみたい。
#「2」という数字は、何回かやってみて、2だったからという根拠しかないけど。

なので、前述の「find /C」と組み合わせると、以下の様な感じに。

C:\Windows\system32>netstat -b | find /C "terminal.exe"
2 ← 結果

ちょっと悩ましい事は、セッションの状態を一緒にとれないこと。
本当は、「状態」が「ESTABLISHED」でないと通信できていない状態だけど、
出力フォーマット上、プロセス名と「状態」の行がわかれてるから、単純にいかない。
#「状態」が「CLOSE_WAIT」状態だと結構長時間残ってしまう。
#バッチ・プログラムに精通している人であれば楽勝かも。

なので、接続先である、「外部アドレス」で検索(「FIND」)することも考えたけど、これがなぜか時々変わってしまう。ちなみに、ローカルのアドレスは絶対しょっちゅう変わるので検索キーにできない。

バッチ・プログラムは苦手なので、とりあえず「プロセス名」で検索することにする予定。

で、検出したら「MT4プロセス障害」でも使う予定である、フリーのメールソフトで、メール通知。これは自動復旧できないから、一旦切断されて、サーバ側で長時間障害が発生していると、メールが延々と来ることに。。

1回通知したら、復旧するまでメール送信しない様にするぐらいしか思いつかないなぁ。


考えたら結構面倒。。

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


あとは、MT4を動かしているPCの故障。

【PC障害対策】
-----------------------------------
前回記事での外出時の場合は、「WindowsLiveMessenger」という案でした。
今回は、家にいて普段使いのPCを見てる時間が長い場合の話。
この場合、普段使いのPCで検出できれば対処もすぐにうてる。

そもそも、今想定しているマシン構成を一旦整理すると。

もともとVPSの利用を考えていたけど、やめて、古いノートPCを使う。
理由は、とあるVPS提供会社の歌い文句で「他のユーザの影響を受けない!」と書かれていたことと、運用ルールがイマイチだった点。

1つめの理由は、「他のユーザの影響を受けない」がウリになるということは、普通は影響を受けてしまうということ。他人の作ったEAのバグのせいで、こっちに被害がくるのはイヤ。

2つめの理由は、「定期的に再起動する。月曜になったら自分でMT4を起動しなおすこと」
みたいな事が書かれていた事。要は自分の都合で運用を変えれないということ。

で、今回新しいノートPCを購入したので、古いノートPCの上でMT4を動かせばいいじゃないか、と思い出したのでした。MT4は軽いし、古いノートPCでも多分全く問題なし。

そうした場合、古いノートPCをTA/ルータに直結して、電気つけっぱなしだけど普段は見ない。見たいときには、フリーのリモートデスクトップである、「UltraVNC 」等を使えばOK。

ということは、普段使いの新PCで、常時UltraVNC のクライアントを起動しておけば、MT4が動作している古いPCが故障したときはセッションが切れるはずなので、PC故障に気づけるはず。
-----------------------------------









企画倒れで終わらなければ

いいんですが。




そして「FXシステムトレード初心者奮闘記」は、集計中であった「ウォークフォワード分析」の結果分析に一旦戻るのでした。

0 件のコメント:

コメントを投稿