English Русский 中文 Español Deutsch Português
裁量トレードに向けたファジーロジック

裁量トレードに向けたファジーロジック

MetaTrader 4トレーディング | 19 9月 2016, 12:53
1 801 0
Alexander Fedosov
Alexander Fedosov

イントロダクション

技術の急速な発展は、近代的な通貨相場に自動取引システムの大きな流行をもたらしましました。しかし、多くのトレーダーはまだ裁量取引です。それぞれ一長一短があります。:自動化された取引は、一定の相場に対して柔軟性に欠け、裁量トレードは、逆に、人間的な要因にあまりにも影響されます。実際には、これらの本質は両極端です。

前回の記事で、例えば、ファジーロジック理論を適用することによって、自動化されたトレードの欠点を補おうとしました。ファジーロジックは、取引ロボットやインジケーターに適用される過度に厳格な形式化をぼかすことができます。この記事では、裁量トレードの戦略を改善します。しかし、最終的な決定は、常にトレーダーにかかっているので、裁量トレードの技術使用は、害よりも多くのメリットをもたらします。

 

条件の形式化とマニュアルの戦略を選択します。

現代の多くのトレーダーは、自動化されたシステムに頼るのではなく、トレードの責任を取ることを選択します。相場行動のすべての可能な結果を取ると、自分の取引戦略を開発する必要があります。厳密にそれに従うにしても、恐怖と欲によって引き起こされる衝動に抵抗しなければなりません。

したがって、取引戦略を考え出す必要があります。構築しようとしている3つのステージを説明します。

  • ステージ1検索と戦略に使用するツールの特定。
  • ステージNO2相場でポジションを開くためにトレーダーが使用する条件を設定。
  • ステージ3特定の条件を設定し、ポジションが正または負のいずれかの結果で決済。

ステージ1

最初の段階で、取引戦略を構築する3つのインジケーターを選択しました:

  1. 平均方向運動指数、ADX。これは、現在のトレンドの強さを決定するインジケーターです。
  2. 相対活力指数、RVIオシレーター。
  3. ビルウィリアムズのアクセラレータオシレータ(AC)インジケータ。

一般的な見解に、MQL4を選択しました:

図 1。戦略の設定の一般的な見解

ステージNO2

第二段階では、選択したインストゥルメント、その動作の条件、また、エントリーの際のパラメータを決めます。

それでは、始めましょう。

  • 最初のインジケータがADXです。図1から分かる通り、指定されたインジケーターの期間は10です。さらに、メイントレンドライン(緑色)のレベルを30に設定しました。それを超えた場合、相場参入の買いシグナルとみなされます。これは、+ DI(緑の破線)が-DI(赤点線)よりも高い場合、このインジケーターから買いシグナルになるとわかります。-DIが+ DIよりも高い場合には、売りシグナルになります。
  • 第二のインジケーターは、ACです。ここでは、公式ドキュメントで説明したシグナルを使用します。インジケータ値が0未満で、前2つのバーが増大した場合、それは買いシグナルです。インジケータ値が0以上で、前2つの足が下がった場合、売りシグナルです。
  • 第3のインジケーターは、RVIです。10で期間を設定してみましょう。シグナル線(薄赤)がメインライン(緑)を超えたときに買いシグナルとなります。このクロスは、分析バー上のラインの値は、ゼロ点以下でなければなりません。同様に、売りシグナルの条件を設定します:値がゼロより上でシグナル線がメインラインをクロスしたら売りです。
  • 次の条件が毎時間枠(H1)にされます。
  • エントリ条件はすべて、選択した3つのインジケーターから同様のシグナルを通過させます。
  • そして、最後に、ポジションの大きさを決定します。例として、以下の設定をします。:0.01ロットで、30ポイントのストップ、50ポイントの利益。

条件はより明確にするために形式化されます。

ロングポジションの入力(買いシグナル)

  1. + DI値が-DIよりも高く、ADXインジケータのメインの緑色の線が30よりも大きい。
  2. ACは、現在のバーの上に上昇し、また連続して上昇する前の2つのバーよりも高い。視覚的には、各列が前のより短い緑ヒストグラム3列があり、3つすべてが、負の領域内に配置されています。
  3. RVIシグナルは(細い赤)ラインはメインライン(緑)とクロスし、両方がそれでもゼロ点を下回っています。
  4. 0.01ロットで買い、50ポイントのリミット、30ポイントのストップ。
