メタトレーダー4でプログラムを作ってみよう -32ページ目

メタトレーダー4でプログラムを作ってみよう

無料のトレードソフトであるメタトレーダー4のプログラムを作るコツをアップします。初心者がインジケーターとEAのプログラムを作成できるのを目指します。

それでは~、今回も start の続きをやっていきましょう

//手仕舞い判断
   if(buypos!=0 && fast_ma1<slow_ma1 && fast_ma2>slow_ma2)
   {
      for(i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()!=magic01 || OrderSymbol()!=Symbol()) continue;
         if(OrderType()==OP_BUY)
         {
            OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         }
      }
   }

手仕舞い判断の続きですが、OrderClose が出てきます。

これは、保有ポジションを決済する関数です。

OrderClose(チケット番号, ロットサイズ, 価格, スリッページ, 決済の矢印の色);

で書きます。

チケット番号は、保有ポジションについてる固有の番号です。

通常は、OrderTicket() と書いておけば勝手に調べてくれます。

ロットサイズも、OrderLots() と書いておけば勝手に調べてくれます。

価格は、買いポジションの場合は Bid 、売りポジションの場合は Ask としておきます。

スリッページは通常 3 ぐらいにしているものが多いです。

大きくしておけばその分約定しやすくなりますが、

思っていた価格と開きが出るかもしれませんので、好みに応じて調整してください。

矢印の色は画面に表示される色ですので、これも好みの色があれば好きな色を選んでください。

それでは長くなりそうなので、続きはまた次回にします~




 
それでは~、start の続きをやっていきましょう

//指標計算
   double fast_ma1=iMA(NULL,0,ma1_Period,0,MODE_SMA,PRICE_CLOSE,1);
   double fast_ma2=iMA(NULL,0,ma1_Period,0,MODE_SMA,PRICE_CLOSE,2);
   double slow_ma1=iMA(NULL,0,ma2_Period,0,MODE_SMA,PRICE_CLOSE,1);
   double slow_ma2=iMA(NULL,0,ma2_Period,0,MODE_SMA,PRICE_CLOSE,2);

これは今までに出てきていますので、特に問題ないと思います。

短期と長期の移動平均線の1本前と2本前を計算します。

//手仕舞い判断
   if(buypos!=0 && fast_ma1<slow_ma1 && fast_ma2>slow_ma2)
   {
      for(i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()!=magic01 || OrderSymbol()!=Symbol()) continue;
         if(OrderType()==OP_BUY)
         {
            OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         }
      }
   }

手仕舞いの判断ですが、ポジション計算のところで設定した buypos が出てきます。

buypos!=0 というのは、0 以外の時ということです。

手仕舞いの判断は、保有ポジションを保有している時だけ判断すればいいわけです。

0 以外だと買いポジションがあるということなので、

買いポジを保有している時だけ { } 内を処理するように条件設定をしています。

そして、手仕舞いの条件を設定しています。

ポジションを保有していて、手仕舞いの条件を満たした場合だけ、 { } 内を処理するということです。


次のfor文で使っているのは、ポジション計算の時と同じで、

保有ポジションをポジション番号0番から順番に調べます。

ポジションが無くなったら、break でfor文を抜けるのも同じです。

次のif文は、マジックナンバーと通貨ペアを調べています。

もしどちらかが異なる場合は、continue することになっています。

continue はfor文の中で使用し、これ以降のプログラムを無視して、

次のfor文を実行しなさいということです。

例えば、保有ポジションが4個あると番号は、0 1 2 3 となります。

1番の処理中に、break があるとそこでfor文が終わりますので、

2 3 の処理は無視されます。

continue
 の場合は、1の途中で出てくると、1の処理は途中でやめますが、

次の 2 の処理がはじまります。

とにかく全部やめるのが、break

次に回すのが、continue

と覚えておいてくださいね

覚えることが多くて大変ですが、小学生にでもなった気分で覚えましょう。




   
それでは、残りの説明に入ります。

//ポジション計算
   int buypos=0;
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic01)
        {
         if(OrderType()==OP_BUY)  buypos++;
        }
     }



OrderSymbol() Symbol() はどちらも、通貨ペアを調べる関数です。

EURUSD や USDJPY などがわかります。

OrderSymbol() の方は、保有ポジションの通貨ペアを調べます。

Symbol() は、EAがセットされているチャートの通貨ペアを調べます。


OrderMagicNumber() は、保有ポジションのマジックナンバーを調べます。

この、if文で判断しているのは、通貨ペアとマジックナンバーを調べて、

EAがセットされているチャートで、そのEAが建てた玉かどうかを調べます。


OrderType() は、保有ポジションが買いか売りかを調べるのに使用します。

OP_BUY
 は、注文の種類が成り行き買いであることを表します。

そして、買いのポジションを保有していたら、buypos に1を加えます。


このポジション計算は、

保有ポジションを0から順番に調べる。

↓→もしポジションが存在しないなら、繰り返しの処理を抜ける。

保有ポジションの通貨ペアとマジックナンバーを調べる。


↓→通貨ペアとマジックナンバーが一致するポジションがあれば、1を加える。

保有ポジションの回数だけ繰り返し。


という流れです。

今回は買いポジションだけでしたが、売りポジションも必要な場合は同じように処理します。


保有ポジションの情報を調べるには、Order○○○ という関数になります。

Order が付いていたら、保有ポジション関連だなと覚えていてください。

では~~~