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

このサイトでは、FXで完全自動売買を行うために必要な情報を書いていこうと思っています。システムを自分で作りたい方、システムトレードをやってみたい方は御覧になっていって下さい。
<< MACD関数の使い方 | main | 不具合の説明 >>
オリジナル関数の作り方
---------------------------------------------------------------------
 前回のサンプルプログラムに売りが行われないミスがありましたので、修正しました。

 前回のサンプルプログラムをダウンロードされた方は、もう一度ダウンロードして書き換えて置いてください。
 申し訳ありませんでした。
---------------------------------------------------------------------


 お久しぶりです。

 しばらく風邪で寝込んでいて、更新できませんでした。

 すみません。

 ここ数年ほとんど病気にはかからなかったのですが、こないだの病気で免疫力が落ちたのかもしれません。

 今回の件で、健康管理は大事だなとひしひしと感じました。

 皆さんも気をつけてください。



 ところで、風邪で寝込んでいる間に暇だったので以前から構想だけ練っていた新しいシステムを作ってみました。

 http://www.systectrade.com/indivsys.php?sid=161

 宜しかった御覧下さい。

 複数のシステムを組み合わせて、ポートフォリオのようにリスクを分散できないかと考え、成績が良かったシステムを複数組み合わせてみました。

 バックテストだけならなかなか良かったので、これから安定性があるかどうかリアル売買で確かめてみます。



 さて、本文です。

 今回は、オリジナル関数の作り方でしたね。

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

 http://jidoubaibai.com/Sample%20New%20Kannsuu.mq4

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

 http://jidoubaibai.com/burogu11.html

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

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

 では、まとめてコードを書きますので、同じようにコードを半角英数で書いていってください。