ショートポジションを入力(売りシグナル)
  1. ADXインジケータの主な緑色の線は+ DI値が-DIを下回っているのに対し、30に等しい値を保持します。
  2. ACは、現在のバーで減少し、常に減少を続ける前の2つのバーに比べて低くなります。視覚的には、各列が前のものよりも短い赤ヒストグラムの3つの列があり、3つのすべての値はゼロ以上です。
  3. RVIシグナル線(薄赤)がメインライン(緑)がクロスした場所はプラスの領域である必要があります。
  4. 0.01ロットで売り、50のリミット、30のストップ。

ステージNo3

次にやらなければならないことは、ポジションを決済する方法を決定することです。50のリミットか、30のストップを実行:決済の条件として、以前に取得した価格目標を設定します。

よって、取引戦略が定義されました。ポジションの保有と決済の条件を設定し、インジケーターを選択し、パラメータを設定し、ポジションエントリとその目標のサイズを定義しました。そして、最後に、相場を決済するためのイベントを決定しました。

次の段階では、作成した取引戦略を確認します。理想的な長期的視点での戦略と、絶対的な相場の段階がないことです。自動化取引を使用するトレーダーや裁量で取引を人々は、様々な条件で証明されていることを確認します。すでに指定された取引システムにおける初期条件がより良い結果を示していることは珍しいことではありません。

例えば、システムに関しては、トレーダーは、設定された利益を高くされたと気づくかもしれません。これは単により多く獲得することを望むからという訳ではなく、常にシステムの分析を行い、価格がねらった方向に移動しつづけるからです。そのためトレーダーには、もっともな質問があるかもしれません。つまり、結果を改善するために、取引システムに対して得られた統計データをどうやって観測するか、ということです。

 

ファジーロジックによって形式化の欠点を改善

ファジーロジック理論の観点から、システムで使用されるインジケーターを見てみましょう。厳密な分類が適用される取引戦略の部分を分析する際の柔軟性 - 以前の記事では、その主な利点を伝えることを試みました。ファジーロジックは、その動作の境界部分で評価し、システムの反応のより広範囲を与える厳密な境界をぼかしました。ADXインジケータの動作に、より適応可能なアプローチの例もありました。まず、弱いトレンドと強いトレンドの間の厳密な分割が適用されましたが、その後、これらのカテゴリは、トレンドの強さが厳密にインジケーター値にリンクされていませんでした。

しかし、システムに戻って自問してみましょう:このすべてが役立つでしょうか。

トレーダーが相場を観察し、インジケーターからのシグナルを認識していることを想像します:例えば、ADXは、32に達しています。他の2つのインジケータから確認します。ADXは40まで増加し、まもなくACのシグナルが、表れました。RVIシグナル線がポジションを入力するためのすべての3つの条件が最終的に満たされている間、メインラインとクロスします。ADXはすでに45点に達しています。しかし、システムでADXの絶対値はそれほど重要ではありません。大切なことは、それが30を超えていることです。したがって、トレーダーは自分のルールに従い、0.01ロットで相場に入り、50ポイントで利益を取る、30ポイントで損失を停止します。

それでは、別の可能なシナリオをシミュレートしてみましょう。初めに、状況は最初の場合と同じです。ADX=32,シグナルはACから、ADXは40ポイントに達します。ポジションを開くために欠けている最後のシグナルはRVIです。45の代わりに55に追加します。オプションを比較することにより、第2のシグナルは以前のものよりも強力であることを示しているが、トレーダーはまだ同じロットでポジションとテイクプロフィットとストップロスを開きます。

ここでは、戦略の最初の欠点にぶつかります。入力シグナルの唯一の存在は、品質に多くの注意を払うことなく、評価されます。カテゴリを定義するために管理している場合でも、評価の精度は遷移領域に失われます。

