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

説明1  

始にMQL5のエデイターでEAの雛形ファイルを作成。

新規作成をクリックし、エキスパートアドバイザ(テンプレート)をチェック、

「次へ」をクリック、必要な箇所を入力。

名前

著作者

リンク


パラメータを入力するため、追加ボタンをクリックします。

始めに、Stop変数と値として50を入力します。

同様に追加ボタンを使い、

Takeと、値として100

Magicと、値として1000

Lotsと、値として0.01

Slipageと、値として10

MA_Periodと、値として10

を入力します。

Takeはポジションの利益を確定。

Magicは、どのエキスパートアドバイザの注文か区別するためのものです。

Lotsのタイプはintではなくdoubleにします。

int(整数型)からdouble(実数型)になります。

Slipageは注文の買値、売値からの許容値です。

MA_Periodは移動平均値の期間の値です。

移動平均からエントリーのシグナルを計算します。

初期値は、あとでストラジーテストを行い、Stop、Take、MA_Periodの最適値を検査後最適値に変更します。

「次へ」をクリックします。

エキスパートアドバイザのイベントハンドラは、

チェックをすべて外します。

「次へ」をクリックします。

Tester event handlers of Expert Advisorも、

チェックをすべて外します。

「完了」をクリックします。


プログラムテキスト画面が現れます。


//+------------------------------------+
//                         SMA_EA01.mq5 
//                  Copyright 2015, 
//-------------------------------------+
#property copyright "Copyright 2015,  "
#property link      ""
#property version   "1.00"
//+------------------------------------+
// Expert initialization function                                   
//+------------------------------------+

int OnInit()

  {
//---

//---
   return(INIT_SUCCEEDED);

  }

//+------------------------------------+
// Expert deinitialization function                                
//+------------------------------------+

void OnDeinit(const int reason)

  {

//---

  }

//+------------------------------------+
// Expert tick function               
//+------------------------------------+

void OnTick()

  {

//---

  }

//+------------------------------------+
 
説明2


int maH;は、関数の外で宣言されたグローバル変数で、

プログラム内のどの関数からでもアクセスができる変数です。

intは整数型の変数、doubleは実数型の宣言です。

実数型のグローバル変数、配列の要素は3個、1次元のスタティック配列です。

maV[]とスクエア・ブラケットに数字、変数が入っていなければダイナミック配列です。

最大で4次元まで宣言できます。

double sclose;は、実数型のsclose変数の宣言です。

int STP, TKP ,SL;は3個の整数型のSTP, TKP ,SL変数の宣言です。


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

int maH;
double maV[3]; 
double sclose;
int STP, TKP ,SL; 
double maV[3];は


次のint OnInit() はInit(初期化)イベントハンドラーです。 

OnInit() の戻り値はvoidあるいはintタイプ2通りがあります。

return(INIT_SUCCEEDED)でINIT_SUCCEEDEDの値が返される時は、初期化が成功したときです。

テクニカルインジケータ関数の1つ、

iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE);は

インデイケータのハンドル(アドレス)を値として返します。


//+------------------------------------------+
// Expert initialization function          
//+------------------------------------------+

int OnInit()

  {

//---

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

//--- What if handle returns Invalid Handle

   if( maH==INVALID_HANDLE)

     {

      Print("Indicators error ");

      return(INIT_FAILED);

     }

//---

   STP = Stop;
   TKP = Take;
   SL  = Slipage;

   if(_Digits==5 || _Digits==3) //EURUSD=5

     {

      STP = STP*10;
      TKP = TKP*10;
      SL  = Slipage*10;

     }

//---

   return(INIT_SUCCEEDED);

  }


_Symbolはチャートの通貨ペアー、

_Periodはチャートの時間足(例15分足、1時間足、日足等)、

MA_PeriodはiMAでは移動平均の期間、inputで入力したMA_Periodの値になります。


次のiMAのフォーマットを参考にします。

int  iMA(

   string               symbol,            
   ENUM_TIMEFRAMES      period,           
   int                  ma_period,         
   int                  ma_shift,          
   ENUM_MA_METHOD       ma_method,        
   ENUM_APPLIED_PRICE   applied_price      

   );


int ma_shiftは移動平均を水平移動します。

ENUM_MA_METHOD     

ma_methodは下記の移動平均の種類から選びます。

MODE_SMA   // Simple averaging

MODE_EMA   // Exponential averaging(指数移動平均)

