English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
MQL5 ウィザード:オープンポジションのトレーリングモジュール作成方法

MQL5 ウィザード:オープンポジションのトレーリングモジュール作成方法

MetaTrader 5エキスパート | 14 10月 2015, 14:57
785 0
MetaQuotes
MetaQuotes

はじめに

MetaTrader 5 はトレーディングの考えを確認するための力強いツールを備えています。これは MQL5 ウィザードでのトレーディング戦略ジェネレータです。Experts Advisors のソースコード自動生成のための MQL5ウィザード使用については『MQL5 ウィザード:プログラミングしないExpert Advisors作成法』稿に述べられています。コード生成システムを開始することで、標準クラスにトレードシグナルのカスタムクラス、資金管理システム、トレーリングモジュールを追加することが可能です。

本稿では、MQL5での将来的使用のためにオープンポジションのトレーリングモジュールを書く原理について述べます。

MQL5 ウィザードを用いて作成されるExpert Advisorは4つの 基本クラスに基づいています。

図1 基本クラスCExpertのストラクチャ

図1 基本クラス CExpertのストラクチャ

CExpertクラス(またはその派生クラス)はトレーディングロボットの主要な『駆動部』です。CExpert クラスのインスタンスには以下のクラス(またはその派生クラス)のインスタンスが含まれますCExpertSignalCExpertMoneyCExpertTrailing

  1. CExpertSignal はトレーディングシグナル生成の主要クラスです。派生クラスCExpertSignal のインスタンスはExpert Advisorから提供され、内蔵アルゴリズムに基づくマーケット参加可能性、開始レベル、逆指し値注文に関する情報を伴うCExpert クラスにあります。トレード処理 の最終判断は Expert Advisorが行います。トレードシグナルのモジュールを書く方法は 『MQL5 ウィザード:トレーディングシグナルのモジュール作成方法』 稿で読むことができます。
  2. CExpertMoney 資金およびリスク管理の主要システムです。派生クラス CExpertMoney のインスタンスは オープンされたポジションと未決注文のボリューム計算を行います。ボリュームの最終判断は Expert Advisorが行います。資金およびリスク管理モジュールの作成原理は 『MQL5 ウィザード: 資金およびリスク管理モジュール作成方法』稿に述べられています。
  3. CExpertTrailing はオープンポジションを監視する主要なモジュールです。派生クラス CExpertTrailing のインスタンスはポジションの逆指し値注文の変更が必要かどうかを Expert Advisorに知らせます。変更の最終判断は Expert Advisorが行います。

また、次のクラスインスタンスはCExpert クラスのメンバです。

  • CExpertTrade (トレード処理を行います)
  • CIndicators (Expert Advisorの動作に使用されるインディケータと時系列を管理します。)
  • CSymbolInfo (シンボル情報を取得します。)
  • CAccountInfo (トレードアカウント状況の情報を取得します。)
  • CPositionInfo (ポジション情報を取得します。)
  • COrderInfo COrderInfo(未決注文に関する情報を取得します。)

本テキストでは、"Expert Advisor" というときは派生クラスのCExpert クラスのインスタンスを意味します。

CExpert クラスについての詳細および連携手順に関しては別記事に記載があります。


1. 基本クラスCExpertTrailing

CExpertTrailing は以下のオープンポジションの基本モジュールです。「外界」と連携するために、CExpertTrailingクラスはパブリックな仮想メソッドを備えています。

初期化 内容
仮想 Init クラスインスタンスの初期化により、EAデータとモジュールデータの同期が可能となります。
仮想 ValidationSettings パラメータ設定の検証
仮想 InitIndicators トレードシグナルジェネレータの処理に要求されるすべてのインディケータと時系列の作成と初期化を行います。
ポジション変更のシグナル
仮想 CheckTrailingStopLong 指し値注文への新価格を決定しロングポジションを変更するシグナルを生成します。
仮想 CheckTrailingStopShort 指し値注文への新価格を決定しショートポジションを変更するシグナルを生成します。


