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

Bookmark and Share

1. 「猿」になってみる

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

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

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

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

  1. int init(){
  2. }
  1. int deinit(){
  2. }

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

  1. int start(){
  2.   if(Time[0]%360 != 0){
  3.     return(0);
  4.   }
  5.   MathSrand(TimeLocal());
  6.   if(MathRand()%2 == 0){
  7.     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-StopLoss*Point,
  8.     Ask+TakeProfit*Point,NULL,0,0,Blue);
  9.   }else{
  10.     OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+StopLoss*Point,
  11.     Bid-TakeProfit*Point,NULL,0,0,Red);
  12.   }
  13. }

まず、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. 変数の定義

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

  1. int init()

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

  1. extern int StopLoss = 15;
  2. extern int TakeProfit = 15;

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

  1. extern int StopLoss = 15;
  2. extern int TakeProfit = 15;
  3.  
  4. int init(){
  5. }
  6.  
  7. int deinit(){
  8. }
  9.  
  10. int start(){
  11.   if(Time[0]%360 != 0){
  12.     return(0);
  13.   }
  14.   MathSrand(TimeLocal());
  15.   if(MathRand()%2 == 0){
  16.     OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-StopLoss*Point,
  17.     Ask+TakeProfit*Point,NULL,0,0,Blue);
  18.   }else{
  19.     OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+StopLoss*Point,
  20.     Bid-TakeProfit*Point,NULL,0,0,Red);
  21.   }
  22. }