FX外貨自動システムトレードを始めよう! - MetaTrader 4MT4)で作るFX投資ロボット入門
FX(外貨)自動システムトレード - MetaTrader 4でFX投資ロボットを作ろう!

3.6. 初めてのプログラム - ランダムに市場に参入

3.6.1. 「猿」になってみる

人間が英知を結集させてトレードを行っても、結局はランダムに「買い」と「売り」を繰り返す「猿」と同じようなパフォーマンスしか出せない、という話(都市伝説?)は有名です。

その真偽のほどはおいておいて、今回は早速、ランダムに市場に参入するプログラムを作成してみましょう。

3.6.2. メインプログラムを作ってみよう!

今回はプログラムは非常に簡単です。「1時間に1回」市場にランダムにショートまたはロングの方向で参入するプログラムを作成します。

int init(){
}
int deinit(){
}

以上の2つの部分は今回は使わないので、何も記述する必要はありません。

int start(){
  if(Time[0]%360 != 0){
    return(0);
  }
  MathSrand(TimeLocal());
  if(MathRand()%2 == 0){
    OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-StopLoss*Point,
    Ask+TakeProfit*Point,NULL,0,0,Blue);
  }else{
    OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+StopLoss*Point,
    Bid-TakeProfit*Point,NULL,0,0,Red);
  }
}

まず、2~4行目は、現在のUnix時(1970年元旦からの秒数)が360で割れなかったら、以降の処理を実行しないことを命令しています。Time[0]は現在のUnix時(厳密に言えばおよそ1秒前)を指し、"return(0);"は、その場でstart()内の処理を終了させるという命令です。

次に、5行目ですが、これは現段階では「おまじない」だと思ってください。

6~12行目を見てみましょう。
MathRand()は、ランダムに0~32767までの数を選ぶことを意味します。
(実は5行目の「おまじない」はこのためのものでした)

その数が2で割った余りが0であれば、と続くのですが、もうお分かりでしょう。これはすなわち、「ランダムな数が偶数であれば」という意味になります。

7,8行目の処理は、「対象となる通貨を、ロングの方向に、0.1建玉、買値から3pips以内の範囲で買う」事を意味します。
(もちろん実際のプログラム中では、2行に分ける必要はまったくありません)
さらにStopLossとTakeProfitはそれぞれ、Ask-StopLoss*Point, Ask+TakeProfit*Pointに設定されています。

ここは多少必要がいるところでしょう。
Pointは取引通貨ペア間での単位のズレを解消してくれるものです。
たとえばUSD/JPYが"123.45"→"123.47"と動いた場合と、EUR/USDが"1.2345"→"1.2347"と動いた場合、ともに2pipsの値動きになりますが、両者の桁は違っています。Pointはこれをうまく調整するものです。

上記の例でAsk-StopLoss*Pointとはすなわち、「買値からStopLossポイント分だけ下がったら、ストップ」ということを意味しています。

3.6.3. 変数の定義

さて、ここまでで気づいた方が多いと思いますが、実はStopLossとTakeProfitは、定義していない変数です。
これはあらかじめ定義しておかないと、プログラムを使うことはできません。

int init()

上の部分の前に、このように記述しましょう。

extern int StopLoss = 15;
extern int TakeProfit = 15;

いままでのところまでをまとめると、次のようなプログラムが出来上がるはずです。

extern int StopLoss = 15;
extern int TakeProfit = 15;

int init(){
}

int deinit(){
}

int start(){
  if(Time[0]%360 != 0){
    return(0);
  }
  MathSrand(TimeLocal());
  if(MathRand()%2 == 0){
    OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-StopLoss*Point,
    Ask+TakeProfit*Point,NULL,0,0,Blue);
  }else{
    OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+StopLoss*Point,
    Bid-TakeProfit*Point,NULL,0,0,Red);
  }
}
MetaTraderで注文指示