MODE_SMMA  // Smoothed averaging(スムージングファクターNでの

//スムージング、詳しくは下記参考へ)

MODE_LWMA  // Linear-weighted averaging(より新しいデータのウエイトを大きくした

//移動平均)

// ENUM_APPLIED_PRICE   applied_priceは下記の(価格の種類)の1つから選びます。

PRICE_CLOSE      // Close price

PRICE_OPEN       // Open price

PRICE_HIGH       // The maximum price for the period

PRICE_LOW        // The minimum price for the period

PRICE_MEDIAN     // Median price, (high + low)/2

PRICE_TYPICAL    // Typical price, (high + low + close)/3

PRICE_WEIGHTED   //Average price, (high + low + close + close)/4

次のアルゴリズムでは

if( maH==INVALID_HANDLE)

     {

      Print("Indicators error ");

      return(INIT_FAILED);

     } 

もしハンドルmaHがうまくいかないとき、つまりINVALID_HANDLEの状態では

操作 logに、"Indicators error "をメッセージし、

初期化がうまくいかない時の値、INIT_FAILEDを返します。

このときはテスト終了します。

下記の式では、


  STP = Stop;
   TKP = Take;
   SL  = Slipage;

inputで入力したStop、Take、 Slipageのの値を計算しやすいように

STP、TKP、SLに移し変えます。


下記の式では、

   if(_Digits==5 || _Digits==3)   //EURUSD=5,USDJPY=3

     {

      STP = STP*10;
      TKP = TKP*10;
      SL  = Slipage*10;

     }

_Digitsはチャートの通貨ペア価格の小数点以下の桁数です。

EURUSDは現在は5桁です。

5桁ではSTP、TKP、SLを10倍にして計算します。

USDJPYは3桁です。

同じようにSTP、TKP、SLを10倍にして計算します。

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

参考

Smoothed Moving Average (SMMA)

最初にSMAを計算

SUM1 = SUM (CLOSE (i), N)

SMMA1 = SUM1 / N 

2番目は次の式を計算

SMMA (i) = (SMMA1*(N-1) + CLOSE (i)) / N

最後は次の式を計算します。

PREVSUM = SMMA (i - 1) * N

SMMA (i) = (PREVSUM - SMMA (i - 1) + CLOSE (i)) / N 

ここで

SUM —  sum;

SUM1 —  N期間の終値合計; 前のバーからカウント;

PREVSUM —  前のバーのスムーズ合計;

SMMA (i-1)  前のバーからの— smoothed moving average ;

SMMA (i) —  現在バーからのsmoothed moving average ;

CLOSE (i) —  現在の終値;

N —  スムージング期間.

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

説明3


//+----------------------------+
// Expert deinitialization function     
//+----------------------------+

void OnDeinit(const int reason)

  {

//---

   IndicatorRelease(maH);

  }


Deinitイベントは

Expert Advisorsあるいはindicatorsのときに使用します。

mql5プログラムがチャートに貼り付けてあるとき、

Deinitイベントは、

1、通貨ペアーあるいは時間足の変更のとき再初期化の前、

2、inputパラメータの変更のとき再初期化の前、

3、mql5プログラム使用を終了する前に呼び出されます。

void OnDeinit(const int reason)イベントのconst int reasonは、

UninitializeReason() 関数により下記の値となります。

1、Expert AdvisorがExpertRemove() functionで終了したとき、

  REASON_PROGRAM   0

2、プログラムがチャートから消去されたとき、

  REASON_REMOVE    1

3、プログラムが再コンパイルされたとき、

  REASON_RECOMPILE  2

4、チャートの通貨ペアあるいは時間足を変更したとき、

  REASON_CHARTCHANGE 3

5、チャートが閉じたとき、

  REASON_CHARTCLOSE  4

6、ユザーがパラメータを変更したとき、

  REASON_PARAMETERS  5

7、他の口座がアクテブになったり、口座の変更でサーバに接続し直すとき、

  REASON_ACCOUNT   6

8、新しいテンプレートが生じたとき、

  REASON_TEMPLATE   7

9、OnInit() ハンドラが0以外の値を返したとき、

  REASON_INITFAILED  8

10、端末がクローズしたとき、

  REASON_CLOSE    9 

次のIndicatorRelease(maH)では、

iMA(_Symbol,_Period,MA_Period,0,MODE_SMA,PRICE_CLOSE)のハンドルmaHを開放します。
説明4


