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

このサイトでは、FXで完全自動売買を行うために必要な情報を書いていこうと思っています。システムを自分で作りたい方、システムトレードをやってみたい方は御覧になっていって下さい。
<< ドテン売買の仕方 | main | オリジナル関数の作り方 >>
MACD関数の使い方
 新しく始めたオーダーメイドシステムのサービスですが、数人から問い合わせが来て、2人の方がサービスに申し込んでくれました。

 有難うございます。

 しかし、やはり値段が高いようです。

 システムを作るのは私だけなので、余り多く申し込まれても処理できないと思い値段を高めにつけていたのですが、まだ時間的に余裕がありそうなので、価格を3万円に下げることに決めました。

 先に申し込まれている2人の方も不公平なので、振り込まれる時の金額は3万円にさせて頂きます。

 ですが、一ヶ月に作れるシステムの数が10個ぐらいが限界なので、申し訳ありませんが一月10人の制限をさせて頂きます。

 ご了承のほどを宜しくお願い致します。

 http://jidoubaibai.com/Ordersystem.html



 さて、本文ですが、その前にちょっと訂正箇所があります。(過去の記事は訂正しておきましたので、この記事の日付より後に前回の記事を読んだ人は大丈夫ですので、読み飛ばしてください。)

 変数の宣言のときに、iMAの値を入れる変数の型をint型にしていましたが、double型の間違いでした。

 申し訳ありません。

 int kakoa,gennzaia;
 int kakob,gennzaib;
 
 以前作ったプログラムの中の上のコードを、下のコードに書き換えて置いてください。

 double kakoa,gennzaia;
 double kakob,gennzaib;

 宜しくお願いします。

 変数の型が違うだけで、バックテストの結果が物凄く変わってきますので、皆さんも気をつけてください。
 


 ここから本文です。

 今回はMACD関数の説明をします。

 サンプルプログラムはこちらです。

 http://jidoubaibai.com/Sample%20MACD.mq4

 サンプルプログラムの使い方は、こちらで説明しています。 

 http://jidoubaibai.com/burogu11.html


 では、MetaEditorを起動して下さい。

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

 内容はほとんど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;
   }

   //一つ前のMACDのメイン
   kakoa = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   //一つ前のMACDのシグナル
   kakob = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);

   //現在のMACDのメイン
   gennzaia = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   //現在のMACDのシグナル
   gennzaib = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);


   // ポジションチェック ポジション無し
   if(CurrentPosition == -1)
   {   
      //もしメインがシグナルを下から上にクロスしたら
      if( kakoa < kakob && gennzaia >= gennzaib)      
      {
         //買いポジションを取る  
         Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Red);
               
      }  
      
      //もしメインがシグナルを上から下にクロスしたら
      if( kakoa > kakob && gennzaia <= gennzaib)     
      {
         //売りポジションを取る  
         Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3,  Bid+(200*Point), Bid-(200*Point), "Sell", 0, 0, Blue);
               
      }  
         
           
   
   }
   // ポジション有り
   else 
   {
      
      //ポジションの選択
      OrderSelect(Ticket,SELECT_BY_POS);
      
      //ポジションの確認
      if(OrderSymbol() == Symbol())
      {  
         //もし買いポジションだったら
         if(OrderType()==OP_BUY)    
         {
            //もしメインがシグナルを上から下にクロスしたら
            if( kakoa > kakob && gennzaia <= gennzaib)
            {
               //手仕舞い
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
               
               //ドテンで売りポジションを取る  
               Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3,  Bid+(200*Point), Bid-(200*Point), "Sell", 0, 0, Blue);
            }
         
         }
         //もし売りポジションだったら
         else if(OrderType()==OP_SELL)
         {
            //もしメインがシグナルを下から上にクロスしたら
            if( kakoa < kakob && gennzaia >= gennzaib)      
            {
               //手仕舞い
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);
               
               //ドテンで買いポジションを取る  
               Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3,  Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Red);
            }
         }
      }
   
      
   }
   return(0);
}


 書けましたか?

 前回と見比べて貰えれば分かると思いますが、下のコードが変わっただけです。

   //一つ前のMACDのメイン
   kakoa = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   //一つ前のMACDのシグナル
   kakob = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);

   //現在のMACDのメイン
   gennzaia = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   //現在のMACDのシグナル
   gennzaib = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);


 前回のプログラムは変数に入れていたのがiMA関数でした。

 今回は、このiMACD関数の説明です。

 まず、日本語で内容を書きますね。


 iMACD関数(通貨ペア、タイムフレーム(時間足)、短期EMA、長期EMA、シグナル、値を取る時間(始値、終値など)、モード、シフト)


 iMAと似ている部分がありますので、簡単に説明していきます。

 
 通貨ペアとタイムフレームはiMAと同じです。

 基本的にNULLと0と入力しておけば問題ありません。


  短期EMA、長期EMA、シグナルはMACDの使い方と同じです。

 
 値を取る時間は、今回は終値にします。

 PRICE_CLOSEと入れて置いてください。


 モードはMACDのメインの線かシグナルの線かを選択します。

 メインならMODE_MAIN、シグナルならMODE_SIGNALと入力します。


 シフトは数字を入れることによって、その数字分前の足のデータを入力出来ます。

 0は現在のデータ、1なら1つ前の足のデータです。

 今回も前回のiMAと同じゴールデンクロスとデッドクロスが売買条件ですので、0と1の両方を変数に入れています。


 これで、今回のプログラムの説明は終了です。

 今回のプログラムは、MACD(短期12,長期26,シグナル9)のメインとシグナルのゴールデンクロスとデッドクロスで仕掛けをして、手仕舞いはその逆のルール、手仕舞いと一緒にドテンするというものです。

 一応、ストップとリミットを200pipsつけています。

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

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

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

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

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