よってADX、RSIインジケーターと特定のケースを承認し、相場参入のために使用したポジションにそのパラメータをバインドすることができるでしょうか?この目的のため、以下のステップを実行する必要があります。

  • トレンドの強さ(ADX)と相対活力指数(RVI)を評価する明確なカテゴリを確立します。追加の決定に基づいて、入力シグナルになります。
  • ポジションの目標の明確なカテゴリを確立するため(ここではロットサイズを設定することができます)。トレンドの強さが与えられた相場での自分のポジションを修正する出力シグナルです。
  • ファジィ集合論のメンバーシップ関数と入力シグナルと出力シグナルの種類を説明します。
  • 初期の戦略のポジションを変更するための推奨事項を表示するインタフェースを作成します。
  • 必要なときに、この推薦システムを修正することを可能にするメンバーシップ関数を変更するための柔軟な設定を作成します。

トレンドの強さの値 - で起動する最初の入力変数を記述します。

1。トレンドの強さの4つのカテゴリを設定します。low, moderate, mediumhigh外観です。

図 2。カテゴリに分けたビジュアルトレンドの強さ

2。出力シグナルの種類を設定するために、ADXカテゴリが影響を与える方法の決定に必要とされます。通常、トレンドが高いほど、長くそれが続きます。したがって、それに応じて進みます:ADXは、すべての3つの戦略のシグナルが受信された瞬間である場所に応じて、10から50で利益を取ります。

次のカテゴリは、戦略の最初の50ポイントに追加される利益目標値に入力されます。

  • low_take category: low trend, add 10 - 20 points to the goals.
  • mod_take category: moderate trend, add 20 - 30 points to the goals.
  • med_take category: medium trend, add 30 - 40 points to the goals.
  • high_take category: high trend, add 40 - 50 points to the goals.

3. 次の段階で、ファジィ集合論のメンバーシップ関数で以前設定された条件を説明します。4つのトレンドカテゴリの説明は次のとおりです。


図3。ファジーロジックの4トレンドカテゴリの説明

同図に示すように低いトレンドと2つの台形を持つ高いトレンド、および2つの三角形を持つ中程度および中カテゴリー:3は、以下のような、メンバーシップ関数によって設定されました。

それでは、 RVIに同じ定義してみましょう。

1。相対的な活力指数のカテゴリを設定してみましょう。4つあります:low, medium, high, higher.。外観です。

図4。カテゴリ別に相対活力指数のビジュアル

2。メンバーシップ関数を導入したカテゴリを説明します。台形を記述するために使用します。low higher カテゴリを、三角関数として適用します。medium high カテゴリ。


図5。RVI指数カテゴリの説明

同様に、4つのカテゴリについて説明します利益目標:第1および第4のカテゴリー(10月20日と40〜50点)台形を使用して、残りの2つのもの(20-30と30-40)を指します。入力シグナルは次のようになります。


図6。利益目標の値のカテゴリの説明

 

パネルのインタフェースの実装は、ポジションを変更する推奨事項を表示します

情報パネルを構築する場合、、4つのパラメータを選択します。

  • ADX値。条件を指定した場合にのみ、30以上を満足する - 。
  • RSI値。-0.1以下で(買いシグナル) 0.1で(売りシグナル)を条件とします。
  • 50の当初の目標に加えなければならないポイントの推奨数。
  • (アカウントに増やす方法の初期価格を取る)トレーディング商品価格の形式で利益値をとります。

以下のように完全な実装で取引戦略の一般的な外観を見ていきます。(図6)

図 7。完全な実装、一般的な外観、および取引戦略の設定

今度は、MQL4ツールと FuzzyNet library.を使用して、パネルの実装に進みましょう。

MQL4のツールで、このパネルのキーの論理ブロックを分析します。

//+------------------------------------------------------------------+
//| FuzzyNet Panel                                                   |
//+------------------------------------------------------------------+
#property copyright "Alexander Fedosov"
#property version "1.0"
#property strict
#property link "https://www.mql5.com/ru/users/alex2356/"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Green
//+------------------------------------------------------------------+
//||ライブラリーの接続
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\MamdaniFuzzySystem.mqh>

最初のプロパティを定義し、ファジーロジックで動作するライブラリを接続します。チャートウィンドウでパネルを見つけるため、オプションを設定します。分析バーの矢印表示の一つのインジケーターバッファとその色(緑)を定義します。

//---入力パラメータ
input string  p1="==== Parameters ====";
input int fontSize=15;
input int adx_period=10;
input int rvi_period=10;
input int num_bar=0;
input int Screen_corner=4;
input color label_clr=Red;
input color textColor=Black;