メソッド内容


1.1. 初期化メソッド

1.1.1 Init

Expert Advisorにクラスインスタンスが追加される直後 自動で Init() メソッドが呼ばれます。メソッドのオーバーライドは不要です。

virtual bool Init(CSymbolInfo* symbol, ENUM_TIMEFRAMES period, double adjusted_point);

1.1.2 ValidationSettings

ValidationSettings() メソッドはすべてのパラメータが設定された後 Expert Advisorから直接 呼ばれます。セットアップ設定がある場合は、このメソッドのオーバーライドが必要です。

virtual bool ValidationSettings();

オーバーライドされたメソッドは全パラメータが正しければ(使用に適していれば) trueを返します。パラメータがひとつでも無効であれば false (以後の作業は不可)を返します。

基本クラスCExpertTrailing には設定されるパラメータがありません。よってメソッドはチェックを行わず常に true を返します。

1.1.3 InitIndicators

InitIndicators() メソッドは、必要なインディケータと時系列を作成し初期化します。すべてのパラメータが設定され有効化されたのち Expert Advisor から呼ばれます。トレードシグナルのジェネレータが最低でもひとつのインディケータまたは時系列を使用すると、このメソッドをオーバーライドする必要があります。

virtual bool InitIndicators(CIndicators* indicators);

インディケータおよび/または時系列は 標準ライブラリの一致を通して使用されます。全インディケータおよび/または時系列のポインターは expert (パラメータとして渡される先のポインター)のインディケータ集積に追加される必要があります。

オーバーライドされたメソッドは全インディケータおよび/または時系列の操作に問題がなければ(使用に適しているなら)trueを返します。インディケータおよび/または時系列処理にひとつでも失敗するとこのメソッドは false (以後の作業は不可)を返します。

基本クラス CExpertTrailing はインディケータおよび時系列を使用しません。よって基本クラスメソッドは処理をまったく行わず、常に trueを返します。


1.2. ポジション変更のシグナルをチェックするメソッド

1.2.1 CheckTrailingStopLong

CheckTrailingStopLong() メソッドはロングポジションを変更するシグナルを生成し、ストップロス注文の新価格(必要であればテイクプロフィット注文の価格も)を決定します。それはポジションを変更する必要があるか判断するためにExpert Advisorによって呼ばれます。ロングポジションの変更シグナルを生成したい場合は、それをオーバーライドする必要があります。

virtual bool CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp)

このメソッドはロングポジションの変更条件を確認するアルゴリズムを実装します。条件が満たされれば sl 変数(必要であれば同じくtp変数)が適切な値を割り当て、メソッドは trueを返します。変数 sl および tp へのリンクはパラメータとして渡されます。条件が満たされなければ、メソッドはfalseを返します。

基本クラス CExpertTrailing にはロングポジション変更のシグナル生成用内蔵アルゴリズムがありません。よって基本クラスメソッドは常に falseを返します。

1.2.2 CheckTrailingStopShort

CheckTrailingStopShort() メソッドはショートポジションを変更するシグナルを生成し、ストップロス注文の新価格(必要であれば同様にテイクプロフィット注文の価格)を決定します。それはショートポジションを変更する必要があるか判断するためにExpert Advisorによって呼ばれます。ショートポジションの変更シグナルを生成したい場合は、このメソッドをオーバーライドする必要があります。

virtual bool CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp)

このメソッドはショートポジションの条件を確認するためのアルゴリズムを実装する必要があります。条件が満たされれば sl 変数(必要であれば同じくtp変数)が適切な値を割り当て、メソッドは trueを返します。変数 sl および tp へのリンクはパラメータとして渡されます。条件が満たされなければ、メソッドはfalseを返します。

基本クラス CExpertTrailing にはショートポジション変更のシグナル生成用内蔵アルゴリズムがありません。よって基本クラスメソッドは常に falseを返します。


