MT5エキスパートアドバイザー SMA_EA01.mq5 の説明2

説明5


if(!SymbolInfoTick(_Symbol,l_pr))

     {

       Print("the latest price  error");

       return;

     }

    if(CopyRates(_Symbol,_Period,0,2,mrate)!=2)

     {

      Print("CopyRates of ",_Symbol," failed, no history");

      return;

     }


//--------------------------

if(CopyBuffer(maH,0,0,3,maV)<0) return;

//--------------------------
SymbolInfoTick(_Symbol,l_pr)関数のフォーマットは  

bool  SymbolInfoTick(

   string    symbol,     //通貨ペア名

   MqlTick&  tick        //MqlTick構造体データ

       //現在の価格、アップデート時刻等)のアドレス 

   );

です。

パラメータのsymbolには、チャートの通貨ペア名の_Symbolを記入します。

パラメータのtickには、すでにMqlTick l_pr; でl_prは定義されていますので、

それを記入します。

戻り値は、関数が成功した場合trueを返し、そうでない場合はfalseを返します。

if(!SymbolInfoTick(_Symbol,l_pr))で、関数が成功しない場合、

そのときはthe latest price errorを操作ログに表示し、リターンします。

//-----------------------------

if(CopyRates(_Symbol,_Period,0,2,mrate)!=2)

     {

      Print("CopyRates of ",_Symbol," failed, no history");

      return;

     }


CopyRates(_Symbol,_Period,0,2,mrate)関数のフォーマットは  

int  CopyRates(

   string           symbol_name,       //通貨ペア名 

   ENUM_TIMEFRAMES  timeframe,         //期間

   int              start_pos,         //開始位置 

   int              count,             //コピー数

   MqlRates         rates_array[]      //コピー先配列

   );

です。

開始位置は0ですので、現在のバーの0番からスタートします。

コピー個数は2で、バー0と1です。

sclose=mrate[0].close;のコードは2個の要素のみとなり、1つ前のバーの終値を今回使います。

配列mrate[]はif(CopyRates(_Symbol,_Period,0,2,mrate)!=2)

2個のコピーが成功したときは戻り値は2となり、

成功しないときは、CopyRates of 通貨ペア名 failed, no historyを操作ログに表示し、

リターンします。

//----------------------------------


if(CopyBuffer(maH,0,0,3,maV)< 0)  return;

CopyBuffer(maH,0,0,3,maV)関数のフォーマットは  

int  CopyBuffer(

   int       indicator_handle,     // インジケーターのハンドル

   int       buffer_num,           // インジケーターのバッファ番号

  int       start_pos,            // 開始位置 

   int       count,                // コピー数

   double    buffer[]              // コピー先配列 

   );

//

OnInitで作成したインジケーターのハンドルは

maH=iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE);

のmaHを記入します。

インジケーターのバッファ番号は、移動平均インジケータのバッファーは1つで、

0 - MAIN_LINEとなりますので、0を記入します。


maVはグローバル変数としてdouble maV[3];と定義。

開始位置0で現在のバー(0)から、コピー数3、バー0、1、2をコピーします。

CopyRatesと同じでコピー元の時系列は右からインデックスが始まります。

コピー先配列のインデックスは左から始まります。

コピー元の0番の値はコピー先の2番になります。混同しないよう注意してください。

下の画像はMQL5のCopyBufferのリファレンスです。

コピー元とコピー先配列では順番が逆転しています。


copybuffer



後のコードで、maV[1]を使います。

bool Buy_S1 = (sclose > maV[1]); 

しかし時間足のバーを3まで使うのであれば、

double maV[4];CopyBuffer(maH,0,0,3,maV)は
if(CopyBuffer(maH,0,0,4,maV)<0 data-blogger-escaped-pre="" data-blogger-escaped-return="">


説明7

if(Buy_S1)

      {

         if (Buy_sig)  return;
             
         mreq.action = TRADE_ACTION_DEAL;                                

         mreq.price = NormalizeDouble(l_pr.ask,_Digits);          

         mreq.sl = NormalizeDouble(l_pr.bid - STP*_Point,_Digits); 

         mreq.tp = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits); 

         mreq.symbol = _Symbol;                                         

         mreq.volume = Lots;                                            

         mreq.magic = Magic;                                        

         mreq.type = ORDER_TYPE_BUY;                                     

         mreq.type_filling = ORDER_FILLING_FOK;                

         mreq.deviation= SL ;              

// (slippage)
//--- send order

         OrderSend(mreq,mresu);  

       }

if(Buy_S1 )は、

Buy_S1 が1のとき

{ }内のプログラムを実施します。


if (Buy_sig)  return;は、Buy_sigがtrueのとき、

つまり買いポジションがあるとき、returnします。

mreqは、MqlTradeRequestの構造体として定義されてます。