入力パラメータの最初のブロックになります。次の要素が含まれます。

  • fontSize - テキスト情報( 推奨範囲8- 15)のフォントサイズ。
  • adx_period - ADXインジケータの期間。
  • num_bar - システムが計算される数。
  • Screen_corner- パネルを表示するための角度。
  • label_clr - ヘッダーテキストの色。
  • textColor - 値のテキストの色。

入力の第二のブロックファジーロジックパラメータ(ADXトレンドの強さ、RVI指数)と出力パラメータ(利益目標ポイントの推奨値)の両方を記述したすべてのメンバーシップ関数の設定の大部分が含まれています。

input string  p2="==== Fuzzy Logic Parameters ====";
//--- ADX
input double in_term1a = 20;
input double in_term1b = 30;
input double in_term1c = 40;
input double in_term1d = 45;
input double in_term2a = 40;
input double in_term2b = 50;
input double in_term2c = 60;
input double in_term3a = 50;
input double in_term3b = 60;
input double in_term3c = 70;
input double in_term4a = 60;
input double in_term4b = 70;
input double in_term4c = 100;
input double in_term4d = 120;
//--- RVI
input double in_term1a1 = -0.25;
input double in_term1b1 = 0.1;
input double in_term1c1 = 0.15;
input double in_term1d1 = 0.25;
input double in_term2a1 = 0.15;
input double in_term2b1 = 0.25;
input double in_term2c1 = 0.35;
input double in_term3a1 = 0.25;
input double in_term3b1 = 0.35;
input double in_term3c1 = 0.45;
input double in_term4a1 = 0.4;
input double in_term4b1 = 0.45;
input double in_term4c1 = 1;
input double in_term4d1 = 1.2;
//--- Output
input double out_term1a = 5;
input double out_term1b = 10;
input double out_term1c = 15;
input double out_term1d = 22.5;
input double out_term2a = 17.5;
input double out_term2b = 25;
input double out_term2c = 32.5;
input double out_term3a = 27.5;
input double out_term3b = 35;
input double out_term3c = 42.5;
input double out_term4a = 37.5;
input double out_term4b = 45;
input double out_term4c = 50;
input double out_term4d = 60;
input double min_tp = 10;
input double max_tp = 50;


次のブロックで、変数、見出しの名称、情報パネルの実際のテンプレート(サイズ、ポジション、フォント、およびその他)を宣言します。

