システムトレード研究所 〜FXで完全自動売買〜

このサイトでは、FXで完全自動売買を行うために必要な情報を書いていこうと思っています。システムを自分で作りたい方、システムトレードをやってみたい方は御覧になっていって下さい。
<< 自動売買システムの作り方 前編 | main | 手仕舞いの仕方 >>
自動売買システムの作り方 後編
 前回の続きです。

 前回はiMA関数の説明まででしたね。

 今回は残りの注文を出すときの関数の説明をします。


 // ポジションチェック ポジション無し
 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);
   }
 }


 まず、if(CurrentPosition == -1) ですが、これは最初のほうでオーダーチェックしたときに変数にポジションを持っているかどうかを入れておき、if文でポジションを持っているかどうか調べています。

 このコードを書かないと、売買条件が一致したらポジションがどんどん増えて行きます。


 次に、if( kakoa < kakob && gennzaia >= gennzaib) ですが、これは売買ルールです。

 日本語にすると「もし、1時間前の21日移動平均線が一時間前の90日移動平均線の下にあって、そして現在の21日移動平均線が現在の90日移動平均線の上にあったら処理をする」という内容になります。

 簡単に言うと、移動平均のゴールデンクロスです。

 ここで、何故一時間前の移動平均線の条件を入れているかを考えてください。

 プログラムを組むことにあまり慣れていない人はパッと思いつかないと思いますが、プログラムは人間と違って融通が利きません。

 人間だったら違和感を覚えることでも、プログラムは戸惑うことなく忠実に実行してくれます。

 もちろん機械だから当たり前で、むしろそこが利点なのですが、プログラミングする人間はそのことをよく理解しておかなければなりません。

 もし、一時間前の条件を入れずに、if( gennzaia >= gennzaib) とコードを書くと、21日移動平均線が90日移動平均線をゴールデンクロスした瞬間だけではなく、21日移動平均線が90日移動平均線の上にあり続ける限りずっと買いポジションを立て続けます。

 先程、ポジションチェックをしているので、実際には買い続けるということはないのですが、それでもポジションが無くなった時に、21日移動平均線が上にあったら、ポジションが無くなった瞬間に買いポジションを立てることになります。

 私も初めてプログラミングをした時は、この間違いをしてしまい、何が間違っているのかをずっと考えました。

 if文の条件分岐は、頻繁にこういうことがあるので、使うときはどういう条件かをよく考えてから使用すると良いと思います。

 
 最後に、Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Blue);  ですね。

 OrderSend()は、売買注文を出すときに使う関数です。

 日本語に訳すと次のようになります。


 オーダー関数(通過ペア、注文内容、ロット数、レート、スリップページ、損切り幅、利食い幅、コメント、マジックナンバー、有効期限、色)

 
 内容を一つずつ説明して行きますね。


 通貨ペア

 どの通貨ペアを売買するかを選択します。

 文字列型で ”EURUSD” という風に入力できますが、選択された通貨ペアを自動で選択するSymbol() を入れておくのが一番無難です。


 注文内容

 成り行きの買い注文、成り行き売り注文などの注文内容のことです。

 OP_BUY で成り行き買い、OP_SELL で成り行き売りです。

 一応、指値注文と逆指値注文も出来ますが、システムトレードの性質上ほとんど使うことが無いので、基本的に成り行き注文だけで大丈夫です。


 ロット数

 注文する枚数のことです。

 1ロットで10万通貨です。

 1万通貨だけ買いたい場合は、0.1と入力して下さい。


 レート

 成行注文する時のレートです。

 買いならAsk、売りならBitと入力します。

 AskとBitはそれぞれの現在のレートを入手してきてくれます。


 スリップページ

 スリップページの幅を設定します。

 1で1pipsです。

 3と入力しておくのが無難だと思います。


 損切り幅

 損切りの設定です。

 損切りしないなら、0と設定しておけば大丈夫です。

 設定する場合は、この関数が若干不親切で、ポジションから何pipsではなく、レートを指定しなければなりません。

 Ask-(200*Point) これで、200pipsの損切りを付けた事になります。

 Askは現在のレートを出すだけのものですが、買った瞬間に出すわけですから、買った時と同じレートです。

 そこから、200pips引いたレートを設定します。(Pointをかけているのは数字をpipsにするためです。)

 
 利食い幅

 損切りと同じように設定して下さい。

 ただ、利食いですので、現在のレートよりは上に設定して下さい。

 下に設定するとシステムが変になります。


 コメント 

 注文にコメントを付ける事が出来ます。

 文字列型ですので、付ける場合は””を付けて、中に内容を書いてください。

 要らない場合はNULLと入力して下さい。


  マジックナンバー

 マジックナンバーを付ける事が出来ます。

 滅多に使いませんので、よく分からない場合は0と入力して下さい。


  有効期限

 注文の有効期限を設定できます。

 システムトレードの性質上、滅多に使う機会がないと思いますので、0と入力しておいて下さい。


 

 チャート上に出る矢印の色を設定出来ます。

 半角英数で色を英語で書いてください。(頭文字は大文字で)

 赤ならRed、青ならBlueになります。

 結構色々な色がありますので、余程マイナーな色でない限りはあると思います。



 最後に、何故Ticket =OrderSend()と書いてあるのかですが、関数には戻り値と呼ばれるものが設定されていることがあります。

 戻り値とは、その関数を使用したときに計算結果などを返してきてくれるものです。

 OrderSend()関数は、チケットナンバーを返してくるので、それを変数に入れました。

 
 これで、OrderSend()関数の説明は終了です。

 自動売買するシステムを作るときは必ずOrderSend()関数を使いますので、使い方を覚えておいて下さい。


 さて、かなり長くなりましたが、これで今回のプログラムは終了です。

 では、まとめてもう一度プログラムを書きます。



