MQL5 ウィザード:オープンポジションのトレーリングモジュール作成方法
はじめに
MetaTrader 5 はトレーディングの考えを確認するための力強いツールを備えています。これは MQL5 ウィザードでのトレーディング戦略ジェネレータです。Experts Advisors のソースコード自動生成のための MQL5ウィザード使用については『MQL5 ウィザード:プログラミングしないExpert Advisors作成法』稿に述べられています。コード生成システムを開始することで、標準クラスにトレードシグナルのカスタムクラス、資金管理システム、トレーリングモジュールを追加することが可能です。
本稿では、MQL5での将来的使用のためにオープンポジションのトレーリングモジュールを書く原理について述べます。
MQL5 ウィザードを用いて作成されるExpert Advisorは4つの 基本クラスに基づいています。
図1 基本クラス CExpertのストラクチャ
CExpertクラス(またはその派生クラス)はトレーディングロボットの主要な『駆動部』です。CExpert クラスのインスタンスには以下のクラス(またはその派生クラス)のインスタンスが含まれますCExpertSignal、 CExpertMoney、 CExpertTrailing:
- CExpertSignal はトレーディングシグナル生成の主要クラスです。派生クラスCExpertSignal のインスタンスはExpert Advisorから提供され、内蔵アルゴリズムに基づくマーケット参加可能性、開始レベル、逆指し値注文に関する情報を伴うCExpert クラスにあります。トレード処理 の最終判断は Expert Advisorが行います。トレードシグナルのモジュールを書く方法は 『MQL5 ウィザード:トレーディングシグナルのモジュール作成方法』 稿で読むことができます。
- CExpertMoney 資金およびリスク管理の主要システムです。派生クラス CExpertMoney のインスタンスは オープンされたポジションと未決注文のボリューム計算を行います。ボリュームの最終判断は Expert Advisorが行います。資金およびリスク管理モジュールの作成原理は 『MQL5 ウィザード: 資金およびリスク管理モジュール作成方法』稿に述べられています。
- 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. 初期化メソッド
Expert Advisorにクラスインスタンスが追加される直後 自動で Init() メソッドが呼ばれます。メソッドのオーバーライドは不要です。
virtual bool Init(CSymbolInfo* symbol, ENUM_TIMEFRAMES period, double adjusted_point);
ValidationSettings() メソッドはすべてのパラメータが設定された後 Expert Advisorから直接 呼ばれます。セットアップ設定がある場合は、このメソッドのオーバーライドが必要です。
virtual bool ValidationSettings();
オーバーライドされたメソッドは全パラメータが正しければ(使用に適していれば) trueを返します。パラメータがひとつでも無効であれば false (以後の作業は不可)を返します。
InitIndicators() メソッドは、必要なインディケータと時系列を作成し初期化します。すべてのパラメータが設定され有効化されたのち Expert Advisor から呼ばれます。トレードシグナルのジェネレータが最低でもひとつのインディケータまたは時系列を使用すると、このメソッドをオーバーライドする必要があります。
virtual bool InitIndicators(CIndicators* indicators);
インディケータおよび/または時系列は 標準ライブラリの一致を通して使用されます。全インディケータおよび/または時系列のポインターは expert (パラメータとして渡される先のポインター)のインディケータ集積に追加される必要があります。
オーバーライドされたメソッドは全インディケータおよび/または時系列の操作に問題がなければ(使用に適しているなら)trueを返します。インディケータおよび/または時系列処理にひとつでも失敗するとこのメソッドは false (以後の作業は不可)を返します。
1.2. ポジション変更のシグナルをチェックするメソッド
CheckTrailingStopLong() メソッドはロングポジションを変更するシグナルを生成し、ストップロス注文の新価格(必要であればテイクプロフィット注文の価格も)を決定します。それはポジションを変更する必要があるか判断するためにExpert Advisorによって呼ばれます。ロングポジションの変更シグナルを生成したい場合は、それをオーバーライドする必要があります。
virtual bool CheckTrailingStopLong(CPositionInfo* position,double& sl,double& tp)
このメソッドはロングポジションの変更条件を確認するアルゴリズムを実装します。条件が満たされれば sl 変数(必要であれば同じくtp変数)が適切な値を割り当て、メソッドは trueを返します。変数 sl および tp へのリンクはパラメータとして渡されます。条件が満たされなければ、メソッドはfalseを返します。
CheckTrailingStopShort() メソッドはショートポジションを変更するシグナルを生成し、ストップロス注文の新価格(必要であれば同様にテイクプロフィット注文の価格)を決定します。それはショートポジションを変更する必要があるか判断するためにExpert Advisorによって呼ばれます。ショートポジションの変更シグナルを生成したい場合は、このメソッドをオーバーライドする必要があります。
virtual bool CheckTrailingStopShort(CPositionInfo* position,double& sl,double& tp)
このメソッドはショートポジションの条件を確認するためのアルゴリズムを実装する必要があります。条件が満たされれば sl 変数(必要であれば同じくtp変数)が適切な値を割り当て、メソッドは trueを返します。変数 sl および tp へのリンクはパラメータとして渡されます。条件が満たされなければ、メソッドはfalseを返します。
2. オープンポジションを監視する独自のモジュールを書く
基本クラス CExpertTrailingのストラクチャ見直しを終えたところで、独自のオープンポジション監視モジュールの作成が可能です。
前述のようにCExpertTrailing クラスはパブリックな仮想「ロープ」のセットです。それを使用することでExpert Advisor はオープンポジションをトレーリングするモジュールの逆指し値注文への変更の要不要についての意向を知りうるのです。
ここでの最初の目標はCExpertTrailing クラスから派生する適切な仮想メソッドをオーバーライドし、要求されるアルゴリズムを導入してオープンポジション監視目的の独自クラスを作成することです。
二番目の目標(これはそれほど重要ではありませんが)は、作成するクラスをMQL5 ウィザードに対して可視化することです。まず、重要な件からとりかかります。
2.1. トレーディングシグナルジェネレータのクラス作成
では始めます。
最初に、(たとえば同じ MQL5 ウィザード を使用して)拡張子 mqh を伴うインクルードファイルを作成します。
ファイルメニューで『作成』を選択(またはキーを組み合わせてCtrl+N を押します。)し、インクルードファイル作成を指示します。
図2 MQL5 ウィザードを用いたインクルードファイルの作成
MQL5 ウィザードをオープンポジショントレーリングモジュールとして用い、ファイルを『検出』にするには、フォルダ Include\Expert内に作成する必要があります。
標準ライブラリ内で廃棄されるためには、独自フォルダ Include\Expert\Trailing\MyTrailingを作成し、その中にМQL5ウィザードないにパラメータを指定してファイル SampleTrailing.mqh, を作成します。
図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とおりのパラメータが必要です。
- 指し値注文を無損失レベルに移動させるのを提案するために要求されるポジション収益のポイント番号
- 無損失レベル、すなわち移動した指値注文によりいくつの収益ポイントを固定するか
モジュールの設定はクラスの保護されたデータメンバに格納されます。設定へのアクセスは適切なパブリックメソッドによって実装されます。
われわれのファイルでこれをインクルードします。
//+------------------------------------------------------------------+ //| 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 ウィザードでオープンポジションを管理するのジュールの作成
モジュールのパラメータの記述セクションで指定した入力パラメータはこれで使用可能です。
図6 MQL5 ウィザードで オープンポジションを管理するモジュール作成の入力パラメータ
実装されたトレーディング戦略の入力パラメータの最良値は MetaTrader 5 端末の Strategy Testerを用いて検索可能です。
おわりに
MQL5ウィザードのトレーディング戦略ジェネレータ はトレーディングの考え方を検証することをひじょうに簡素化します。生成された expert のコードは標準ライブラリのトレーディング戦略クラス に基づきます。それはトレーディングシグナルクラス、資金およびリスク管理クラス、ポジションサポートクラスの特定の実装を作成するのに使用されます。
本稿では、MQL5 ウィザードでトレーディング戦略を書く方法、ジェネレータを、価格がポジション方向に行くときストップロスを無損失ゼロレベルへ移動させることでトレーディングの際ドローダウンを減らすことのできるオープンポジションを管理する独自のクラスと連携させる方法について述べます。MQL5 ウィザード用に作成されたクラスのストラクチャおよび記述フォーマットについても述べます。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/231
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索