2. オープンポジションを監視する独自のモジュールを書く

基本クラス CExpertTrailingのストラクチャ見直しを終えたところで、独自のオープンポジション監視モジュールの作成が可能です。

前述のようにCExpertTrailing クラスはパブリックな仮想「ロープ」のセットです。それを使用することでExpert Advisor はオープンポジションをトレーリングするモジュールの逆指し値注文への変更の要不要についての意向を知りうるのです。

ここでの最初の目標はCExpertTrailing クラスから派生する適切な仮想メソッドをオーバーライドし、要求されるアルゴリズムを導入してオープンポジション監視目的の独自クラスを作成することです。

二番目の目標(これはそれほど重要ではありませんが)は、作成するクラスをMQL5 ウィザードに対して可視化することです。まず、重要な件からとりかかります。


2.1. トレーディングシグナルジェネレータのクラス作成

では始めます。

最初に、(たとえば同じ MQL5 ウィザード を使用して)拡張子 mqh を伴うインクルードファイルを作成します。

ファイルメニューで『作成』を選択(またはキーを組み合わせてCtrl+N を押します。)し、インクルードファイル作成を指示します。

図2 MQL5 ウィザードを用いたインクルードファイルの作成

図2 MQL5 ウィザードを用いたインクルードファイルの作成

MQL5 ウィザードをオープンポジショントレーリングモジュールとして用い、ファイルを『検出』にするには、フォルダ Include\Expert内に作成する必要があります。

標準ライブラリ内で廃棄されるためには、独自フォルダ Include\Expert\Trailing\MyTrailingを作成し、その中にМQL5ウィザードないにパラメータを指定してファイル SampleTrailing.mqh, を作成します。

図3 インクルードファイルの位置設定

図3 インクルードファイルの位置設定

MQL5 ウィザード 処理の結果、以下のパターンを取得します。

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
// #define MacrosHello   "Hello, world!"
// #define MacrosYear    2010
//+------------------------------------------------------------------+
//| DLL imports                                                      |
//+------------------------------------------------------------------+
// #import "user32.dll"
//   int      SendMessageA(int hWnd,int Msg,int wParam,int lParam);
// #import "my_expert.dll"
//   int      ExpertRecalculate(int wParam,int lParam);
// #import
//+------------------------------------------------------------------+
//| EX5 imports                                                      |
//+------------------------------------------------------------------+
// #import "stdlib.ex5"
//   string ErrorDescription(int error_code);
// #import
//+------------------------------------------------------------------+

以下は「マニュアル」作業のみです。不要な部分は消去し、要求される部分(今は空のクラス記述のある 標準ライブラリ のインクルードファイルExpertMoney.mqh)を追加します。

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
//+------------------------------------------------------------------+
//| Class CSampleTrailing.                                           |
//| Purpose: Class for trailing of open positions.                   |
//|             Is derived from the CExpertTrailing class.          |
//+------------------------------------------------------------------+
class CSampleTrailing : public CExpertTrailing
  {
  };
//+------------------------------------------------------------------+

ここで必要なのは、アルゴリズムの選択です。

オープンポジションのトレーリングモジュールの基本として以下のアルゴリズムを取ります。価格が指定の距離により要求される方向に行けば、指し値注文を無損失レベルに移動します。これをファイルに反映します。

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
//+------------------------------------------------------------------+
//| Class CSampleTrailing.                                           |
//| Purpose: Class for trailing of open positions by                 |
//|             moving the Stop order "to the loseless level".       |
//|             Is derived from the CExpertTrailingclass.            |
//+------------------------------------------------------------------+
class CSampleTrailing : public CExpertTrailing
  {
  };
//+------------------------------------------------------------------+

逆指し値注文変更を判断するのに必要なデータは何か定義します。この場合は、ポイントで変更されるポジションの収益です。