iMA プログラム




int start()
{
 //変数の宣言
 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);
   }
 }
 return(0);
} 
 
 
 今回のプログラムは、移動平均線がゴールデンクロスした時に買い、手仕舞いは指値か逆指値でするというものです。

  では、コンパイルをするためにcompileのボタンを押してください。

 エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。

 どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。

 エラーが出なかったら、MetaTrader4のバックテストでiMAを選んで、スタートして下さい。

 終わったら、結果、Graph、レポートを見てください。



iMA グラフ




 今回はこれで終了です。

 かなり難しかったと思いますが、これを理解できるようになれば、あとはルールを変更するだけで自分だけの自動売買システムを製作することが出来ますので、頑張ってください。

 次回は、手仕舞いの説明をして行きます。

 

 

 宜しかったら、応援して下さい



システムトレード研究所〜FXで完全自動売買〜INDEXへ


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

| 小松 | MetaTrader4 プログラム初級編 | 22:05 | comments(6) | - |
Metatraderにカスタムインディケータを導入し、これにより(experts>)filesに、シグナルが書かれたテキストファイルがはきだされる仕組みを使っている者です。
そのシグナルを読み出して注文する自動売買システムを作りたいのですが、この場合どのようにしてプログラムを書けばいいのでしょうか?
そのテキストファイルを丸ごと読み出すことまでは
できるようになったのですが、値だけを取り出し、この値
で注文するプログラムの記述方法がどうしてもわかりません。
よろしくお願いします。
| ぶっきー | 2007/11/30 7:36 AM |
>>ぶっきーさん

 初めまして、ここの管理人のDCです。

 カスタムインジケーターの値を取り出す場合はiCustom関数を使用すれば可能です。
| DC | 2007/11/30 1:10 PM |
ありがとうございました。
iCustom関数を調べてみます。
| ぶっきー | 2007/12/02 8:35 AM |
すみませんが、2度目の質問です。
どうかよろしくおねがいします。

「(experts>)filesにあるテキストファイルの、
4行目の文字列が"LONG"ならば」ということを
記述したいと思い、いろいろなブログやリファレンス
を参照しながら、

int offset[10];
int no=4;
int handle;

handle=FileOpen("files\ファイル名.txt",FILE_READ,';');
FileSeek(handle,offset[no-1],SEEK_SET);
if(FileReadString(handle)=="LONG")
 {

  }

上記のように記述したのですが、
エラーは出なかったものの、DEMO口座で
うまくいきませんでした。
どこか文法的にミスがあるでしょうか?
| ぶっきー | 2007/12/03 6:48 PM |
>>ぶっきーさん。

 FileOpen()はあまり使ったことがないので詳しいことは分からないのですが、とりあえずFileOpen()を使った後はFieClose()を使ってファイルを閉じなければなりません。

 これで直らなかった場合はComment()関数などで戻り値を確認しながらデバッグしてみると何か分かるかもしれません。

 あまりお役に立てずにすみません。
| DC | 2007/12/04 4:32 PM |
ありがとうございました。戻り値を確認しながらいろいろ試してみます。
| ぶっきー | 2007/12/06 11:56 AM |









  12345
6789101112
13141516171819
20212223242526
2728293031  
<< January 2019 >>



このページの先頭へ