オリジナル関数の作り方

Eyecatch MetaTrader 4 プログラム中級編

MetaTrader 4のバージョンアップにより仕様が変わってきた部分がありますので、 記事を新しい仕様で書き直しております。この注意書きが書かれていないページは 旧仕様の記事になります。旧仕様の記事でも一部を除き基本的にはシステムの制作に問題はありません。

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

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

 サンプルプログラムはこちらです。Zip圧縮していますので解凍してご利用ください。

 サンプルプログラムの使い方は、以下の記事で説明しています。 

オリジナル関数の作り方

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

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

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

void OnTick()
{
   //変数の宣言
   int cnt, CurrentPosition;
   int Ticket;   
   
   int order_close = NULL;

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

   


   // ポジションチェック ポジション無し
   if(CurrentPosition == -1)
   {   
      //もしメインがシグナルを下から上にクロスしたら
      if( CrossMACD(12,26,9) == 1 )      
      {
         //買いポジションを取る  
         Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 30, 0, 0, "Buy", 0, 0,clrBlue);
      }  
      
      //もしメインがシグナルを上から下にクロスしたら
      if( CrossMACD(12,26,9) == 2)     
      {
         //売りポジションを取る  
         Ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 30, 0,0, "Sell", 0, 0, clrRed);
      }  
         
           
   
   }
   // ポジション有り
   else 
   {
      
      //ポジションの選択
      if( OrderSelect(CurrentPosition,SELECT_BY_POS) == true )
      {
         //通貨ペアの確認
         if(Symbol() == OrderSymbol())
         {
            //もし買いポジションだったら
            if(OrderType()==OP_BUY)    
            {
               //もしメインがシグナルを上から下にクロスしたら
               if( CrossMACD(12,26,9) == 2)
               {
                  //手仕舞い
                  order_close = OrderClose(OrderTicket(),OrderLots(),Bid,30,Green);
   
               }
         
            }
            //もし売りポジションだったら
            else if(OrderType()==OP_SELL)
            {
               //もしメインがシグナルを下から上にクロスしたら
               if( CrossMACD(12,26,9) == 1)      
               {
                  //手仕舞い
                  order_close = OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);
               
               }
            }
         }      
      
         
      }
   
   }   
   
   
   
   

}



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

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

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

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


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


   return(0);
}


 書けましたか?

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

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

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

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

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

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

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

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

型 関数名(引数)
{
 内容

 return(戻り値)
}

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

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

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

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

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

 次に、引数です。

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

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

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

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

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

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

old_main = 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が必要ないvoid型以外はreturn();が無かったらその関数が終わりませんので、最後に絶対に一つは書いて置いてください。

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

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

CrossMACD(12,26,9);

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

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

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

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

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

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

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

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


 今回はこれで終了です。

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

注意

内容には注意を払っていますが、保障は出来ません。
実際に運用する場合は、自己責任でお願いします。 

タイトルとURLをコピーしました