オープンポジションの監視用のわれわれのモジュールの設定パラメータリストを定義します。2とおりのパラメータが必要です。

  1. 指し値注文を無損失レベルに移動させるのを提案するために要求されるポジション収益のポイント番号
  2. 無損失レベル、すなわち移動した指値注文によりいくつの収益ポイントを固定するか

モジュールの設定はクラスの保護されたデータメンバに格納されます。設定へのアクセスは適切なパブリックメソッドによって実装されます。

われわれのファイルでこれをインクルードします。

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
//+------------------------------------------------------------------+
//| Class CSampleTrailing.                                           |
//| Purpose: Class for trailing of open positions                    |
//|             by moving Stop order to a lossless level.            |
//|             Is derived from the CExpertTrailing class.           |
//+------------------------------------------------------------------+
class CSampleTrailing : public CExpertTrailing
  {
protected:
   int                m_profit;             //threshold level of profit
   int                m_stop_level;         // lossless level

public:
   //--- methods of setting adjustable parameters
   void               Profit(int value)       { m_profit=value;     }
   void               StopLevel(int value)    { m_stop_level=value; }
  };
//+------------------------------------------------------------------+

デフォルト値で調整可能なパラメータを初期化するには、クラスコンストラクタを追加する必要があります。

設定を検証するには、仮想メソッド ValidationSettingsをオーバーライドします。(基本クラスの記述に従い)

クラス記述

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
//+------------------------------------------------------------------+
//| Class CSampleTrailing.                                           |
//| Purpose: Class for trailing of open positions                    |
//|             by moving Stop order to a lossless level.            |
//|             Is derived from the CExpertTrailing class.           |
//+------------------------------------------------------------------+
class CSampleTrailing : public CExpertTrailing
  {
protected:
   int                m_profit;             // threshold level of profit
   int                m_stop_level;         // lossless level

public:
                      CSampleTrailing();
   //--- methods of setting adjustable parameters
   void               Profit(int value)       { m_profit=value;     }
   void               StopLevel(int value)    { m_stop_level=value; }
   //--- method of validating the adjustable parameters
   virtual bool        ValidationSettings();
  };
//+------------------------------------------------------------------+

ValidationSettings() メソッドの実装

//+------------------------------------------------------------------+
//| Validation of adjustable parameters.                             |
//| INPUT:  no.                                                      |
//| OUTPUT: true if parameter are correct, false - if not.           |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
   if(!CExpertTrailing::ValidationSettings())
      return(false);
//--- check wheter the Init method is called
   if(m_symbol==NULL) return(false);
//--- check parameters
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+": threshold level of profit must be greater than the level of  setting of orders");
      return(false);
     }
//--- ok
   return(true);
  }

準備作業は完了です。

では、われわれのアルゴリズムを再度もっと詳しくみていきましょう。

1. ロングポジション変更シグナルは以下の条件が満たされると現れます。

  • ポジションが変更されるモジュールのパラメータ設定P(Profit=0に設定すると、変更は行われません。)
  • ポジションはまだ変更されていません(指値注文は無損失レベルまで移動されていません)。
  • ポジションの収益はパラメータで設定された閾値を越えました。

この場合、設定に従い指値注文の変更を提案します。この目的のために仮想メソッドCheckTrailingStopLong をオーバーライドし、対応する機能性を書き込みます。

2. ショートポジション変更ルシグナは以下の条件が満たされると現れます。

  • ポジションが変更されるモジュールのパラメータ設定P(Profit=0に設定すると、変更は行われません。)
  • ポジションはまだ変更されていません(指値注文は無損失レベルまで移動されていません)。
  • ポジションの収益はパラメータで設定された閾値を越えました。

この場合、設定に従い指値注文の変更を提案します。この目的のために仮想メソッドCheckTrailingStopShort をオーバーライドし、対応する機能性を書き込みます。

クラス記述

