MetaTrader 4 プログラム初級編

自動売買システムの作り方 前編



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

 証券会社の採用しているMetaTrader4によっては、ストップロスとリミットをポジションを取得する時同時に注文すると、注文がキャンセルされる仕様があります。

 この場合、ポジションが約定した後にストップロスとリミットを入れることになります。

 これは、MetaTrader4の不具合ではなく、後からストップロスとリミットを入れればよいというだけの仕様となっています。

 こちらでストップロスとリミットを後から注文するやり方を説明していますので、参考にしてください。


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

 今回から、いよいよ実際に自動売買出来るシステムの製作に移って行こうと思います。


 あまりにも長くなってしまいましたので、前編後編で分けます。



 今回から、内容が長く複雑になりますが、少しずつ理解して行けば出来ないことはありませんので頑張ってください。


 また、サンプルプログラムを作っておきましたので、エラーが出た場合などはこちらを参考にして下さい。


 サンプルプログラム
 http://jidoubaibai.com/Samples/Sample%20%20iMA.mq4


 サンプルプログラムの使い方は、MetaTrader 4 プログラム入門 part6 システムの導入方法で説明しています。




 では、いつもと同じようにMetaEditorを起動して下さい。


 NameはiMAにして置いて下さい。


 int start()の中のreturn(0);の上辺りに次のコードを書いてください。


 今回もまとめて書きますね。


 今回は少し長いですが、頑張ってコードを書いてください。



//変数の宣言
int cnt, CurrentPosition;
int Ticket;
double kakoa,gennzaia;
double kakob,gennzaib;

// オーダーチェック(ポジションなどのデータ)
CurrentPosition=-1;
for(cnt=0;cnt < OrdersTotal();cnt++){
 OrderSelect(cnt,SELECT_BY_POS);
 if(OrderSymbol() == Symbol()) CurrentPosition=cnt;
 }

 //一時間前の21日線
 kakoa = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
 //一時間前の90日線
 kakob = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);


 //現在の21日線
 gennzaia = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
 //現在の90日線
 gennzaib = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,0);


// ポジションチェック ポジション無し
 if(CurrentPosition == -1)
 {
  //もし21日線が90日線を下から上にクロスしたら
  if( kakoa < kakob && gennzaia >= gennzaib)
  {
   //買いポジションを取る
   Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Blue);
  }
 }




 書けましたか?


 今回は今までと比べるとかなり複雑なので、ほとんど分からないと思いますが、慣れればそれほど難しくないので、頑張ってください。


 では、説明して行きます。


 まず、頭に//が付いているのはコメントです。


 出来るだけ分かり易くするようにコメントを書いています。


 また、自分で作る時もこういう風にコメントを付けていけば、あとでプログラムを見直すときに分かりやすいです。



//変数の宣言
int cnt, CurrentPosition;
int Ticket;
double kakoa,gennzaia;
double kakob,gennzaib;


 これは、変数の宣言です。


 doubleは小数点以下の数字を含むときに使います。 


 今回は移動平均のデータなどを入れるのに使います。




// オーダーチェック(ポジションなどのデータ)
CurrentPosition=-1;
for(cnt=0;cnt < OrdersTotal();cnt++){
 OrderSelect(cnt,SELECT_BY_POS);
 if(OrderSymbol() == Symbol()) CurrentPosition=cnt;
}



 これは、今現在ポジションを持っているかどうかなどを調べます。


 これは説明するとかなり長く複雑になりますので、このコードを書けばオーダーチェックしてくれるという使い方だけ覚えてください。



//一時間前の21日線
kakoa = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
//一時間前の90日線
kakob = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);

//現在の21日線
gennzaia = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
//現在の90日線
gennzaib = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,0);



 これは、変数に移動平均のデータを入れています。


 iMA()というのは、移動平均の関数です。


 Print()等と同じものです。


 ()の中にデータを入れると移動平均のデータを算出してくれます。


 このデータはMetaEditorで関数を書いて、そこにカーソルを置いてF1キーを押せば、関数の内容が英語ですが出てきます。


 iMAだとこんな風に出てきます。


double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)


 ()の中の内容を一つずつ説明すると次のようになります。




 string symbol


 どの通過ペアなのかを表すシンボルです。


 基本的に選択された通過ペアで行うNULLを入れておけば問題ありません。




 int timeframe


 時間足等のタイムフレームです。


 基本的に0を入れておけば問題ないです。


 選択されたタイムフレームで行ってくれます。




 int period


 移動平均線の期間です。


 21日移動平均線にしたい場合は21と入力し、90日移動平均線にしたい場合は90と入力します。


 今回は二つの移動平均線がクロスした時に売買するシステムを作りますので、変数kakoaとgennzaiaに21と入力し、変数kakobとgennzaibに90と入力しています。



 int ma_shift


 移動平均線をシフトするバーの数です。


 よく分からない場合は0と入力しておけば問題ないです。




 int ma_method


 移動平均線の種類です。



 単純移動平均指数平滑化移動平均などの移動平均の方法です。


 MODE_SMA
 MODE_EMA
 MODE_SMMA
 MODE_LWMAの四種類あります。


 今回は、単純移動平均線の MODE_SMAを使います。




  int applied_price


 始値、高値、安値、終値など、どのデータを使用して移動平均線を作るかです。


 PRICE_CLOSE
 PRICE_OPEN
 PRICE_HIGH
 PRICE_LOW
 PRICE_MEDIAN
 PRICE_TYPICAL
 PRICE_WEIGHTEDの7種類あります。


 今回は終値のPRICE_CLOSEを使います。




  int shift


 移動平均線の時間をシフトする数値です。


 0なら現在の移動平均、1なら一つ前の足の移動平均のデータが入ります。


 1時間足なら、一時間前の移動平均のデータが入ります。


 今回は売買ルールで現在のデータと一つ前の足のデータが必要になりますので、変数kakoaとkakobに1と入力し、変数gennzaiaとgennzaibに0と入力しています。




 例えば、kakoa = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);の場合は、


 変数kakoaに一つ前の足の21日移動平均のデータを入れています。



 これで、関数iMAの説明は終わりです。


 かなり複雑だと思いますが、ほとんど関数は似たようなものなので、一度理解すれば大抵の関数が使えます。


 頑張ってください。


 さて、次に売買注文の関数が残っていますが、かなり長くなってしまったので、次回に説明します。



--------------------------注意---------------------------

 半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。
 実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。

<< Blud600以降の警告について | TOP | 自動売買システムの作り方 後編 >>

トップページ プロフィール ブログ リンク オーダーシステム 利用規約 問い合わせ