struct MqlTradeRequest

  {

   ENUM_TRADE_REQUEST_ACTIONS   action;   // トレードタイプ

   ulong                        magic;    // マジックナンバー(Expert Advisor ID )

   ulong                        order;    // 注文チケット番号

   string                       symbol;   // トレード通貨

   double                       volume;   // 注文ロット数

   double                       price;    // 注文価格

   double                       stoplimit;   

      // オーダのStoplimit(ストップ注文)レベル

   double                        sl;          

      // オーダのストップロスレベル

   double                        tp;         

      // オーダのTake Profit(利食い) レベル

   ulong                         deviation;   

      // スリッページの最大値

   ENUM_ORDER_TYPE               type;        

      // 注文の種類

   ENUM_ORDER_TYPE_FILLING       type_filling;  

      // ファイリングの種類

   ENUM_ORDER_TYPE_TIME          type_time;    

      // 有効期限種類

   datetime                      expiration;  

      // 有効期限 

   string                        comment;   

      // コメント

  };

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

ENUM_TRADE_REQUEST_ACTIONS


TRADE_ACTION_DEAL    //成行注文

TRADE_ACTION_PENDING  //指値注文

TRADE_ACTION_SLTP      //ストップ値、テイクプロフィット値の修正

TRADE_ACTION_MODIFY    //指値注文の修正

TRADE_ACTION_REMOVE   //指値注文の取り消し

//----------------------------------------------------

mreq.action =TRADE_ACTION_DEAL は、成行注文を指示します。

次は、mreq.price = NormalizeDouble(l_pr.ask,_Digits); です。

l_prは、MqlTick l_pr;


構造体は下記のように定義されています。

struct MqlTick

  {

   datetime     time;          // 最新のアップデート時間

   double       bid;           // Bid価格(売値) 

   double       ask;           // Ask価格(買値) 

   double       last;          // 最新の約定価格

   ulong        volume;        // Volume 

  };


NormalizeDouble()関数は、l_pr.askで買値を取得し、

実数型の値に、_Digitsで取得した桁数に四捨五入します。


mreq.sl = NormalizeDouble(l_pr.bid - STP*_Point,_Digits); は、

オーダのストップロスレベルです。


mreq.tp = NormalizeDouble(l_pr.ask + TKP*_Point,_Digits); は、

オーダのTake Profit(利食い)レベルです。


mreq.deviation= SL ; は、スリッページの最大値を入力します。

mreq.symbol = _Symbol; は、Expert Advisorのアタッチチャートの通貨ペア名です。 

mreq.volume = Lots;  は、注文ロット数です。 

mreq.magic = Magic; は  マジックナンバー  です。

mreq.type = ORDER_TYPE_BUY; は買い注文を指示します。

mreq.type_filling = ORDER_FILLING_FOK;は

下記のENUM_ORDER_TYPE_FILLING(列挙型ファイリングオ-ダ-タイプ)から取得します。

ORDER_FILLING_FOK  

ORDER_FILLING_IOC  

ORDER_FILLING_RETURN  

以上を入力して、OrderSend(mreq,mresu); というように買い注文を出します。

//

売り注文も同じ要領です。

bool Sell_S1 = (sclose <maV[1]);                             

if(Sell_S1) 

       {

          if (Sell_sig) return;
       

          mreq.action = TRADE_ACTION_DEAL;                                 

          mreq.price = NormalizeDouble(l_pr.bid,_Digits);          

          mreq.sl = NormalizeDouble(l_pr.ask + STP*_Point,_Digits); 

          mreq.tp = NormalizeDouble(l_pr.bid - TKP*_Point,_Digits); 

          mreq.symbol = _Symbol;                                         

          mreq.volume = Lots;                                            

          mreq.magic = Magic;                                        

          mreq.type= ORDER_TYPE_SELL;                                     

          mreq.type_filling = ORDER_FILLING_FOK;                          

          mreq.deviation= SL  ;                                          

 // (slippage)
 //--- send order

          OrderSend(mreq,mresu);

        }    

//

以下のプログラムで売りシグナルを計算します。


bool Sell_S1 = (sclose <maV[1]);  


次のif(Sell_S1 ) では、Sell_S1 が1のとき、{ }内のプログラムを実施します。

if (Sell_sig) return; では、

Sell_sigがtrueのとき、(売りポジションがあるとき)、returnします。


mreq.action = TRADE_ACTION_DEAL; は買い注文と同じになります。

mreq.price = NormalizeDouble(l_pr.bid,_Digits);  は  

NormalizeDouble()関数で、l_pr.bidにより売値を取得し、

型の値に、_Digitsで取得した桁数に四捨五入します。
   

mreq.sl = NormalizeDouble(l_pr.ask + STP*_Point,_Digits); は、

オーダのストップロスレベルです。

mreq.tp = NormalizeDouble(l_pr.bid - TKP*_Point,_Digits); は、

オーダのTake Profit(利食い)レベルです。

売り注文ですから、ストップロスレベル、Take Profit(利食い)レベルは

+ STP*_Point、- TKP*_Pointと、買い注文とは逆の符号になります。


mreq.type= ORDER_TYPE_SELL;は売り注文の指示です。

他は買い注文と同じになります。

mreq.symbol = _Symbol;                                         

mreq.volume = Lots;                                            

mreq.magic  = Magic;  

mreq.deviation= SL; 

    //--- send order

OrderSend(mreq,mresu);


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