class CSampleTrailing : public CExpertTrailing
  {
protected:
   int                m_profit;             // threshold level of profit
   int                m_stop_level;         // lossless level

public:
                      CSampleTrailing();
   //--- methods of setting adjustable parameters
   void               Profit(int value)       { m_profit=value;     }
   void               StopLevel(int value)    { m_stop_level=value; }
   //--- method of validation of adjustable parameters
   virtual bool       ValidationSettings();
   //--- methods of generation of position modification signals
   virtual bool       CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp);
   virtual bool       CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp);
  };

メソッド CheckTrailingStopLong および CheckTrailingStopShortの実装

//+------------------------------------------------------------------+
//| Check for modification of stop orders of a long position.        |
//| INPUT:  position - pointer to a position object,                 |
//|         sl       - link for a new price of stop loss order,      |
//|         tp       - link for a new price of take profit order.    |
//| OUTPUT: true if condition is satisfied, false - if not.          |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleTrailing::CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp)
  {
//--- check of pointer
   if(position==NULL) return(false);
//--- check of parameter
   if(m_profit==0.0)  return(false);
//--- already in a lossless zone?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- check of profit
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Check for modification of stop orders of a short position.       |
//| INPUT:  position - pointer to a position object,                 |
//|         sl       - link to a new price of stop loss order,       |
//|         tp       - link to a new price of take profit order.     |
//| OUTPUT: true if condition is satisfied, false - if not.          |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleTrailing::CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp)
  {
//--- check of pointer
   if(position==NULL) return(false);
//--- check of parameter
   if(m_profit==0.0)  return(false);
//--- already in a lossless zone?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- check of profit
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }


2.2. MQL5 ウィザード用トレーディングシグナルのクラス作成記述

ここから第二の課題に取り組みます。ここでのオープンポジション監視モジュールは MQL5 ウィザードのトレーディング戦略生成によるものと「認識」する必要があります。

第一の必要条件を行いました。MQL5 ウィザードによって「見つけられる」ファイルの配置です。が、これではまだ十分ではありません。MQL5 ウィザードはただファイルを「見つける」のではなく、それを「認識」する必要があります。このために、MQL5 ウィザードに元のテキストクラスデスクリプタを追加します。

クラスデスクリプタは特定のルールに従い構成されるコメント群です。

結果を見ていきます。

1. コメントブロックは以下のような行で始まります。

// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |

2. 次の行は"//| Title=<Text> |"形式のテキストデスクリプタ(シグナル選択にあたり MQL5 ウィザードで見るもの)です。テキストが一行で収まらない場合は、その後にもう一行(それ以上は不可)追加することが可能です。

この場合は、以下です。

//| Title=Signal on the crossing of a price and the MA               |
//| entering on its back movement                                    |

3. それから "//| Type=<Type> |"形式で指定されるクラスタイプの行です。<Type> フィールドはシグナルの値(シグナルに加え、MQL5 ウィザードはその他のクラスタイプも認識します。)を持つ必要があります。

それを書きます。

//| Type=Trailing                                                    |

4. "//| Name=<Name> |" 形式の以下の行はシグナルの短縮名(expertのグローバル変数名を生成するためにMQL5ウィザードで使用されます)です。

それは以下のようになります。

//| Name=BreakEven                                                   |

5. クラス名は記述の重要な要素です。"//| Class=<ClassNameа> |"形式の行では、<ClassName> パラメータはここでのクラス名と一致する必要があります。

//| Class=CSampleTrailing                                            |

6. この行には書き込みはしませんが、残しておく必要があります。(これは 言語参照 部へのリンクです。)

//| Page=                                                            |

7. その後、モジュール設定パラメータの記述がきます。

これは行のセットです。(行数はパラメータ数と一致します。)

各行のフォーマットは次のようなものです。"//| Parameter=<NameOfMethod>、<TypeOfParameter>、<DefaultValue> |"

パラメータセットは下記です。

//| Parameter=Profit,int,20                                          |
//| Parameter=StopLevel,int,0                                        |

8. コメントブロックは以下のような行で終わります。

//+------------------------------------------------------------------+
// wizard description end

ソースコードにデスクリプタを追加します。

//+------------------------------------------------------------------+
//|                                               SampleTrailing.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertTrailing.mqh>
// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Moving a position to a lossless level                      |
//| Type=Trailing                                                    |
//| Name=BreakEven                                                   |
//| Class=CSampleTrailing                                            |
//| Page=                                                            |
//| Parameter=Profit,int,20                                          |
//| Parameter=StopLevel,int,0                                        |
//+------------------------------------------------------------------+
// wizard description end
//+------------------------------------------------------------------+
//| Class CSampleTrailing.                                           |
//| Purpose: Class for trailing of open positions                    |
//|             by moving Stop order to a lossless level.            |
//|             Is derived from the CExpertTrailing class.           |
//+------------------------------------------------------------------+
class CSampleTrailing : public CExpertTrailing
  {
protected:
   int                m_profit;             // threshold level of profit
   int                m_stop_level;         // lossless level

public:
                      CSampleTrailing();
   //--- method of setting adjustable parameters
   void               Profit(int value)       { m_profit=value;     }
   void               StopLevel(int value)    { m_stop_level=value; }
   //--- method of validation of adjustable settings
   virtual bool       ValidationSettings();
   //--- methods of generation of position modification signals
   virtual bool       CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp);
   virtual bool       CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp);
  };