iMACD レポート ドル円一時間足




iMACD グラフ ドル円一時間足




 今回はこれで終了です。

 次回はオリジナルの関数の作り方です。



 

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



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


----------------------注意----------------------
 このブログは半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。
 実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。
| 小松 | MetaTrader4 プログラム初級編 | 19:42 | comments(4) | - |
初めまして。初心者としてこのブログの最初のエントリーから熟読させて頂きました。とても勉強になりました。
ところで、今回のMACDサンプルですが実際にテストすると「買い」ばかりして「売り」をしてくれないようです。「結果」の欄を見ると、buyの文字ばかり並んでいます。買いの回数も少ないようです。私のテストのやり方が悪いのでしょうか?あと、もう一つ気づいたことはMACDのことです。MACDのゴールデンクロスとデッドクロスが実現した次の時間足の始値で売買すると思うのですが、このプログラムだとGCが実現した時間足の始値にさかのぼって売買しているように思います。コメントいただければ幸いです。これからもエントリーに期待しております。
| popper | 2007/04/14 10:18 PM |
 popperさん、初めまして。
 管理人のDCです。

 MACDサンプルの件ですが、売りのところのストップとリミットにミスがあり、売りが行われていませんでした。
 
 申し訳ありません。
 サンプルプログラムと本文のほうは訂正しておきました。



 あと、売買ルールの方ですが、GCとDCが出来た瞬間にしています。

 もしかしたら、私が間違っているかもしれませんので、始値に遡って売買していると思った理由を書いてもらえませんか?

 宜しくお願いします。
| DC | 2007/04/14 11:19 PM |
こんにちは。popperです。早速、MACDと移動平均のプログラムをバックテストで使わせていただきました。MACDのほうについてEvery Tickでテストしたほうが、売買漏れが少ないようですね。移動平均ではEvery Tickだと余計な売買をしてしまうようです。Open Priceのほうが良いようです。
売買ルールについてですが、このサンプルプログラムでは、クロスが実現するタイミングは、ある時間足の終値(Price Close)でプログラムされていると思います。そこから直近の売買可能なタイミングは、次の時間足の始値ではないでしょうか。クロスが実現されている時間足の始値で売買することは不可能だと思います。なので、売買のタイミングを一つずらす必要があるように思います。
| popper | 2007/04/16 10:53 PM |
 こんばんは、DCです。

 確かに、Open Priceの場合は、足の始値の時にしかstart関数が呼び出されませんから、下のコードにした方が良いみたいですね。

//一つ前のMACDのメイン
kakoa = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
//一つ前のMACDのシグナル
kakob = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2);

//現在のMACDのメイン
gennzaia = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
//現在のMACDのシグナル
gennzaib = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);


 ただ、このコードにするとOpen Price以外のモードの時と、リアル売買するときに売買ルールが変わってしまいます。

 リアル売買は、tick毎にstart関数が呼び出されるからです。

 面倒ですが、使用するモードごとに違うコードのプログラムを作ったほうが良いみたいですね。
| DC | 2007/04/17 1:42 AM |









 123456
78910111213
14151617181920
21222324252627
28293031   
<< May 2017 >>



このページの先頭へ