int start()
{
   //変数の宣言
   int cnt, CurrentPosition;
   int Ticket;   

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

   


   // ポジションチェック ポジション無し
   if(CurrentPosition == -1)
   {   
      //もしメインがシグナルを下から上にクロスしたら
      if( CrossMACD(12,26,9) == 1 )      
      {
         //買いポジションを取る  
         Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(200*Point), "Buy", 0, 0, Red);
      }  
      
      //もしメインがシグナルを上から下にクロスしたら
      if( CrossMACD(12,26,9) == 2)     
      {
         //売りポジションを取る  
         Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3,  Bid+(200*Point), Bid-(200*Point), "Sell", 0, 0, Blue);
      }  
         
           
   
   }
   // ポジション有り
   else 
   {
      
      //ポジションの選択
      OrderSelect(CurrentPosition,SELECT_BY_POS);
      
      //通貨ペアの確認
      if(Symbol() == OrderSymbol())
      {
         //もし買いポジションだったら
         if(OrderType()==OP_BUY)    
         {
            //もしメインがシグナルを上から下にクロスしたら
            if( CrossMACD(12,26,9) == 2)
            {
               //手仕舞い
               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( CrossMACD(12,26,9) == 1)      
            {
               //手仕舞い
               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);
}



/*------------------------------------------------------
関数名   CrossMACD
内容     MACDのゴールデンクロスとデッドクロスを判断する関数

引数     int fast    短期EMA
        int slow    長期EMA
        int signal  シグナル
         
戻り値   0:何も出来ていない 1:ゴールデンクロス
         2:デッドクロス
-------------------------------------------------------*/
int CrossMACD(int fast,int slow,int signal)
{
   double kakoa,gennzaia;
   double kakob,gennzaib;
     

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

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


   //もしメインがシグナルを下から上にクロスしたら
   if( kakoa < kakob && gennzaia >= gennzaib)      
   {
      return(1);
   }  
   
   //もしメインがシグナルを上から下にクロスしたら
   if( kakoa > kakob && gennzaia <= gennzaib)     
   {
      return(2);
   }  


   return(0);
}




 書けましたか?

 今回は、関数というものを新しく作り、その中でMACDのゴールデンクロスとデッドクロスを見分ける処理をさせています。

 関数というものは、呼び出すたびに関数の中の処理をまとめて行ってくれるものと覚えて置いてください。

 関数を作ってまとめることで、プログラムの中身が分かりやすくコンパクトになります。

 また、一度作ってしまえば、他のプログラムにコピーすることによって、作業が楽になります。


 では、内容の説明をして行きますね。

 前回と違うのは、 if( CrossMACD(12,26,9) == 1 ) このコードと、start関数より下の新しく作った関数ですね。

 まず、関数の作り方を説明して行きます。

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

型 関数名(引数)
{
  内容

  return(戻り値)
}

 見慣れない言葉があると思いますので、もう少しバラして説明して行きますね。

 
 まず、型 関数名()です。

 これは、変数の宣言とほとんど同じです。

 int型などの型を宣言して、次に好きな関数名を入れてください。

 型は、後で説明する戻り値の型になりますので、それを考慮して下さい。



 次に、引数です。

 int CrossMACD(int fast,int slow,int signal) の()の中にあるものが引数です。

 これは、関数を使うときにパラメーターなどを入力出来るようにするためのものです。

 今回はMACDを計算する時のパラメーターを入力出来るようにしています。

 引数は、変数と似たような使い方が出来ます。

 関数を呼び出すときに、CrossMACD(12,26,9)と入力していれば、fast,slow,signalにそれぞれ12,26,9が入っています。

 後は、変数と同じように下のコードのように使えます。

 kakoa = iMACD(NULL,0,fast,slow,signal,PRICE_CLOSE,MODE_MAIN,1);

 
 引数の宣言の仕方も変数の宣言の仕方とほとんど同じです。

 ()の中に、型と好きな引数名を書くだけです。

 複数ある場合は、,(カンマ)を間に入れてください。

 また、引数が不要の場合は、()の中に何も書かなくても問題ありません。



 最後に、戻り値です。

 これは、関数から戻ってくる値です。

 return(戻り値); この()の中に戻り値を書けば、関数から値を渡すことが出来ます。

 計算結果の答えなどを返すのに使います。

 例を出すと、CrossMACD(12,26,9);と入力して、関数の最後がreturn(1);だった場合は、CrossMACD(12,26,9);の中には1が入っています。

 ですので、if(CrossMACD(12,26,9) == 1){}というような使い方が出来ます。

 また、このreturn();はこれが使われた時点でその関数は終了するので、次のようにも使えます。

if(条件1)
{
  return(1);
}
else if(条件 2)
{
  return(2);
}

return(0);


 このように、計算結果が条件に当てはまったら、その条件によって戻り値を変えて、どの条件にも当てはまらなかったら0を返しています。

 最後に注意点ですが、return();が無かったらその関数が終わりませんので、最後に絶対に一つは書いて置いてください。



 関数の作り方の説明はこれで終わりです。

 次に作った関数の使い方です。

 CrossMACD(12,26,9);

 先程作った関数名(引数に入力する値)で使用出来ます。

 また、戻り値が中にありますので、if(CrossMACD(12,26,9)==1){}という使い方も可能です。 



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

 今回は関数を作っただけで、結果自体は前回と全く同じです。

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

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

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

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

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

---------------------------------------------------------------------
 popperさんに指摘されて気がついたのですが、リアル売買ではこのプログラムコードで正しいのですが、バックテストのOpen prices onlyの時だけ、このコードが間違いになります。(他の二つはこれで正しいです)

 start関数を呼び出すのがOpen prices onlyだけ始値の一度だけというのが原因なのですが、Open prices onlyだけは、変数の内容を下のようにしなければなりません。

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

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


 最後のシフトを1つずつ増やさなければなりません。

 ややこしいと思いますが、宜しくお願いします。

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



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




iMACD グラフ ドル円一時間足




 
 今回はこれで終了です。

 関数は一度作れば、次からのプログラムが楽になりますので、頑張って作ってみてください。 

 そろそろ内容が少し難しくなって来ましたので、次回から中級編にします。

 次回の内容は、複数のシステムによる自動売買の仕方です。




 

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



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


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

 また、内容には注意を払っていますが、保障は出来ません。
 実際に運用する場合は、自己責任でお願いします。
| 小松 | MetaTrader4 プログラム初級編 | 20:25 | comments(3) | - |
始めましてSと申します。
自動売買のブログを検索していてここにたどり着きました。
ちょっとお聞きしたいのですがよろしいでしょうか?

ヤフオクにVTを使った自動売買が高額で売買されていますが
VTなのでバックテストがあまりにも短く危険なのでは?と
個人的に思うのですがDCさんはどう思われますか?

| s | 2007/04/19 10:26 AM |
 初めまして、Sさん。
 DCです。

 実物を見てないのでなんとも言えませんが、基本的にバックテストが短いものは信頼性が低いと思います。
| DC | 2007/04/19 1:40 PM |
題名:為替ナビに投稿しませんか?

突然のコメント失礼致します。私、外国為替情報サイト「為替ナビ」(http://www.kawasenavi.com/)編集部の又吉と申します。為替ナビは外国為替証拠金取引に関する情報サイトです。中でも分析に主眼をおいており、個人投資家の為になる情報サイトを目指しています。今回、為替ナビはより充実したサイトとなる為、新たなコンテンツを追加いたします。内容としては、皆様の為替相場に対する考え方を投稿して頂き、ユーザーに様々な視点からの考え方をご紹介したいと思っております。

また1ヶ月間でより多くの閲覧者を集めた投稿者上位3名には、為替ナビから賞金(1位3万円 2位1万円 3位5千円) をプレゼントしたいと思っております。更に投稿して頂いたサイト様には、為替ナビからリンクさせて頂きますので、宣伝効果も非常に高く、より多くのユーザー獲得に貢献いたします。投稿内容に関しましても、外国為替証拠金取引に関わる内容でしたら一向に構いません。ブログの記事をそのまま投稿して頂いてもOK!

要点1:1ヶ月間で閲覧者を多く集めた投稿者には賞金。という事はより多くの記事を発表すれば有利
要点2:投稿して頂いたサイト様には、為替ナビからリンクさせて頂きますので、宣伝効果とSEO効果も抜群
要点3:投稿方法は記事の内容をフォームに入力するだけ。

投稿条件はサイトのトップページに為替ナビへのリンクを貼るだけですので、手間の掛かる作業は一切ございません。このコメントを御覧になって少しでも興味を持った方、あるいはご意見・ご質問がある方は、matayosi@kawasenavi.comまでご連絡下さい。

同コーナースタート予定は5月1日です。どうぞ宜しくお願い致します。

為替ナビ編集部 


| 又吉 正之 | 2007/04/19 5:56 PM |









    123
45678910
11121314151617
18192021222324
252627282930 
<< June 2017 >>



このページの先頭へ