int scaleX=55,scaleY=25,offsetX=35;
//---インディケーター名を持つ配列を宣言
string signalName[]={"ADX_val:","RVI_val:","TP_plus:","TP_prc:"};
double adx,adx_di_minus,adx_di_plus,rvi,rvi_sig,mdm;
double Buffer[];
//+------------------------------------------------------------------+
//|カスタムインジケータ初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
   if(fontSize>15 || fontSize<8)
     {
      Print("ERROR: Incorrect fontSize. Must be 8-15.");
      Alert("ERROR: Incorrect fontSize. Must be 8-15.");
      return(0);
     }
   if(Screen_corner>4 || Screen_corner<1)
     {
      Print("ERROR: Incorrect Screen_corner. 1-4でなければなりません」)。
      Alert("ERROR: Incorrect Screen_corner. 1-4でなければなりません」)。
      return(0);
     }
//---
   SetIndexStyle(0,DRAW_ARROW,EMPTY,1);
   SetIndexArrow(0,234);
   SetIndexBuffer(0,Buffer);
   ArrayInitialize(Buffer,0.0);
//---
   for(int y=0;y<4;y++)
     {
      ObjectCreate("lb_ind_nm"+string(y),OBJ_LABEL,0,0,0,0,0);
      //---アンカーコーナーの変更    
      ObjectSet("lb_ind_nm"+string(y),OBJPROP_SELECTABLE,false);
      ObjectSet("lb_ind_nm"+string(y),OBJPROP_CORNER,Screen_corner);
      ObjectSet("lb_ind_nm"+string(y),OBJPROP_XDISTANCE,offsetX-30);
      ObjectSet("lb_ind_nm"+string(y),OBJPROP_YDISTANCE,y*scaleY+20);
      ObjectSetText("lb_ind_nm"+string(y),signalName[y],fontSize,"Tahoma",label_clr);
     }
//---
   for(int y=0;y<4;y++)
     {
      ObjectCreate("lb_ind0"+string(y),OBJ_LABEL,0,0,0,0,0);
      //---アンカーコーナーの変更
      ObjectSet("lb_ind0"+string(y),OBJPROP_SELECTABLE,false);
      ObjectSet("lb_ind0"+string(y),OBJPROP_CORNER,Screen_corner);
      ObjectSet("lb_ind0"+string(y),OBJPROP_XDISTANCE,scaleX+offsetX);
      ObjectSet("lb_ind0"+string(y),OBJPROP_YDISTANCE,y*scaleY+20);
      ObjectSetText("lb_ind0"+string(y),"",fontSize,"Tahoma",textColor);
     }
   return(INIT_SUCCEEDED);
  }


それでは、ADXとRVIインジケータからのシグナルを処理するメインブロックを見てみましょう。

条件は、インジケータ値がシグナルを満たしたときです。それらが一致した場合、mamdani(double t, double v)関数で処理し、パネルに表示されます。すべてこれは次の形式です。現在のインジケーター値は、シグナル、 (ポイント単位と数値)推奨利益を受信します。

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   Buffer[num_bar]=High[num_bar]+20*_Point;
   adx=NormalizeDouble(iADX(_Symbol,PERIOD_CURRENT,adx_period,PRICE_CLOSE,MODE_MAIN,num_bar),_Digits);
   adx_di_plus=NormalizeDouble(iADX(_Symbol,PERIOD_CURRENT,adx_period,PRICE_CLOSE,MODE_PLUSDI,num_bar),_Digits);
   adx_di_minus=NormalizeDouble(iADX(_Symbol,PERIOD_CURRENT,adx_period,PRICE_CLOSE,MODE_MINUSDI,num_bar),_Digits);
//---
   rvi=NormalizeDouble(iRVI(_Symbol,PERIOD_CURRENT,rvi_period,MODE_MAIN,num_bar),_Digits);
   rvi_sig=NormalizeDouble(iRVI(_Symbol,PERIOD_CURRENT,rvi_period,MODE_SIGNAL,num_bar),_Digits);
//---   
   if(adx>30 && adx_di_plus>adx_di_minus && rvi>rvi_sig && rvi<-0.1)
     {
      mdm=MathCeil(mamdani(adx,MathAbs(rvi)));
      ObjectSetText("lb_ind00","buy_signal: "+DoubleToString(adx,_Digits),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind01","buy_signal: "+DoubleToString(rvi,_Digits),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind02",DoubleToString(mdm,0),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind03",DoubleToString(tp_prc(mdm),_Digits),fontSize,"Tahoma",textColor);
     }
   else if(adx>30 && adx_di_plus<adx_di_minus && rvi<rvi_sig && rvi>0.1)
     {
      mdm=MathCeil(mamdani(adx,rvi));
      ObjectSetText("lb_ind00","sell_signal: "+DoubleToString(adx,_Digits),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind01","sell_signal: "+DoubleToString(rvi,_Digits),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind02",DoubleToString(mdm,0),fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind03",DoubleToString(tp_prc(mdm),_Digits),fontSize,"Tahoma",textColor);
     }
   else
     {
      ObjectSetText("lb_ind00","no_signal",fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind01","no_signal",fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind02"," - ",fontSize,"Tahoma",textColor);
      ObjectSetText("lb_ind03"," - ",fontSize,"Tahoma",textColor);
     }
   return(rates_total);
  }


この関数は、ファジーロジックシステムを作成します。これは、インジケーターからの2つの入力シグナルが含まれています - トレンド活力(それぞれは、メンバーシップ関数によって記述される4つの項からなる)と、1つの出力シグナル。入力シグナルと出力シグナルの4つのルールは、システムに含まれています。

//+------------------------------------------------------------------+
//|ファジーロジックに基づいてシステムを算出する関数|
//+------------------------------------------------------------------+
double mamdani(double t,double v)
  {
   double res=0;
//---マムダニファジィシステム  
   MamdaniFuzzySystem *fsSignal=new MamdaniFuzzySystem();
//---システムの入力変数を作成。
   FuzzyVariable *fsTrend=new FuzzyVariable("trend",30.0,100.0);
   FuzzyVariable *fsVigor=new FuzzyVariable("vigor",0.1,1.0);
//--- ADX
   fsTrend.Terms().Add(new FuzzyTerm("low", new TrapezoidMembershipFunction(in_term1a, in_term1b, in_term1c, in_term1d)));
   fsTrend.Terms().Add(new FuzzyTerm("moderate", new TriangularMembershipFunction(in_term2a, in_term2b, in_term2c)));
   fsTrend.Terms().Add(new FuzzyTerm("medium", new TriangularMembershipFunction(in_term3a, in_term3b, in_term3c)));
   fsTrend.Terms().Add(new FuzzyTerm("high",new TrapezoidMembershipFunction(in_term4a, in_term4b, in_term4c, in_term4d)));
   fsSignal.Input().Add(fsTrend);
//--- RVI
   fsVigor.Terms().Add(new FuzzyTerm("low", new TrapezoidMembershipFunction(in_term1a1, in_term1b1, in_term1c1, in_term1d1)));
   fsVigor.Terms().Add(new FuzzyTerm("medium", new TriangularMembershipFunction(in_term2a1, in_term2b1, in_term2c1)));
   fsVigor.Terms().Add(new FuzzyTerm("high", new TriangularMembershipFunction(in_term3a1, in_term3b1, in_term3c1)));
   fsVigor.Terms().Add(new FuzzyTerm("higher",new TrapezoidMembershipFunction(in_term4a1, in_term4b1, in_term4c1, in_term4d1)));
   fsSignal.Input().Add(fsVigor);
//---出力を作成。
   FuzzyVariable *fvSignal=new FuzzyVariable("signal",min_tp,max_tp);
   fvSignal.Terms().Add(new FuzzyTerm("low_take", new TrapezoidMembershipFunction(out_term1a, out_term1b, out_term1c, out_term1d)));
   fvSignal.Terms().Add(new FuzzyTerm("mod_take", new TriangularMembershipFunction(out_term2a, out_term2b, out_term2c)));
   fvSignal.Terms().Add(new FuzzyTerm("med_take", new TriangularMembershipFunction(out_term3a, out_term3b, out_term3c)));
   fvSignal.Terms().Add(new FuzzyTerm("high_take", new TrapezoidMembershipFunction(out_term4a, out_term4b, out_term4c, out_term4d)));
   fsSignal.Output().Add(fvSignal);
//---4つのマムダニファジィルールを作成。
   MamdaniFuzzyRule *rule1 = fsSignal.ParseRule((トレンドが低い)と(活力は低い)が低い場合は、シグナルはlow_take)。
   MamdaniFuzzyRule *rule2 = fsSignal.ParseRule((トレンドが緩やかである)、および(活力が中程度である」場合、シグナルはmod_take))。
   MamdaniFuzzyRule *rule3 = fsSignal.ParseRule((トレンドが中程度)および(活力)が高い場合、シグナルがmed_take)。
   MamdaniFuzzyRule *rule4 = fsSignal.ParseRule((トレンドが高く)と(活力が高い)場合、シグナルはhigh_take)。
//---システム内の4マムダニファジィルールを追加。
   fsSignal.Rules().Add(rule1);
   fsSignal.Rules().Add(rule2);
   fsSignal.Rules().Add(rule3);
   fsSignal.Rules().Add(rule4);
//---設定入力値
   CList *in=new CList;
   Dictionary_Obj_Double *p_od_adx=new Dictionary_Obj_Double;
   Dictionary_Obj_Double *p_od_rvi=new Dictionary_Obj_Double;
   p_od_adx.SetAll(fsTrend,t);
   p_od_rvi.SetAll(fsVigor,v);
   in.Add(p_od_adx);
   in.Add(p_od_rvi);
//---取得結果
   CList *result;
   Dictionary_Obj_Double *p_od_out;
   result=fsSignal.Calculate(in);
   p_od_out=result.GetNodeAtIndex(0);
   res=NormalizeDouble(p_od_out.Value(),_Digits);
//---
   delete in;
   delete result;
   delete fsSignal;
   return res;
  }


それでは、最後のブロック「その他の機能」に進みましょう。tp_prc(double take)は、現在の通貨の価格の数値ポイントで利益値を変換します。現在の通貨のサインの数を定義します。

//+------------------------------------------------------------------+
//|利益目標を決定するための関数|
//+------------------------------------------------------------------+
double tp_prc(double take)
  {
   int tip;
   double opr,tp;
   take+=50;
   adx_di_plus=NormalizeDouble(iADX(_Symbol,PERIOD_CURRENT,adx_period,PRICE_CLOSE,MODE_PLUSDI,num_bar),_Digits);
   adx_di_minus=NormalizeDouble(iADX(_Symbol,PERIOD_CURRENT,adx_period,PRICE_CLOSE,MODE_MINUSDI,num_bar),_Digits);
//---
   if(adx_di_plus>adx_di_minus)
      tip=0;
   else if(adx_di_plus<adx_di_minus)
      tip=1;
//---
   switch(tip)
     {
      case 0:
         opr=Ask;
         break;
      case 1:
         opr=Bid;
         break;
     }
   if(MathMod(tip,2.0)==0.0)
     {
      tp=opr+take*Dig()*_Point;
     }
   else
     {
      tp=opr-take*Dig()*_Point;
     }
   return(tp);
  }
//+------------------------------------------------------------------+
//|小数点以下の量を返す関数|
//+------------------------------------------------------------------+
int Dig()
  {
   return((_Digits==5 || _Digits==3 || _Digits==1)?10:1);
  }
//+------------------------------------------------------------------+

セクションファジーロジックパラメータのパラメータ正しさの再検証に焦点をあてていきます。最初のグラフィック表現に依拠することをお勧めします。不正な値は、エラーやシステム全体の誤動作は、図3、5、6につながる可能性があります。お気をつけください!

 

結論

結論として、要約します。

  • ファジーロジックとマニュアル取引戦略を作成する最初の部分は、厳密なルールの開発にあります。これは、ステージNo1-ステージ3で検査しました。
  • 任意の推定ブロックまたはパラメータの厳密な分類が適用される形式化の欠点を見つけることが必要です。例では、十分な柔軟性がなく、相場参入の瞬間を決定することができない戦略の一部が見つかりました。
  • さらに、ファジィ集合論を使用して、明確すぎる区分がより柔軟になります。さて、境界値に以前のようにするだけではなく、異なる両方が同時に存在します。
  • この戦略は、インジケータパネルやアラートの形で実装されています。この記事では、MQL4言語のパネルを選択しました。
ファジィ集合論を適用することにより、裁量取引の戦略を改善できます。既に形成された取引戦略を変更し、ファジーロジックを適用して、発見される欠陥を取り除くことによって、補完される方法について明らかにしました。

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

添付されたファイル |
fuzzy_panel.mq4 (23.67 KB)
クロスプラットフォームEA:序章 クロスプラットフォームEA:序章
この記事では、クロスプラットフォームのEAを容易に開発できるメソッドを詳述します。提案メソッドは、両方のバージョンによって共有関数を統合し、互換性のない関数の派生クラスを分割します。
MQL5とQLUAの比較ーなぜMQL5での取引操作は28倍速いのか? MQL5とQLUAの比較ーなぜMQL5での取引操作は28倍速いのか?
多くのトレーダーは、どれくらいの速さで自分の注文が取引所に到達し、どれくらいの時間で実行されるのか、そしていつトレーダーの取引ターミナルに取引操作の結果が反映されるのかということについてよく考えるものだと思います。今まで誰もMQL5とQLUAのプログラムを使用した取引操作速度の比較測定を行っていないので、この比較を行いたいと思います。
クロスプラットフォームEA:MQL5標準ライブラリからコンポーネントの再利用 クロスプラットフォームEA:MQL5標準ライブラリからコンポーネントの再利用
クロスプラットフォームEAはMQL4に有用であり、MQL5標準ライブラリ内に一部コンポーネントが存在します。 この記事では、MQL4コンパイラと互換性のあるMQL5標準ライブラリの特定コンポーネントを作るメソッドを取り扱います。
トレーディングロボットのためのFalseトリガー保護 トレーディングロボットのためのFalseトリガー保護
取引システムの収益は、ロジックのアルゴリズムの品質にだけでなく、ロジックや金融商品のダイナミクスの解析の精度により、決定されます。Falseトリガーは、取引ロボットのメイン・ロジックを低品質なものにします。指定された問題を解決する方法は、この記事で考慮されています。