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

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

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

それでは、次に売りのロジックを付け足していきます。

まずは、仕掛の方です。

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

<どちらにも該当>
・既にポジションを持っているときはポジション維持


また、ポジション維持も少し考えます。


エントリーの条件は、買いと比べると使う指標は同じで大小の符号が逆になります。

買いポジションの決済の時に出てきたもので、

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

のようになります。


次に、ポジションの維持について少し考えます。

買いの条件の時に、buypos を使用して、buypos が0の時、

すなわち買いポジションがない時にだけ仕掛の条件を考えるとしました。

売りも同様に、sellpos を使用して売りのポジションの数を数えて、

sellpos が0のとき、すなわち売りポジションがない時だけ仕掛けるようにすればいいのですが、

買いのポジションを保有中に売りの条件に適合した場合、

売りのポジションを建てる可能性があります。

なので、買いも売りも仕掛けの判断をする時に、

買いと売りのどちらのポジションも持っていないことを確認する必要があります。

ポジション計算の部分を、

//ポジション計算
   int buypos=0;
   int sellpos=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++;
         if(OrderType()==OP_SELL) sellpos++;
        }
     }
   int totalpos=buypos+sellpos; 


このように修正して、売りのポジションを数えた後に、買いと売りのポジションを足して、

トータルのポジションを計算するようにしておきます。


次に、仕掛の判断の部分で、買いの部分を修正し、売りを作成します。

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

   //売り判断
   if(entrybar!=Bars && totalpos==0 && Close[1]<Close[2] && macd1<macd2)
   {
      OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",magic01,0,Red);
      entrybar=Bars;
   }


このように、ポジション数の判断に totalpos を使用し、

買い判断と売り判断共に、どちらのポジションもない時にしか、仕掛ないようにします。


と、こんな感じで決済は次回にまわします。




 
プログラム作成の際の流れを説明します。

今回のプログラムでは、

ポジションチェック

指標の計算

決済の処理

仕掛の処理


の流れになっています。


以前、仕掛と決済を逆にして作成していたこともあったのですが、

仕掛けて即決済なんて失敗や、いつまでたっても決済しないような失敗も色々やりました。

それから、決済の方を先に処理することで落ち着いております。

個人的には、仕掛よりも決済の方が重要だと思っています。


ポジションチェックや指標の計算は、決済や仕掛の処理の中で使用するものなので、

先に計算しておかないと意味がないので、当然最初の方になります。


プログラムを始める前に、大まかな流れを考えておくと、作成もスムーズにいくと思います。


実際のプログラムの作業では、

ポジションチェック

指標の計算

仕掛の処理

決済の処理

の順で作成しました。

作るのは仕掛が先ですが、書く場所は決済の方が先です。

作成の手順は好き好きがあるのかもしれませんが、

動作チェックの際に仕掛を先に作成しておく方が楽だと思います。


また、今回のようにとりあえず買いだけ作成してみて動作をチェックし、

思うように処理できていれば売りを追加する形にすると、

問題が起きた時に原因を絞り込みやすいのでいいのではないかと思います。


慣れてくればそんなのもすっ飛ばして頭の中で組み立てできるようになると思いますが、

プログラムに慣れていない最初のうちは、少しずつ組み立てて、

エラーが出ないかどうかチェックしながら完成させればいいと思いますよ。


ボチボチかもしれませんが、やっただけは力になるので楽しんでやっていきましょう。




   
【送料無料】FXトレーダーの大冒険

【送料無料】FXトレーダーの大冒険
価格:3,990円(税込、送料別)

それでは、決済の条件について説明していきます。

買いポジションについての決済の条件は以下の通りです。

<買いポジション>
・エントリーした足の安値を終値ベースで下抜ける時は【成行で決済】
・終値ベースで、為替レートとMACDラインが前日の値よりも小さくなる時は【成行で決済】


それをプログラムしたものが以下です。

//手仕舞い判断
   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) entrylow=Low[0];

で行っています。

仕掛を行った際に、entrybar に Bars でローソク足の数を覚えました。

足が新しく出来て Bars の数が変わるまでは、エントリーした足ということです。

entrybar と Bars の数が同じであれば、

entrylow に Low[0] (安値)の値を覚えさせます。

次の足に変わった時には、この処理は行われないので、

エントリーした足の安値は entrylow に覚えられたままです。

そして、決済処理の entrylow>Close[1] の部分で、

エントリーした足の安値を終値で割り込んだかどうか判断します。


終値ベースで、為替レートとMACDラインが前日の値よりも小さくなる時

というのは、前回の買いの仕掛の条件で大きくなる時を説明しましたが、

その反対に小さくなる時です。

使う指標は同じで、不等号が反対になりますので、

(Close[1]<Close[2] && macd1<macd2)

このように書き表わせます。

為替レートとMACDのラインの条件が同時に起こった時なので、

この二つは( )をつけてひとくくりにしておきます。

・エントリーした足の安値を終値ベースで下抜ける時
・終値ベースで、為替レートとMACDラインが前日の値よりも小さくなる時

の二つの条件は、どちらか片方が条件を満たせば決済するので、

|| を使ってどちらかが満たす時、とします。


他の条件として、

entrybar!=Bars

は、エントリーしたローソク足かどうかを確認し、

ローソク足の数が entrybar 以外の時、

つまりエントリーしたローソク足以外で判断するという設定です。


また、

buypos!=0

は、買いのポジションの数をチェックして、

0以外の時、つまりポジションがある時だけ処理するという設定です。


このようにして、条件を組み合わせて判断していきます。

そして、全ての条件を満たしていれば決済を行います。


って感じで今回はここまでです。