システムトレードとは?

FXの取引をプログラムを用い全て自動で行ってしまおうというのがシステムトレードである。自分の勝ちパターンが見つかればそれをプログラム にし、自動で儲けてしまおうという分けである。ツールはMeta Trader(メタトレーダー)というソフトを用い、メタトレーダーを使う事ができるサイト を通すと自動売買ができる。興味があるならば121証券 などに行ってみると良い。メタトレーダーがダウンロードでき、また練習用に仮想通貨でデモトレードを行うこともできる。

お勧め書籍

プログラムの経験がない人はかなり敷居が高いと思われる、そこでそのような人でもメタトレーダーのプログラムを書けるための書物を紹介する。 私もこれらの書物を用いて勉強し、プログラミングが書けるようになった一人である。サンプルコードが豊富で詳しく説明されてるので初心者でも十分にコードが書けるようになると思われる。まずは入門編から入り、簡単なコードが書けるようになり、より複雑なプログラムにチャレンジしてみたい人は実践編も読んでみよう。

管理人の作成したプログラムを公開

ゴールデンクロスやボリンジャーバンド等様々な指標を駆使してプログラムを作成していたのであるが、結局これらの指標は買いのサインで あると同時に売り(損切り)のサインとなる事も多くシステムトレードを行おうとしてもそれほど良い結果が出ない。むしろマイナスになる事も多かった 。その後試行錯誤して作ったものがページ下のプログラムである。複雑なプログラムを組むよりもむしろこのような単純なプログラムのほうが結果を得やすい事が経験としてわかってきた。プログラムの説明をすると大体次の事を行っている。


1.ある地点から22銭動いたときに、動いた方向へ順張りを行う。その方向へ更に80銭動いたならばトレイリングストップモードに入り、利益を確保しつつ利幅を伸ばす。
2.トレイリングストップにより、利益の最高となるポイントから22銭利益が減少するポイントに到達したときに利益を確定
3.22銭利益が減少する方向へ動いたため、その順張りを行い、その方向へ更に80銭動いたら再びトレイリングストップで利益を確保しにかかる。
4.損切りは22銭分損をした時に行う、ただし22銭分損をしたということは今まで張っていた逆方向のトレンドができているのでそちら方向へ今度は順張りを行う。


ポイントはトレイリングストップを用いている事と、基本的に順張りを行っているという事である。80銭と22銭は別で求めた最適値である。この例はドル/円であるが、この80銭、22銭はユーロ、豪ドルにも十分に適応できる。なお取引手数料は1銭程度である。

プログラム結果

見にくいが、結果は上のようになった、2001年から2009年までの期間でトータル4570回程度取引を行い総資産は50万円から始めて500万円以上 になっている事がわかる。1回のトレードでの掛け金は1口(100万ドル)しか掛けていないため、1万円から始めてそれが450万円になった、一年平均に すると年利4500%のスーパープログラムであることがわかる。ところが年を減るにつれてパフォーマンスが落ちてきている事がわかる。これは勝ちパターン は永遠に続く事がないということを示唆するものである。勝っている間はそのまま続け、負けてきたら少し考えてみるのが良いだろう。なおこのプログラム で売買したい人のために、一応まだ儲かる確率の方が高いから使いたい人がいたらどうぞとだけ言っておく。そこらで販売しているシステムトレードツールよりは安全だとは思うが判断は各自に任せます。

// マイライブラリー
#include 

// マジックナンバー
#define MAGIC   20094071
#define COMMENT "Breakout1SL1"

// 外部パラメータ
extern double Lots = 1;
extern int Slippage = 0;

int count=0;
int semafo = 0;
double kaine=0,urine=0,kijun2=0;
double junbari = 0.22;
double songiri = 0.22;
double songiri2 = 0.22;
double rikaku = 0.8;
double kijun;
double sikiri = 0.22;
double trail = 0.01;
double trailhaba = 0.01;

//エントリー関数
int EntrySignal(int magic){

   if(semafo == 0){
     kijun = Ask;//現在値を得る
     semafo = 1;
   }
   
   if(semafo == 1){
     if(kijun+junbari <= Ask){
          kaine = Ask;
          semafo =2;
          return(1); //買いシグナル
     }
     
     if(kijun-junbari >= Ask){
         urine = Bid;
         semafo = 5;
         return(3);//売りシグナル;
     }
   }

   if(semafo == 2){
     if(kaine+rikaku <= Ask){
        semafo = 7;//トレイリングモード
     }     
     if(kaine-junbari >= Ask){
       urine = Bid;
       semafo = 5;
       
         return(4); //損切り決済,そして売りへ
                     
     }
   }
   
 
   
   
   if(semafo == 7){
     if(kaine+rikaku+trail <= Ask){
        trail+=trailhaba;
     }
     if(kaine+rikaku+trail-trailhaba-junbari >= Ask){
        //現在ポジションを決済して売りに転じる       
        urine = Bid;
        trail = trailhaba;
        semafo = 5;
        return(4);
        
     }
   }
   
   
   
   if(semafo == 3){
     kijun = Bid;//現在値を得る
     semafo = 4;
   }
   
   if(semafo == 4){
     if(kijun-junbari >= Bid){
        urine = Bid;
        semafo = 5;
        return(3); //売りシグナル
     }
     if(kijun+junbari <= Bid){     
           semafo = 3;
     }
   }
   
   
   
   if(semafo == 5){//売り状態
     if(urine-rikaku >= Bid){
        semafo = 6;//トレイリングストップモードへ
     }
     if(urine+junbari <= Bid){
       semafo = 2;
       kaine = Ask;
       
         return(5); //損切り決済,そして買いへ
       
     }
   }
   
   if(semafo == 6){
    if(urine-rikaku-trail >= Bid){
       trail += trailhaba;
    }
    if(urine-rikaku-trail+trailhaba+junbari <= Bid){//利確、決済して買いへ
      
       kaine = Ask;
       trail = trailhaba;
       semafo = 2;
       return(5);
    }
   }

}


// スタート関数
int start()
{
   //エントリーシグナル
   int sig_entry = EntrySignal(MAGIC);
   // 買い注文
   if(sig_entry == 1)
   {      
      MyOrderSend(OP_BUY, Lots, Ask, 0,0,0, COMMENT, MAGIC);//単純に買い注文
   }
   
   if(sig_entry == 2)
   {
      MyOrderClose(0, MAGIC); //決済
   }
   
   // 売り注文
   if(sig_entry == 3)
   {
      MyOrderSend(OP_SELL, Lots, Bid,0,0,0, COMMENT, MAGIC);
   }
   
   // 決済して売り注文
   if(sig_entry == 4)
   {
      MyOrderClose(0, MAGIC); //決済
      MyOrderSend(OP_SELL, Lots, Bid,0,0,0, COMMENT, MAGIC);
   }
   
   // 決済して買い注文
   if(sig_entry == 5)
   {
      MyOrderClose(0, MAGIC); //決済
      MyOrderSend(OP_BUY, Lots, Ask,0,0,0, COMMENT, MAGIC);
   }

   return(0);
}