MetaTraderでFX自動売買研究所
6. 初めてのプログラム - ランダムに市場に参入
1. 「猿」になってみる
人間が英知を結集させてトレードを行っても、結局はランダムに「買い」と「売り」を繰り返す「猿」と同じようなパフォーマンスしか出せない、という話(都市伝説?)は有名です。
その真偽のほどはおいておいて、今回は早速、ランダムに市場に参入するプログラムを作成してみましょう。
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. 変数の定義
さて、ここまでで気づいた方が多いと思いますが、実は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);
- }
- }