次のvoid OnTick()では新しい quoteを受け取ったとき生成されるNewTickイベントを処理します。

しかし、自動売買ボタンが許可されていなとい、エキスパートアドバイザはトレード

操作が出来なくなります。

//+-------------------------------+
// Expert tick function    
//+-------------------------------+

void OnTick()

  {

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

   MqlTradeRequest mreq;  

   MqlTradeResult mresu;  

   MqlTick l_pr;  

   MqlRates mrate[2];  

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

    ZeroMemory(mreq);       

    ZeroMemory(mresu); 


MqlTick は最新の価格を収めた構造体です。

 Ask、 Bid価格を使うためには、MqlTickタイプとして、l_prを宣言します。

構造体は新しいデータの型を定義したものです。

以下はMqlTick構造体の定義です。

struct MqlTick

  {

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

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

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

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

   ulong        volume;        //ボリューム(バーの更新回数)

  };

次のMqlTradeRequest mreq;は

トレードに必要なトレードリクエストの構造体です。

以下はこの構造体の定義です。

struct MqlTradeRequest

  {

   ENUM_TRADE_REQUEST_ACTIONS    action;       

                         // トレードタイプ(詳細は下記参照1をご覧ください)

   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;        

                           // 注文の種類(詳細は下記参照2をご覧ください)

   ENUM_ORDER_TYPE_FILLING       type_filling;  

                           // ファイリングの種類(詳細は下記参照3をご覧ください)

   ENUM_ORDER_TYPE_TIME          type_time;  

                           // 有効期限種類(詳細は下記参照4をご覧ください)

   datetime            expiration;  // 有効期限 

   string              comment;     // コメント

  };

//

次のMqlTradeResult mresu;は

トレード結果の構造体です。

struct MqlTradeResult

  {

   uint     retcode;      // トレードサーバのリターンコード

              //(例:注文完了 10009 TRADE_RETCODE_DONE)

   ulong    deal;         // 約定チケット番号

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

   double   volume;       // 約定ロット数

   double   price;        // 約定価格

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

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

   string   comment;      // ブローカのコメント

  };


次の MqlRates mrate[2];は

チャート・バーの価格等の構造体、mrate[2]は要素数2の1次元配列です。

struct MqlRates

  {

   datetime time;             //バーの開始時刻

   double   open;             // 始値

   double   high;             // 高値

   double   low;              // 安値

   double   close;            // 終値

   long     tick_volume;    // ティック値

   int      spread;           // スプレッド

   long     real_volume;     // ボリューム(バーの更新回数)

  };

次ので、mreq、mresuを初期化します。

   ZeroMemory(mreq);       

   ZeroMemory(mresu); 

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

参照1

ENUM_TRADE_REQUEST_ACTIONS

TRADE_ACTION_DEAL     //成行注文

TRADE_ACTION_PENDING   //指値注文

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

TRADE_ACTION_MODIFY     //指値注文の修正

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


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

参照2

ENUM_ORDER_TYPE


ORDER_TYPE_BUY             //買い注文

ORDER_TYPE_SELL            //売り注文

ORDER_TYPE_BUY_LIMIT       //指値買い注文

ORDER_TYPE_SELL_LIMIT      //指値売り注文

ORDER_TYPE_BUY_STOP        //逆指値買い注文

ORDER_TYPE_SELL_STOP       //逆指値売り注文

ORDER_TYPE_BUY_STOP_LIMIT  //利益確定の指値買い注文 

ORDER_TYPE_SELL_STOP_LIMIT //利益確定の指値売り注文


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

参照3

ENUM_ORDER_TYPE_FILLING


ORDER_FILLING_FOK     //注文の詳細をファイル

ORDER_FILLING_IOC     //注文の表示にのみ最大可能

ORDER_FILLING_RETURN  //普通注文だけでなく、スワップ等のとき


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

参照4

ENUM_ORDER_TYPE_TIME


ORDER_TIME_GTC       //キャンセルまで有効

ORDER_TIME_DAY        //トレード日の間有効

ORDER_TIME_SPECIFIED     //有効期限まで有効

ORDER_TIME_SPECIFIED_DAY  //有効期限日の00:00まで有効。

// If this time is outside a trading session, the order expires in the nearest trading //time.

// (この時間がトレード期間から外れているなら、最も近いトレードタイムまでの注文期//限となる。)

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