
標準ライブラリのトレーディングストラテジークラスの探求- ストラテジーのカスタマイズ
はじめに
この記事は、機能性があり、EAを0から記述しない一種のカスタマイズに取り組みたい初心者ユーザーに向けられています。
MetaTrader 5では、プログラミングなどに関して最小、もしくは全く0の知識で専門的なトレーディングを行うことができ、とあるMetaEditorの機能のおかげです: それはMQL5 Wizardです。そのウィザード(この記事では詳しい動作については説明しません。)は、完了したプログラム(.mq5やex5ファイル)、アルゴリズム、コードを生成するように意図されています。MQL5標準ライブラリやトレーディングストラテジークラスから利益を得ます。
標準ライブラリ内にたくさんのトレーディングストラテジークラスがあり、そのうちの幾つかは、すでにとてもよく、金融市場や利益分析についての有名な研究から由来します。MetaTrader5と合う標準のインジケーターから個々のインジケーターに対して一つのストラテジーがあります。
これらのトレーディングストラテジークラスからトレーディングシグナルを作成するためには、MQL5ウィザードは、「トレーディングパターン」の形でコード化されたすでに出来上がったインジケーターの行動を呼び起こす仕組みを使用します。そして、個々それぞれ生成されたEAは、インジケーターを呼び(#include instructions)、パターンやトレーディングのためのEAにインポートされるトレーディングの意思決定を生成します。
MQL5ウィザード
まず最初のステップは、MQL5ウィザードを用いて、エキスパートアドバイザーを作成することです。MQL5ウィザードを、MetaEditorにおいて、「File」メニューから「New」ウィ選択するか、「New」ボタンを押し、「エキスパートアドバイザー」オプションを選択します。
MQL5ウィザードにて作成されたエキスパートアドバイザーを「MyExpert」と呼びましょう。
そして、それを扱うために二つのインジケーター/シグナルを追加します(使用可能インジケーターから欲しいだけたくさんの条件を選択することができます。)例えば、二つの有名なインジケーターを追加してみましょう:相対力指数(RSI)と移動平均(MA)です。RSIインジケーターを最初に、そして次にMAインジケーターを追加します。
希望通りにいくつかのパラメーターを設定するか、標準のパラメーターを設定できます。
OKをクリックし、ウィザードにて進めると、次のウィンドウではトレール注文を選択しませんが、もし追加したければ追加できます:この記事のトピックには影響はありません。次のウィンドウでは、5.0をトレーディング率として選択し、0.1ロット、その他のパラメーターを選択します:これは私たちの記事の議論には影響を与えません。
生成されたコードの分析
終えると、「MyExpert.mq5」が出来上がります。生成されたコードの重要な点を分析しましょう。
//+------------------------------------------------------------------+ //| MyExpert.mq5 | //| Harvester | //| https://www.mql5.com/en/users/Harvester | //+------------------------------------------------------------------+ #property copyright "Harvester" #property link "https://www.mql5.com/en/users/Harvester" #property version "1.00" //+------------------------------------------------------------------+ //| Include | //+------------------------------------------------------------------+ #include <Expert\Expert.mqh> //--- available signals #include <Expert\Signal\SignalRSI.mqh> #include <Expert\Signal\SignalMA.mqh> //--- available trailing #include <Expert\Trailing\TrailingNone.mqh> //--- available money management #include <Expert\Money\MoneyFixedLot.mqh>
まず、ウィザードによって生成されたコードに追加された#includeファイルを見てください。以下があります:
- Expert.mqh
- SignalRSI.mq
- SignalMA.mqh
それから、以下のコードです;
//--- Creating filter CSignalRSI CSignalRSI *filter0=new CSignalRSI; if(filter0==NULL) { //--- failed printf(__FUNCTION__+": error creating filter0"); ExtExpert.Deinit(); return(-3); } signal.AddFilter(filter0);
タイトルが示すように、それはチャートに添付される生成されたEAか、ストラテジーテスターにてテストされたEAの市場条件に適用される「フィルター」です。filter0は、0のインデックスを持つ最初のフィルターであり、その最初のフィルターの間、RSIを例では洗濯しています。
CSignalRSIは、Class Signal RSIという意味です。このクラスは、RSIインンジケーターを呼ぶために使用され、ウィザードのパターンロジックの使用を通して、買い・売りシグナルを作成するために幾つかの条件がそれに適用されます。RSIは、最初のフィルター(フィルター0)です。
以下のコードでは、幾つかのフィルターのパラメーターがあり、トレール注文セクション、と、資金管理におけるコードがあります。
次にこちらがあります:
//--- Tuning of all necessary indicators if(!ExtExpert.InitIndicators()) { //--- failed printf(__FUNCTION__+": error initializing indicators"); ExtExpert.Deinit(); return(-10); } //--- ok return(0); }
このセクションは、Expert.mqhインクルードファイルに属しています。それは、エキスパートの処理のために必要なインジケーターの初期化についてです。
そして、生成されたEAコードの最後の部分は、ディイニシャライゼーションと、その他のエキスパートアドバイザーのイベントです;
//+------------------------------------------------------------------+ //| Deinitialization function of the expert | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ExtExpert.Deinit(); } //+------------------------------------------------------------------+ //| "Tick" event handler function | //+------------------------------------------------------------------+ void OnTick() { ExtExpert.OnTick(); } //+------------------------------------------------------------------+ //| "Trade" event handler function | //+------------------------------------------------------------------+ void OnTrade() { ExtExpert.OnTrade(); } //+------------------------------------------------------------------+ //| "Timer" event handler function | //+------------------------------------------------------------------+ void OnTimer() { ExtExpert.OnTimer(); } //+------------------------------------------------------------------+
実は、このEAは「フィルター」や「重み」ロジックを使用するトレーディングクラスの標準ライブラリを通してトレーディングの意思決定のために二つのインジケーター(RSIとMA)を使用します。MQL5のリファレンス トレードシグナルのモジュール の中でそれについてより詳しい情報を見つけることができます。しかし、私たちの目的は、新しいフィルターとしてトレーディングストラテジーを使用することにあります。
なので、まず最初のステップとして、少々MyExpert.mq5を修正したいと思います。別のフィルターを追加してみましょう。それはフィルター2となり、 フィルター1のコードの後に配置します。
//--- Creating filter CSignalCCIxx CSignalCCIxx *filter2=new CSignalCCIxx; if(filter2==NULL) { //--- failed printf(__FUNCTION__+": error creating filter2"); ExtExpert.Deinit(); return(-4); } signal.AddFilter(filter2); //--- Set filter parameters filter2.PeriodCCIxx(Signal_CCIxx_PeriodCCI); filter2.Applied(Signal_CCIxx_Applied); filter2.Weight(Signal_CCIxx_Weight);
フィルダーや、市場での意思決定の中心である #includeファイルに戻りましょう。最初は、#include <Expert\Expert.mqh>ファイルです。このインクルードファイルはその他のファイルを含みます;
- #include "ExpertBase.mqh"
- #include "ExpertTrade.mqh"
- #include "ExpertSignal.mqh"
- #include "ExpertMoney.mqh"
- #include "ExpertTrailing.mqh"
これらのインクルードファイルは、EAの主要なストラクチャー、トレーディングストラクチャー、シグナル、マネー、トレール注文です。これらのファイルを詳しく分析したり、修正したりしません。今回の目的は、MetaTrader5の標準のインジケーターから既存のインジケーターを使用して、独自のストラテジーを追加し、またインクルードファイルを追加することにあります。
MyExpert.mq5コードでは、RSIとMAインジケーターのインクルードファイルがあり、トレーディングの意思決定においてシグナル/フィルターとして使用しました。それでは、カスタムインクルードファイルを追加しsましょう。その目的のため、CCIインジケーターに属する修正されたシグナルを使用します。
//+------------------------------------------------------------------+ //| Include | //+------------------------------------------------------------------+ #include <Expert\Expert.mqh> //--- available signals #include <Expert\Signal\SignalRSI.mqh> #include <Expert\Signal\SignalMA.mqh> #include <Expert\Signal\SignalCCIxx.mqh> // This is our own 'custom' indicator for custom Signal management of the EA
SignalCCIxx.mqhファイルは、\MQL5\Include\Expert\Signal\フォルダにあるべきで、標準ライブラリのその他#includeトレードクラスのようにウィザードに生成されたEAの積分可能性と一致する必要があります - シグナルファイルは、すでにこのフォルダーに存在します(SignalRSI.mqhとSignalMA.mqh)
この例においては、元のCCIファイルをコピーし、修正されたコードを含んだCCIxxというファイルを作成し、それを#includeファイルとして使用します。それでは、単純さのために、標準ライブラリからCCIインジケーターのコピー版を使用します。
しなければいけないことは、\MQL5\Include\Expert\Signal\SignalCCI.mqh"ファイルを "\MQL5\Include\Expert\Signal\SignalCCIxx.mqh"ファイルにコピーすることです。それを行う最も簡単な方法は、ファイルのコピーをそのフォルダに作って、再度名前をつけることです。
このファイルを見てみましょう。ウィザード生成のMyExpert.mq5のこの「カスタム」方式の統合は、ちょうど終了した作業です。上記で説明されているように、フィルター2のコードを追加したので、以下の作業を終了させます。MyExpert.mq5ファイルにこれ以上焦点を当てないですが、今からは、CCIインジケーターのフィルター2トレーディングシグナルのためにEAの実際の中心にあるSignalCCixx.mqhファイルに焦点を当てます。
ストラテジーのカスタマイズ
SignalCCIの修正版であるCCIxxという「セミカスタム」ストラテジーの追加に戻ります。それは全く新しいカスタムシグナルではなく、むしろMetaTrader5と調和する標準インジケータのCCIインジケーター再設計版であるため、それをセミカスタムとします。このように、未熟なユーザーやプログラマーでもわずかにMQL5ウィザードによって生成されるEAノパターンやフィルターを既存のインジケーターを用いて修正することができ、言い換えれば、マーケットの売り・買いシグナルの生成のために独自のフィルターやパターンを作成できるのです。これは未だストラテジーを扱う素晴らしい基礎としてあります。
この例を見てみましょう。(既存のインジケーターにカスタムパターンをいくつか追加するために)この機能を必要としている人や、カスタマイズされた機能的なEAを作成するためにウィザードを使用しAutomated Trading Championshipに参加したい人にはとても役に立ちます。
これは、作業ー競争力のあるトレーディングに必要なトレール注文や資金管理などすべての機能を持つチャンピオンシップに適したEA作成ーを1時間ほどでこなせます。EAがウィザードによって作成されているという焦点を当てると、チャンピオンシップと名付けたように、これは実は、生成されたコードがエラーがなく、参加者はバグやエラーのsッフウ性に関する心配をする必要が全くありません。
EAはトレーディングにおいて完璧であり、少なくともトレードしたいけどプログラミングについて知らず、ジョブ サービスでEAを注文したくない人にとっては最適なものです。(チャンピオンシップに参加するには良い代替案です)企画しているストラテジーに違いトレーディングシステムを持つために割り当てられる入力パラメーターがたくさんあります。
しかし、ウィザードやトレーディングストラテジークラスの標準ライブラリを経由してMetaQuotesにより提供される標準フィルタ/パターンを持つ標準のインジケーターのみ使用することができます。インジケーターがたくさんのパラメーターを持ち、すべてのインジケーターのパラメーター、例えば、Period、Applied Priceなどを持っているので、数多くの組み合わせがあり、成功するトレーディングの可能性を提供し、この記事では、MetaTrader 5の標準インジケーターに関してパターン/フィルターをカスタマイズし追加する方法について簡単に素早く学んでいきます。
CCIシグナルトレーディングモデル(CCIxx)を作成する上でその動作をカスタマイズし修正するため、SignalCCIxx.mqh ファイルに進みましょう。まずは、MyExpert.mqhファイルにて、以下の例のように入力セクションの新しい変数を追加しましょう(ハイライトで表示され散る部分をご覧ください。)
//+------------------------------------------------------------------+ //| Inputs | //+------------------------------------------------------------------+ //--- inputs for expert input string Expert_Title ="MyExpert"; // Document name ulong Expert_MagicNumber =26287; // bool Expert_EveryTick =false; // //--- inputs for main signal input int Signal_ThresholdOpen =40; // Signal threshold value to open [0...100] input int Signal_ThresholdClose=60; // Signal threshold value to close [0...100] input double Signal_PriceLevel =0.0; // Price level to execute a deal input double Signal_StopLevel =50.0; // Stop Loss level (in points) input double Signal_TakeLevel =50.0; // Take Profit level (in points) input int Signal_Expiration =4; // Expiration of pending orders (in bars) input int Signal_RSI_PeriodRSI =8; // Relative Strength Index(8,...) Period of calculation input ENUM_APPLIED_PRICE Signal_RSI_Applied =PRICE_CLOSE; // Relative Strength Index(8,...) Prices series input double Signal_RSI_Weight =0.7; // Relative Strength Index(8,...) Weight [0...1.0] input int Signal_MA_PeriodMA =90; // Moving Average(12,0,...) Period of averaging input int Signal_MA_Shift =0; // Moving Average(12,0,...) Time shift input ENUM_MA_METHOD Signal_MA_Method =MODE_SMA; // Moving Average(12,0,...) Method of averaging input ENUM_APPLIED_PRICE Signal_MA_Applied =PRICE_CLOSE; // Moving Average(12,0,...) Prices series input double Signal_MA_Weight =0.6; // Moving Average(12,0,...) Weight [0...1.0] input int Signal_CCIxx_PeriodCCI =8; // Commodity Channel Index(8,...) Period of calculation input ENUM_APPLIED_PRICE Signal_CCIxx_Applied =PRICE_CLOSE; // Commodity Channel Index(8,...) Prices series input double Signal_CCIxx_Weight =0.8; // Commodity Channel Index(8,...) Weight [0...1.0]
Ginal_RSI_Weightと Signal_MA変数の値を1.0から0.7、0.6に変更し、ハイライトで表示されている行を追加しました。トレーディングストラテジークラスのCCIインジケーターに所属するパターンのCCIxx修正版において入力パラメーターを正しく扱うために、実はSigunalCCI.mqhファイルからの3行のコードをコピーし、「CCI」の後の接尾に「xx」を追加しました。
クラス宣言文の"protected"セクションでは、、多くの興味深い要素があります;
class CSignalCCI : public CExpertSignal { protected: CiCCI m_cci; // object-oscillator //--- adjusted parameters int m_periodCCI; // the "period of calculation" parameter of the oscillator ENUM_APPLIED_PRICE m_applied; // the "prices series" parameter of the oscillator //--- "weights" of market models (0-100) int m_pattern_0; // model 0 "the oscillator has required direction" int m_pattern_1; // model 1 "reverse behind the level of overbuying/overselling" int m_pattern_2; // model 2 "divergence of the oscillator and price" int m_pattern_3; // model 3 "double divergence of the oscillator and price" //--- variables double m_extr_osc[10]; // array of values of extremums of the oscillator double m_extr_pr[10]; // array of values of the corresponding extremums of price int m_extr_pos[10]; // array of shifts of extremums (in bars) uint m_extr_map; // resulting bit-map of ratio of extremums of the oscillator and the price
m_patternと呼ばれるint型を見てみましょう。これらの変数は、0から3と数字がつき、それぞれは、「パターン」であり、買い・売りにおける条件を決定するモデルです。
二つのカスタムパターンを追加しましょう: m_pattern_4とm_pattern_5の二つです。2行のコード、二つのInt型変数を追加しましょう。
//--- "weights" of market models (0-100) int m_pattern_0; // model 0 "the oscillator has required direction" int m_pattern_1; // model 1 "reverse behind the level of overbuying/overselling" int m_pattern_2; // model 2 "divergence of the oscillator and price" int m_pattern_3; // model 3 "double divergence of the oscillator and price" int m_pattern_4; // model 4 "our own first new pattern: values cross the zero" int m_pattern_5; // model 5 "our own second new pattern: values bounce around the zero"
もしコードを続けて見ると、買い・売りのロジックを理解できます。しかし、どのようにパターンを追加するかについてのセクションのみに集中していき、これらのインクルードファイルを1行ずつ説明していきません。(この目的のために、読者はファイルを自身で開き、学習できます。MQL5リファレンスは学習の助けになります。)
こちらも行いたいと思います:CSignalCCIxx.mqhファイルにて、CTRL+Hを押し、「CCI」」を探索し、「CCIxx」と置き換えます。 "Replace All" をクリックしてください - 41ほど見つかり、置換されます。ファイルの最初の部分から始めましょう:
//+------------------------------------------------------------------+ //| Class CSignalCCIxx. | //| Purpose: Class of generator of trade signals based on | //| the 'Commodity Channel Index' oscillator. | //| Is derived from the CExpertSignal class. | //+------------------------------------------------------------------+ class CSignalCCIxx : public CExpertSignal { protected: CiCCIxx m_CCIxx; // object-oscillator
このように変更します;
protected: CiCCIxx m_CCIxx; // object-oscillator
元のSignalCCI.mqhのようになります:
protected: CiCCI m_CCIxx; // object-oscillator
CiCCI は、その他のインクルードファイルから呼び出され、もし名前を変更すると、幾つかのエラーが出るため、上記を行います。SignalCCIxx.mqh fileをコンパイルすると、エラーや警告が出ないはずです。もしあれば、何かミスをしているので、上の手順を繰り返す必要があります。
パターンを追加するという中核に進みましょう。マーケットトレーディング動作の二つのパターンを追加します。合計で、4つのシグナル(パターン)を持ち、二つは売り、二つは買いに関するものです。変更部分はこちらです;
//+------------------------------------------------------------------+ //| Constructor CSignalCCIxx. | //| INPUT: no. | //| OUTPUT: no. | //| REMARK: no. | //+------------------------------------------------------------------+ void CSignalCCIxx::CSignalCCIxx() { //--- initialization of protected data m_used_series=USE_SERIES_HIGH+USE_SERIES_LOW; //--- setting default values for the oscillator parameters m_periodCCIxx =14; //--- setting default "weights" of the market models m_pattern_0 =90; // model 0 "the oscillator has required direction" m_pattern_1 =60; // model 1 "reverse behind the level of overbuying/overselling" m_pattern_2 =100; // model 2 "divergence of the oscillator and price" m_pattern_3 =50; // model 3 "double divergence of the oscillator and price" m_pattern_4 =90; // model 4 "our own first new pattern: " m_pattern_5 =90; // model 5 "our own second new pattern: }
m_pattern_4やm_patter_5に90という値を設定しましたが、独自の値に変更する必要があります:これらは、すべてのエキスパートトアドバイザーのトレーディングの動作を影響する、マーケットモデルに割り当てる重みです。
二つの新しいマーケットも出るを追加しましょう。それらはとてもシンプルになります-教育目的であり、テストされていないシグナルなので、それを用いてトレードしないでください。一致するバーにおいての以下の数字にて、シャ線がCCIインジケーターの値を特定する手助けをしてくれます。
最初のパターン
下から上に0線を交差する
これは最初のパターンであり;「価格が成長することを支持する」ためのものです。
- 図5は、バー1に一致するCCI値を示します(現在のバーの一つ手前のバー)その値は 45.16 > 0 です。
- 図6は、バー2に一致するCCI値を示します(現在のバーの二つ前のバー)その値は -53.92 < 0 です。
- CCIインジケーターの0線を二つのバーにおいて下から上でに交差されます。
下から上への0線の交差
これが最初のパターン:「価格が降下することに支持する」ものです。
- 図7は、バー1に一致するCCI値を示します。その値は -28.49 < 0です。
- 図8は、バー2に一致するCCI値を示します。その値は 2.41 > 0.です。
- CCIインジケータの0線は、二つのバーにおいて上から下に交差されます。
二番目のパターン
上から下に0線を交差し、上に戻ります。
これは二番目のパターンであり;「価格が成長することを支持する」というものです。
- 図9は、バー1に一致するCCI値です。その値は 119.06 > 0.です
- 図10は、バー2に一致するCCI値を示します。その値 は -20.38 < 0.です。
- 図11は、バー3に一致するCCI値を示します。その値は 116.85 > 0 です。
- CCIインジケーターの0線(0.00値)は上から下に交差します。3つのバーにおいて、0線から縦揺れし戻ったCCIインジケーター線
下から上に0線を交差し、以下に戻ります。
これは二番目のパターンであり;「価格が降下することを支持する」というものです。
- 図12は、バー1に一致するCCI値を示します。その値は -58.72 < 0.です。
- 図13は、バー2に一致するCCI値を示します。その値は 57.65 > 0です。
- 図14は、バー3に一致するCCI値を示します。その値は -85.54 < 0 です。
- 下から上に交差されるCCIインジケータの0線3つのバーにて0線の周りを縦揺れし戻るmodoruCCIインジケーター線
実装パターン
これらの4つの条件を実装するために、以下のコードを以下のように修正しなければなりません。下部にて、「買い」条件におけるコードを追加しました。(上のコメントをご覧ください;価格の成長を支持するものです。)
//+------------------------------------------------------------------+ //| "Voting" that price will grow. | //| INPUT: no. | //| OUTPUT: number of "votes" that price will grow. | //| REMARK: no. | //+------------------------------------------------------------------+ int CSignalCCIxx::LongCondition() { int result=0; int idx =StartIndex(); //--- if(Diff(idx)>0.0) { //--- the oscillator is directed upwards confirming the possibility of price growth if(IS_PATTERN_USAGE(0)) result=m_pattern_0; // "confirming" signal number 0 //--- if the model 1 is used, search for a reverse of the oscillator upwards behind the level of overselling if(IS_PATTERN_USAGE(1) && Diff(idx+1)<0.0 && CCIxx(idx+1)<-100.0) result=m_pattern_1; // signal number 1 //--- if the model 2 or 3 is used, perform the extended analysis of the oscillator state if(IS_PATTERN_USAGE(2) || IS_PATTERN_USAGE(3)) { ExtState(idx); //--- if the model 2 is used, search for the "divergence" signal if(IS_PATTERN_USAGE(2) && CompareMaps(1,1)) // 00000001b result=m_pattern_2; // signal number 2 //--- if the model 3 is used, search for the "double divergence" signal if(IS_PATTERN_USAGE(3) && CompareMaps(0x11,2)) // 00010001b return(m_pattern_3); // signal number 3 } // if the model 4 is used, look for crossing of the zero line if(IS_PATTERN_USAGE(4) && CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0) result=m_pattern_4; // signal number 4 // if the model 5 is used, look for the bouncing around the zero line if(IS_PATTERN_USAGE(5) && CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0 && CCIxx(idx+3)>0.0) result=m_pattern_5; // signal number 5 } //--- return the result return(result); }
「売り」条件における一致するコードを修正しましょう。下部にて、売り条件におけるコードを追加しました(コメントをご覧ください:価格の降下を支持)
//+------------------------------------------------------------------+ //| "Voting" that price will fall. | //| INPUT: no. | //| OUTPUT: number of "votes" that price will fall. | //| REMARK: no. | //+------------------------------------------------------------------+ int CSignalCCIxx::ShortCondition() { int result=0; int idx =StartIndex(); //--- if(Diff(idx)<0.0) { //--- the oscillator is directed downwards confirming the possibility of falling of price if(IS_PATTERN_USAGE(0)) result=m_pattern_0; // "confirming" signal number 0 //--- if the model 1 is used, search for a reverse of the oscillator downwards behind the level of overbuying if(IS_PATTERN_USAGE(1) && Diff(idx+1)>0.0 && CCIxx(idx+1)>100.0) result=m_pattern_1; // signal number 1 //--- if the model 2 or 3 is used, perform the extended analysis of the oscillator state if(IS_PATTERN_USAGE(2) || IS_PATTERN_USAGE(3)) { ExtState(idx); //--- if the model 2 is used, search for the "divergence" signal if(IS_PATTERN_USAGE(2) && CompareMaps(1,1)) // 00000001b result=m_pattern_2; // signal number 2 //--- if the model 3 is used, search for the "double divergence" signal if(IS_PATTERN_USAGE(3) && CompareMaps(0x11,2)) // 00010001b return(m_pattern_3); // signal number 3 } if(IS_PATTERN_USAGE(4) && CCIxx(idx+1)<0.0 && CCIxx(idx+2)>0.0) result=m_pattern_4; // signal number 4 if(IS_PATTERN_USAGE(5) && CCIxx(idx+1)<0.0 && CCIxx(idx+2)>0.0 && CCIxx(idx+3)<0.0) result=m_pattern_5; // signal number 5 } //--- return the result return(result); }
追加された最後の行の(idx+1) or (idx+2) ... (idx+n) はとてもシンプルですが、重要なポイントでもあります:+1, +2, +3は、ちょうど現在のバーに先行するバーの数 です。(現在のバーは、活動中の「ろうそく」であり、0番目のバーです。)
idx+Nが増えれば、たくさんのバーに戻ります。同じタイムフレームでの同じ「垂直」ポジションにて、すべてのバー(idx+n)は、インジケーターの値に一致します。
図16では、 0番目のバー(idxかidx+0に一致s得る右の最初のろうそく)は、0.00以下の一致するCCI値を持ちます。また、二番目のバー (idx+1)と、三番目のバー (idx+2) は、0.00より下の値を持ちます。縦方向の矢印のあるバーにまだ印をつけていませんが、もし4番目のバーにマウスを合わせると、その一致するCCI値が0.00を超えていることがわかります。
ユーザーの大半にとって、この事実は明白ですが、初心者にとっては、価格チャートのグラフィカルバー/ろうそくや、CCIインジケーターの様子、idx変数とCCIxxインジケーターの値がお互いにどのように一致しているかを知ることは良いと思います。
これは、チャートの選択したインジケーターを見たり、バーインデックスidxやインジケーターの変数値を用いてコーディングできるストラテジーのためのサブポジションを作成するために選択したインジケーターの動作や価格バー/ろうそく間の一致を「視覚化」するためには重要です。
SignalCCIxx.mqhファイルでは、以下のコードがあります:
CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0
こちらは以下の意味を持ちます:
CCI インジケーター値( idx+1という名前で1バー手前) はCCIインジケーターの0線 の上 にあり、 CCI インジケーター値(idx+2という名前で2バー手前) はCCIインジケーターの0線の 下 にあります。
これは、シンプルに選択したインジケーター値に基づいた二つのカスタムパラメーターを追加する方法の最小の例になります。
「価格の成長」か「価格の降下」条件は、この形式でPatternに追加される必要があり、より複雑な条件を作成することができます。最後のテスト前に、どのようにポジションがオープン、クローズされるかの仕組みを見てみましょう。
その仕組みやロジックはすでにMQL5リファレンスマニュアルの標準ライブラリのトレーディングストラテジークラスセクションにてよく説明されています。
MyExpert.mq5ファイルには、二つの入力パラメーターがあります(二つのInt変数):
//--- inputs for main signal input int Signal_ThresholdOpen =40; // Signal threshold value to open [0...100] input int Signal_ThresholdClose=60; // Signal threshold value to close [0...100]
オープンとクローズのためのこれらの閾値は、もしトレードがオープンロングかショートで、クローズされる場合、計算に使用される二つの値です。その閾値は、0から100のInt型の値を想定しています。これらのパラメーターは何を意味するでしょうか?
Signal_ThresholdOpenは、ロングかショートポジションをオープンするための値であり、Signal_ThresholdCloseは、以前のオープンのポジションをクローズするための値です。これらの値は、シンプルですが優秀な仕組みのもと計算され、ウィザードに生成されたEAの全体のロジックに密接に関連しています。
Signal__.mqh(__は、MA、RSIやCCIxxで使用されるインジケーターの名前を示しています。)のすべてのシグナルは 以前詳しく見たようにパターンから成り立ちます。もう一度見てみましょう。SignalMA.mqhファイルから、すべてのパターンにおける関連する「重み」の4つのパターンがあります;
//--- setting default "weights" of the market models m_pattern_0 =80; // model 0 "price is on the necessary side from the indicator" m_pattern_1 =10; // model 1 "price crossed the indicator with opposite direction" m_pattern_2 =60; // model 2 "price crossed the indicator with the same direction" m_pattern_3 =60; // model 3 "piercing"
そして、SignalRSI.mqhファイルからのRSI:
//--- setting default "weights" of the market models m_pattern_0 =70; // model 0 "the oscillator has required direction" m_pattern_1 =100; // model 1 "reverse behind the level of overbuying/overselling" m_pattern_2 =90; // model 2 "failed swing" m_pattern_3 =80; // model 3 "divergence of the oscillator and price" m_pattern_4 =100; // model 4 "double divergence of the oscillator and price" m_pattern_5 =20; // model 5 "head/shoulders"
SignalCCIxx.mqh (ほぼ、SignalCCI.mqhのコピーです。) では、これらの値があります;
//--- setting default "weights" of the market models m_pattern_0 =90; // model 0 "the oscillator has required direction" m_pattern_1 =60; // model 1 "reverse behind the level of overbuying/overselling" m_pattern_2 =100; // model 3 "divergence of the oscillator and price" m_pattern_3 =50; // model 4 "double divergence of the oscillator and price" m_pattern_4 =80; // model 4 "our own first new pattern: " m_pattern_5 =90; // model 5 "our own second new pattern: "
これらは、標準の0, 1, 2, 3 に80と90の二つの変数を持つ自分の4と5のパターンを加えたものです。MyExpert.ex5をチャートに付けたり、ストラテジーテスターにてテストする際、選択したすべてのSignalのパターン(RSI、MA、CCIxx)は持続的に計算されます。
もし一つかそれ以上のパターンの条件が成功すれば、そのパターンのシグナルは、次の計算において活動開始され、例えば、SignalCCIxx.mqhファイルのm_pattern_4が発生している場合、条件は:
// if the model 4 is used, look for crossing of the zero line if(IS_PATTERN_USAGE(4) && CCIxx(idx+1)>0.0 && CCIxx(idx+2)<0.0) result=m_pattern_4; // signal number 4
潜在性のあるトレードシグナルになります。言い換えれば、バー1のCCI値が 0.0以上であり、そして 同時に図5や6のバー2のCCI値が0.0以下である場合、その条件が満たされ、そのm_patter_4は開始されます。
CCIxxストラテジーのシグナルのためにセットした重みの値は80の絶対値に等しいですが、「価格の降下を支持」の場合、-80を、「価格の成長を支持」の場合、80を想定します。「価格の降下を支持」は、パターンの重み値に負の印をつけます。
m_pattern_4の条件は、うまくいくと想定した際、トレードは、以下の場合のみオープンになります:
シグナルナンバー4 (m_pattern_4)は、条件が真の唯一のシグナルです(シグナル開始中) AND Signal_ThresholdOpen のゴールに達しました。(その値は、係数によって掛け算され、Signal_ThresholdOpen値を超えます)
シグナルナンバー4は、Signal_ThresholdOpenのゴールに達し、CCIxxストラテジーの相手と 一方で競争しています (CCIxxストラテジーのシグナル/パターン「価格の降下を支持」) そしてその他反対方向のその他インジケーターのシグナルと競争しています(「価格の成長の支持」におけるm_pattern_4を分析しているので、ショートになります。)
なので、すべてのパターンを競争相手として考えることができます:ブルシグナルと、ベアシグナル同じ方向のこれらのパターン/シグナル(価格の成長の支持)が成功すれば、互いに合計され、その合計は、Signal_ThresholdOpen値と比較されます。もし後その合計がSingla_ThresholdClose値と比較された際、そのSignalCCIxx.mqhのm_pattern_4は、以下の値を持ちます:
- 80 (価格成長の条件の場合)
- -80 (価格降下の条件の場合)
すべてのシグナル(SignalRSI.mqh、SignalMA.mqh、0,1,2,3,4,5つのSignalCCIxx.mqhのパターン)は0の値を得ると想定しましょう。これは「シグナル競争者」がその「ゲーム」から降り、唯一の競争者は、m_pattern_4の二つのみという - 売り・買いに一つずつ、トイう形です。0から80までの様々な値を持つので、m_pattern_4 のみを稼働させています。
//--- setting default "weights" of the market models m_pattern_0 =0; // model 0 "price is on the necessary side from the indicator" m_pattern_1 =0; // model 1 "price crossed the indicator with opposite direction" m_pattern_2 =0; // model 2 "price crossed the indicator with the same direction" m_pattern_3 =0; // model 3 "piercing"
同じように、SignalRSI.mqhファイルからのRSI:
//--- setting default "weights" of the market models m_pattern_0 =0; // model 0 "the oscillator has required direction" m_pattern_1 =0; // model 1 "reverse behind the level of overbuying/overselling" m_pattern_2 =0; // model 2 "failed swing" m_pattern_3 =0; // model 3 "divergence of the oscillator and price" m_pattern_4 =0; // model 4 "double divergence of the oscillator and price" m_pattern_5 =0; // model 5 "head/shoulders"
SignalCCIxx.mqh (ほぼ、SignalCCI.mqhのコピーです。) では、これらの値があります;
//--- setting default "weights" of the market models m_pattern_0 =0; // model 0 "the oscillator has required direction" m_pattern_1 =0; // model 1 "reverse behind the level of overbuying/overselling" m_pattern_2 =0; // model 3 "divergence of the oscillator and price" m_pattern_3 =0; // model 4 "double divergence of the oscillator and price" m_pattern_4 =80; // model 4 "our own first new pattern: " m_pattern_5 =0; // model 5 "our own second new pattern: "
この記事の最初に、これらの行を追加しました。
input int Signal_CCIxx_PeriodCCI =8; // Commodity Channel Index(8,...) Period of calculation input ENUM_APPLIED_PRICE Signal_CCIxx_Applied =PRICE_CLOSE; // Commodity Channel Index(8,...) Prices series input double Signal_CCIxx_Weight =0.8; // Commodity Channel Index(8,...) Weight [0...1.0]
8.0の値を持つSignal_CCIxx_Weight変数に焦点を当てました。その閾値が達成すると、Signal_ThresholdOpenは完了します。その値は、このように計算されます;
0.8 (Signal_CCIxx_Weight入力パラメーター) * 80 (m_pattern_4の重み値) = 64 は「価格の成長の支持」におけるシグナル強度です
そのアルゴリズムは、「価格成長」シグナル(SignalCCIxxのM_pattern_4)や値が80であることをつかむので、「価格の成長の支持」となります。
もし理論的に「価格の降下」(SigalCCIxxのm_patter_4を捕まえると、その値は-80です。「価格の降下」においてそのアルゴリズムは、パターン値にマイナスのサインをつけます。「価格の降下を支持」という場合、その計算は以下の様になると想定します:
0.8 (Signal_CCIxx_Weight 入力パラメーター) * -80 (m_pattern_4の重み値) = -64 = 負の値は、ショートポジションであると考えられています。
-64 --> 64 (絶対値) は、「価格の降下を支持」シグナルの強さを示します。そのシグナルの強さは常に絶対値で表現され、ショートポジションの値は、マイナスの符号によって先行され、ロングポジションの場合は、プラスの符号となります。
64のシグナルの強さや64の取得した値を持つロングポジションの上記の例に戻ります。もしそのほかに何も反対の競争する(負の符号の)シグナル(Signal_ のm_pattern_N)がなければ、40の値を持つSignal_ThresholdOpenが取得されます。というのも、ロングシグナルの強さは、64であり、Signal_ThresholdOpenの40レベルは、24に足されるためです(40 + 24 = 64)Signal_ThresholdOpenに達すると、ロングポジションは、オープンになります。
例えば、Signal_CCIxx_Weightでの0.4の値は、すべてのロングポジションがオープンになりません:
0.4 ( Signal_CCIxx_Weight) * 80(m_pattern_4) = 32 ("ロングシグナル"の強さ)
40レベル (Signal_ThresholdOpen) は達しられません。というのも 32 < 40,であり、ロングポジションはオープンされないためです。
上記の例の値(SignalCCIxx.mqhのm_pattern_4における80以外のすべての値0) はウィザードや重みなどのシステムの裏側の素晴らしいロジックを理解させるために使用されます。. 通常のプログラミングにおいて、好ましい重みを、Signal__のm_pattern_Nそれぞれに割り当てます。値0をパターンに割り当てると、このパターンは使用されないということを意味します。
上記の例にて別の値に変更すると(SignalCCIxx.mqhのm_pattern_4を除く設定されたすべてのパラメーターにて) 例えば、SignalRSI.mqhのm_pattern_1から100に変更すると、その計算は、4 つの競争相手を持つように変化します。
- SignalCCIxx.mqhのm_pattern_4 (Bull)とm_pattern_4 (Bear)、 80の値と-80
- SignalRSI.mqh のm_pattern_1 (Bull)とm_pattern_1 (Bear)、100と -100
m_pattern_4 Bullish --> 0.8 * 80 = 64 m_pattern_2 Bullish --> 0.7 * 100 = 70
m_pattern_4 Bearish --> 0.8 * (-80) = -64 m_pattern_2 Bearish --> 0.7 * (-100) = -70
したがって、4つの可能な組み合わせがあります。
A) m_pattern_4 Bullish + m_pattern_2 Bullish = {[0.8 * (80)] + [0.7 * (100)]}/2 = [64 + (70)]/2 = 134/2 = 67 B) m_pattern_4 Bullish + m_pattern_2 Bearish = {[0.8 * (80)] + [0.7 * (-100)]}/2 = [64 + (-70)]/2 = -6/2 = -3 C) m_pattern_4 Bearish + m_pattern_2 Bullish = {[0.8 * (-80)] + [0.7 * (100)]}/2 = [(-64) + 70]/2 = 6/2 = 3 D) m_pattern_4 Bearish + m_pattern_2 Bearish = {[0.8 * (-80)] + [0.7 * (-100)]}/2 = [(-64) + (-70)]/2 = -134/2 = -67
ケースA
67の正の値40の値を持つSignal_ThresholdOpenが実現され、超えられたので、ロングポジションがオープンになります。60の値を持つSignal_ThresholdCloseが取得され、 ケース D = -67 = |67| の絶対値によって超えられます。というのも、絶対値におけるケースDの強さは、67 > 60であるためです。(Signal_ThresholdCloseの閾値です。)
ケースB
負の値 -3. 40の値を持つSignal_ThresholdOpenがケースBの絶対値によって超えられていないため、ショートポジションはオープンではありません。:「シグナルの強さ」と3 < 40 (ポジションをオープンするためのシグナルにおける値)を計算するために絶対値を考慮する際に、-3 は 3となります。オープンなショートポジションはなく、当然、ショートポジションおクローズにおける計算はありません。
ケース C
正の値3ロングポジションはオープンではありません。なぜなら、40の値のSignal_ThresholdOpenは、ケースCの値に超えられていないためで、3 < 40 (ポジションをオープンするためのシグナルにおける値)です。オープンなロングポジションはなく、当然、ロングポジションおクローズにおける計算はありません。
ケース D
負の値 -67. ショートポジションはオープンです。なぜなら、40の値のSignal_ThresholdOpenは絶対値-67と67 > 40で計算されるシグナルの強さに越されるためです。60の値であるSignal_ThresholdCloseは、67 (ケースАの強さ) > 60 Signal_ThresholdCloseの閾値)であるため、ケースA= 67 に越される時に、ショートポジションはクローズされます。
言い換えれば、ショートポジションをオープンすることにおいて、最初に 負の値のシグナルのためにその方向を特定する必要があり、次に負の値は、その絶対値に変換され、シグナルの強さを計算しSignal_ThresholdOpenの値と比較され、前者 >= 後者 かを計算します。
ロング ポジションのクローズは同様の形式で行われます: まず負の値をロングポジションをクローズするために考慮します。(対して、ショートポジションのクローズにおける値は、正の値です。)次に この負の値は、絶対値に変換され、Signal_ThresholdCloseと比較され、前者 >= 後者 かを判断されます。
ロングポジションをオープンし、 ショートポジションをクローズすることにおいて、その計算は、正の数に基づいて実行され(マイナスの符号のあるシグナルはありません)、計算において絶対値を考える必要はありません。ロングポジションのオープンは、シグナルの強さの正の値によって引き起こされ、ショートポジションのクローズは、シグナルの強さの正の値により引き起こされます。
まずは ロングのオープンかショートのオープンと、ショートのクローズか ロングポジションのクローズのために、正の符号と負の符号が考慮されます。(Signal_ThresholdOpenとSignal_ThresholdCloseにおける負の符号なしで、)正の符号で計算されるSignal_ThresholdOpenとSignal_ThresholdCloseの閾値との比較のための絶対値を計算しました。
ポジションの詳細
ポジションの詳細に詳しく探求していきましょう。
- 通常のトレーディング. ポジションはオープンかクローズの状態です。その後、ポジションは即座に再度オープンされません。
- ポジション反転l. ポジションがオープンされ、次にクローズ、そして、反対方向にオープンとなります。
ロングポジション は以下の場合オープンです:
Open_long >= Signal_ThresholdOpen
IF Signal_ThresholdClose <= Signal_ThresholdOpen | ||
---|---|---|
|
IF Signal_ThresholdClose >= Signal_ThresholdOpen | ||
---|---|---|
|
Signal_ThresholdClose >= Signal_ThresholdOpen の場合、Boolean "OR" となります。Signal_ThresholdClose >= Signal_ThresholdOpenはすでにSignal_ThresholdOpenの値を合体させているためです。したがって、ポジションは、クローズされ、Signal_ThresholdClose >= Signal_ThresholdOpenの値に上書きされ、ショートリバースとなります。
ショートポジションは以下の場合オープンです:
Open_short >= Signal_ThresholdOpen.
Signal_ThresholdClose <= Signal_ThresholdOpen | ||
---|---|---|
|
IF Signal_ThresholdClose >= Signal_ThresholdOpen | ||
---|---|---|
|
Signal_ThresholdClose >= Signal_ThresholdOpen の場合、Boolean "OR" となります。Signal_ThresholdClose >= Signal_ThresholdOpenはすでにSignal_ThresholdOpenの値を合体させているためです。したがって、ポジションはクローズされ、Signal_ThresholdClose >= Signal_ThresholdOpenの値に上書きされ、ロングリバースとなります。
ウィザードのEAのポジションのオープンとクローズの仕組みは、重みや値、閾値に基づいておりとても知能的です。この仕組みを使用して、ポジションは、素晴らしい「方法論」にてロジックエラーなしに管理されます。
価格レベルとシグナルの満了
また別の重要な変数があります;
input double Signal_PriceLevel =0.0; // Price level to execute a deal
この変数は、ウィザード生成のEAの仕組みの基礎的な理解のためにとても重要であり、このように単純化されます。
Signal_PriceLevelは、ロングシグナルが、指値注文か、逆指値として処理されるか決定し、ショートシグナルが、指値売りか、逆指値売りとして処理されるかを判断します。上記について詳しい情報は、 MetaTrader 5 Help sectionをご覧ください。
入力変数Signal_PriceLevelの負の値は、常に指値買いを意味します。(買い、売り)
入力変数Signal_PriceLevelに割り当てられた正の値は常に指値(買いか、売り)を意味します。
例:
EURUSD - ロングポジション
Signal_PriceLevel = -70 ( マイナス 70)
Signal Openが開始状態の際 (例えば、現在の価格 = 1.2500),
EA は、1.2500 + 70 = 1.2570からなる逆指値注文を行います。
(現在の価格よりもひどい状態です。)
Signal_PriceLevel = 60 (追加 60)
Signal Openが開始状態の際 (例えば、現在の価格 = 1.2500),
EAは、1.2500 - 60 = 1.2440からなる逆指値注文を行います
(現在の価格よりも良い状態です)
EURUSD - ショートポジション
Signal_PriceLevel = -70 ( マイナス 70)
Signal Openが開始状態の際 (例えば、現在の価格 = 1.2500),
EAは、1.2500 - 70 = 1.2430からなる指値注文を行います。
(現在の状態よりも良い状態)
Signal_PriceLevel = 60 (追加 60)
Signal Openが開始状態の際 (例えば、現在の価格 = 1.2500),
EAは、1.2500 + 60 = 1.2560からなる指値注文を行います
(現在の価格よりも悪い状態です。)
最後に、入力変数
input int Signal_Expiration =4; // Expiration of pending orders (in bars)
指値注文が活動する回数を判断します。
フローチャート
さらなる理解のために、いかにウィザードのEAが作動するかのダイナミックな仕組みを表すこの単純化されたフローチャートを考えましょう。
ストラテジーテスター
カスタマイズされたストラテジーの内容に戻り、SignalCCIxx.mqhファイルをコンパイルしましょう。もしエラーがなければ、すべて完了です。実は、マーケットトレーディング決定モデルの二つの新しいパターンを追加しています。それぞれのパターンは、買いと売りの条件、オープンとクローズの条件を同様に持ちます。
MyExpert.mq5ファイルをコンパイルし、もしすべてがOKなら、0エラーの0警告になるはずです。ストラテジーテスターでテストしましょう。EUR/USDシンボルにおける幾つかのパラメーターをストラテジーテスターに使用し、自動トレーディングチャンピオンシップ2011と同様の期間で行いました。
「良い結果」で3ヶ月より少ない期間での初期のデポジットにもかかわらず、このEAを実際のトレーディングに使用することはお勧めしませんが、むしろ、独自のパターン/モデルを追加し、実験し、適した結果が得られるまで最適化してみましょう。
私たちのここでの目的は、Trading Strategy Classesのアイディア が動作することを示すことです。
新しいパターン/モデルを作成し、 MQL5.communityにて共有することができます。MQL5 Wizardや、この記事で紹介されたシンプルなメソッドを用いながら、簡単にテストできます。この記事は、単純に、Standard LibraryのTrading Strategy Classesと、独自のトレーディングシステムを作成するためにライブラリを修正することがいかにシンプルになるかの例です。
結論
CCI Signalに二つの新しいフィルター/パターンを追加しました。すべてのインジケーターにおいて同じことができ、カスタマイズされたシグナルを作成できます。とても考えられたものを作成すれば、トレーディングにおいて強力な武器となります。
これは、インジケーターを扱うストラテジーに焦点を当ててストラテジーを追加する上で強力で便利な方法です。MQL5 WizardにEAのトレーディング機能や処理における作業をさせましょうーこれは、時間の節約となり、エキスパートアドバイザーの正確性を保証します。
MetaTrader 5 Standard Indicators を用いて、 ATC ready.であるEAにパッケージ化することで、独自のストラテジーを簡単に記述できます。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/488





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索