2013年2月1日金曜日

リアルトレードに耐えられるプログラムの作り方


今日はフォワードテスト結果詳細を報告しようと思っていたのですが、色々とちょこちょこ改良!?する度にバグがあり余り満足に売り買いされていなかったため、代わりにリアルトレードに耐えられるプログラムにはどのような機能が必要かについて話したいと思います。

バックテストは何度もした事あるけどリアルマネーをEAに任せたこと無いよ!という方は必見です。

さてさて、リアルトレードとバックテストとの大きな違いってどのようなところにあるのでしょうか。
TAもあまりEAにリアルマネーを任せたことが無いので、このブログで答えを完璧には出せないと思いますが、大きく以下の2つの点がバックテストと異なると思っています。

  ・スプレッドが時間によって変わる可能性がある。
  ・約定しない可能性がある。(スベる可能性がある)

また、トレード技術問題以外に以下の問題があると思っています。

  ・PCから離れたときちゃんと動いているかが気になる。
  ・プログラムを遠隔で動かしたい。

これらの問題はバックテストをやっているときには全く気になりませんが、リアルマネーを任せるにはクリアしておかないといけない問題です。

では、順を追って解説していきましょう。

■スプレッドについて

 こいつは一番切実な問題です。
 バックテスト結果はこのスプレッドに基づいているからです。

 スプレッドが1pips違うと1000回のトレードで結果が1000pips変わります。
 トレードで1000pips抜くのがどれ位大変かは裁量トレーダーの方ならよーく分かるはずです。
 1000pipsと言ったら、最小売買単位でも利益が10万円変わります。
 どれだけスプレッドに気を使わなければいけないかお分かりでしょうか。

 では、MT4でスプレッドを確認するAPIをご紹介しましょう。

  int MarketInfo("USDJPY",MODE_SPREAD)

 これを使ってエントリーするかしないかを判断すれば、スプレッドが広がっているときの無駄なトレードが省けます。
 私は121証券を使っているので、上APIが2以上を返してきた場合はエントリーを行わないようプログラムして
 います。

■約定拒否について
 
 こいつも結構切実な問題です。
 バックテストならあんなにサラッと100万通貨とか買えてたのにリアルは全然だめだぁなんてことが多々あります。
 こいつの方がスプレッド問題より解決が難しいです。

 まず、エントリーについてですが、2つの方法があります。
 一つが、OrderSendをループにすることです。
 私のプログラムを抜粋します。

  while(res == -1) {
   Print(OptLots);
   res = OrderSend(Symbol(),OP_BUY ,OptLots,Ask,1,Ask - Stop * Point,PL,"TwoPointCharge",MAGIC,0,Red);
   Counter++;
   if(Counter > 10 && Email) {
    SendMail("Error Information.","TwoPointCharge is Hang Up in Open routain(buy).");
    return(0);
   }
  }

 こんな感じです。
 とりあえずガンガンループを回してある程度約定しなかった場合ループを抜けるようにプログラミングしています。

 なお、OrderSend関数はOrderに失敗したときは-1を返し、成功すればチケット番号(注文番号)を返します。

 もうひとつの方法は1回トライであきらめてしまう方法です。
 そっちの方が理論値通り動いてくれていいのかも、とも思っています。

 もっと切実なのがエグジットの時の約定拒否です。
 損切りのときに約定拒否が続いたら大変です。
 そのため、私は以下のようにプログラムしています。

  while(res == false) {
   RefreshRates();
   res = OrderClose(OrderTicket(),OrderLots(),Ask,1,White);
   Counter++;
   if(Counter > 20 && Email) {
    SendMail("Error Information.","TwoPointCharge is Hang Up in Open routain(sell).");
    return(0);
   }
  }

 エントリー時と違ってポジションと言う名のリスクを抱えているのでどうしても決済したいところです。
 そのため、RefreshRates()とOrderCloseをループさせて意地でも決済してしまおうというプログラムにしています。

■EAの動きを遠隔で知る方法

 常時PCに張り付かなくて済むように携帯にメールを送信させましょう。
 メールの送信はMT4で機能を整備してくれているので簡単です。
 MT4上で「ツール→オプション→E-メール」と辿ってみてください。



 ここで、SMTPと送信元、送信先を設定したら、次にEAのコード中に

 SendMail("Error Information.","TwoPointCharge is Hang Up in Open routain(sell).");

 などと、書くだけです。
 なお、第一引数が題名、第二引数が本文です。

■遠隔からEAを操りたい

 こいつをやるにはリモートデスクトップを使うくらいしか方法が無いです。
 これを使うにはXP Professionalが必要です。(Vistaの事はわかりません。ごめんなさい。)

 システムのプロパティの「リモート」タブから、リモートデスクトップ接続を許可して下さい。
 遠隔でログインする予定のPC(大抵の方は会社のPCなどでしょうか。)から、
 
  「スタート→プログラム→アクセサリ→通信→リモートデスクトップ」
 
 と選択して、IPを入力すれば接続できるはずです。

 でも、こういうやり方はオススメしません。
 なぜなら、投資資金をリアルに扱っているPCが簡単にリモートからアクセスできること自体非常にリスクだから
 です。
 なので、どうしても緊急でPCに触りたい場合は午後休を取りましょう!(笑

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

さてさて、今回のリアルトレードに耐えられるプログラムの作り方はどうだったでしょうか。
意外にこういう記事を書いている人がいないんですよね。
こういう記事が無いってことは皆さん結構リアルでEAを動かしていないってことなんですかね。
もしそうならEAを使った売買はまだまだエッジがあるのかなと一安心してみたり。