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

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

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

プログラムの書かれている順に説明するなら手仕舞いになるのですが、

先に仕掛の方を説明します。


仕掛けの条件は以下の通りです。

<買いエントリー>
・終値ベースで、為替レートとMACDラインが前日の値よりも大きくなる時は【成行で買いエントリー】



で、この条件をプログラムしたものが以下です。

//仕掛判断
   if(entrybar!=Bars && buypos==0 && Close[1]>Close[2] && macd1>macd2)
   {
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",magic01,0,Blue);
      entrybar=Bars;
   }



終値ベース、

ということなので、完成したローソク足の値のみを扱うことになり、

ローソク足が次の足に移った時に判断します。


為替レートとMACDラインが前日の値よりも大きくなる時、

は、終値ベースの為替レートつまりローソク足の終値が前日より上がり、

MACDのラインが前日の値より大きくなるということです。

例えば、下の画像の青矢印がこの条件に当てはまるポイントです。


ポイントから1本過去と2本過去の終値を比べると上がっています。

MACDのラインは赤のラインで、このラインも1本過去と2本過去では大きくなっています。

終値だけなら、2本過去と3本過去でも上がっていますが、

この時のMACDラインは下がっていますので条件に当てはまりません。


この部分を表しているのが、

Close[1]>Close[2] && macd1>macd2

です。

それぞれ1本過去と2本過去の値を比べて、1本過去のものが大きい時という表し方です。

その前の、

buypos==0

は、ポジションがない時という意味です。

仕掛の判断をする前に、ポジションの数を数えます。

今回は複数のポジションを持たないので、ポジションが0の時、

すなわちポジションがない時のみ注文を出すようにしています。


また、買いの発注の際に、

entrybar=Bars;

としています。

Bars はチャートのローソク足の本数を数える関数です。

ローソク足は、新しい足になると本数が増えますが、次の足になるまで本数が増えません。

entrybar に仕掛けたローソク足を覚えておくのに使用します。

判断の条件に、

entrybar!=Bars

としているのは、仕掛けた時のローソク足の数と、

現在のローソク足の数を比べて事なっている時、という設定です。

これは、一度入った足で再度入らないようにするためです。

この設定をしておくと、仕掛けた足でポジションを決済した場合でも、

そのローソク足では再度仕掛けることはありません。

その時のロジックに合わせて設定してください。

それでは次回、決済の説明をしますね。




   
【送料無料】使える売買システム判別法

【送料無料】使える売買システム判別法
価格:2,940円(税込、送料別)

それでは、少しずつ解説します。

最初の宣言項目ですが、start内で使用する変数を2つ宣言しています。

何に使うかはとりあえず飛ばします。(;^_^A

次に、startです。

最初にポジションの計算をやります。

これは以前にも使用したものです。

ポジションの計算に関する記事


次に、指標の計算をやります。

今回はMACDを使うので、iMACDを使用します。

iMACDに関する記事


その次の、

   if(entrybar==Bars) entrylow=Low[0];


は、手仕舞いの条件のところに関係しています。

エントリーした時のBarsの数をentrybarに覚えておき、

ローソク足の数が変わらなければ、entrylow に安値を記録します。


んじゃ続きは次回にします~




 
それではプログラムしていきます。

とりあえず、先に買いだけ作成します。


初期宣言の部分に以下を追加します。

int entrybar;
double entrylow;





そして、start部分に以下を追加します。

//ポジション計算
   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++;
        }
     }

//指標計算
   double macd1=iMACD(NULL,0,FastEMA,SlowEMA,MACDSMA,PRICE_CLOSE,MODE_MAIN,1);
   double macd2=iMACD(NULL,0,FastEMA,SlowEMA,MACDSMA,PRICE_CLOSE,MODE_MAIN,2);

   if(entrybar==Bars) entrylow=Low[0];
  
//手仕舞い判断
   if(entrybar!=Bars && buypos!=0
      && (entrylow>Close[1] || (Close[1]<Close[2] && macd1<macd2)))
   {
      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);
         }
      }
   }

//仕掛判断
   if(entrybar!=Bars && buypos==0 && Close[1]>Close[2] && macd1>macd2)
   {
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",magic01,0,Blue);
      entrybar=Bars;
   }



次回から解説していきます。