//+------------------------------------------------------------------+
//| Constructor CSampleTrailing.                                     |
//| INPUT:  no.                                                      |
//| OUTPUT: no.                                                      |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
void CSampleTrailing::CSampleTrailing()
  {
//--- setting default values
   m_profit    =20;
   m_stop_level=0;
  }
//+------------------------------------------------------------------+
//| Check of adjustable parameters.                                  |
//| INPUT:  no.                                                      |
//| OUTPUT: true if the parameters are correct, false if not.        |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleTrailing::ValidationSettings()
  {
//--- what if the Init has not been called?
   if(m_symbol==NULL) return(false);
//--- check of parameters
   if((m_profit-m_stop_level)*m_adjusted_point<=m_symbol.StopsLevel()*m_symbol.Point() && m_profit!=0.0)
     {
      printf(__FUNCTION__+": threshold level of profit must be greater than the level of setting stop orders");
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Check for modification of stop orders of a long position.        |
//| INPUT:  position - pointer to a position object,                 |
//|         sl       - link for a new price of stop loss order,      |
//|         tp       - link for a new price of take profit order.    |
//| OUTPUT: true if condition is satisfied, false if not.            |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleTrailing::CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp)
  {
//--- check of pointer
   if(position==NULL) return(false);
//--- check of parameters
   if(m_profit==0.0)  return(false);
//--- already in a lossless zone?
   double open=position.PriceOpen();
   if(position.StopLoss()>=open) return(false);
//--- check of profit
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(m_symbol.Bid()-open>m_profit*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open+m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Check for modification of stop orders of a short position.       |
//| INPUT:  position - pointer to a position object,                 |
//|         sl       - link for a new price of stop loss order,      |
//|         tp       - link for a new take profit order.             |
//| OUTPUT: true if condition is satisfied, false if not.            |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleTrailing::CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp)
  {
//--- check of pointer
   if(position==NULL) return(false);
//--- check of parameters
   if(m_profit==0.0)  return(false);
//--- already in a lossless zone?
   double open=position.PriceOpen();
   if(position.StopLoss()<=open) return(false);
//--- check of profit
   sl=EMPTY_VALUE;
   tp=EMPTY_VALUE;
   if(open-m_symbol.Ask()>m_profit*m_adjusted_point)
      sl=m_symbol.NormalizePrice(open-m_stop_level*m_adjusted_point);
//---
   return(sl!=EMPTY_VALUE);
  }
//+------------------------------------------------------------------+

以上です。トレーリングモジュールは準備完了です。

MQL5 ウィザードのトレーディング戦略ジェネレータ がわれわれのモジュールを使うことができるように、MetaEditor (MQL5 ウィザードが起動時のみInclude\Expert フォルダをスキャンします。)を再起動します。

MetaEditorの再起動後、作成したオープンポジション管理モジュールは MQL5 ウィザードで使用可能です。

図5 MQL5 ウィザードでオープンポジションを管理するのジュールの作成

図5 MQL5 ウィザードでオープンポジションを管理するのジュールの作成

モジュールのパラメータの記述セクションで指定した入力パラメータはこれで使用可能です。

図6 MQL5 ウィザードでオープンポジションを管理するモジュール作成の入力パラメータ

図6 MQL5 ウィザードで オープンポジションを管理するモジュール作成の入力パラメータ

実装されたトレーディング戦略の入力パラメータの最良値は MetaTrader 5 端末の Strategy Testerを用いて検索可能です。


おわりに

MQL5ウィザードのトレーディング戦略ジェネレータ はトレーディングの考え方を検証することをひじょうに簡素化します。生成された expert のコードは標準ライブラリのトレーディング戦略クラス に基づきます。それはトレーディングシグナルクラス、資金およびリスク管理クラス、ポジションサポートクラスの特定の実装を作成するのに使用されます。

本稿では、MQL5 ウィザードでトレーディング戦略を書く方法、ジェネレータを、価格がポジション方向に行くときストップロスを無損失ゼロレベルへ移動させることでトレーディングの際ドローダウンを減らすことのできるオープンポジションを管理する独自のクラスと連携させる方法について述べます。MQL5 ウィザード用に作成されたクラスのストラクチャおよび記述フォーマットについても述べます。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/231

添付されたファイル |
sampletrailing.mqh (6.46 KB)
MetaTrader 5のマルチ通貨モードの実行 MetaTrader 5のマルチ通貨モードの実行
長い間、マルチ通貨分析やマルチ通貨トレーディングは人々の関心の的でした。完全なマルチ通貨システムを達成する機会は、MetaTrader5とMQL5プログラミング言語のリリースによりようやく可能になりました。この記事では、複数のシンボルにおけるすべてのティックを処理し分析する方法を紹介します。例として、USDドルインデックスのマルチ通貨RSIインジケーターを見てみます。
価格変動の速度と傾向に基づくトレードアイディア 価格変動の速度と傾向に基づくトレードアイディア
この記事では、価格変動の速度と傾向に基づいたトレードアイディアについて紹介しています。検証する戦略の持続性を明らかにする目的で、取引エキスパートアドバイザのテストとして、MQL4言語でトレードアイディアの形式化が行われます。また、チェックや研究、最適化をすることによって、記事に書かれている例の最も良いパラメータが明確になります。
Connecting NeuroSolutions Neuronets Connecting NeuroSolutions Neuronets
ニューロネットの作成に加え、NeuroSolutions ソフトウェアスウィートによりそれらを DLLとしてエクスポートすることが可能となります。本稿では、ニューロネット作成とDLL生成とそれを MetaTrader 5でのトレーディングのためExpert Advisor に連携する手順について述べています。
MQL5 ウィザード:リスクおよび資金管理モジュール作成方法 MQL5 ウィザード:リスクおよび資金管理モジュール作成方法
MQL5ウィザードのトレーディング戦略ジェネレータはトレーディングの考え方を検証することをひじょうに簡素化します。本稿では独自のリスクおよび資金管理モジュールの作成と、MQL5 ウィザードでそれを有効にする方法について述べました。例として、資金管理アルゴリズムを取り上げました。そこではトレードボリュームが前回ディールの結果を基に決定されます。またMQL5 ウィザード用に作成されるクラスのストラクチャおよび記述フォーマットについても述べます。