記事"メタトレーダー5クライアントターミナルにおける適応型トレーディングシステムとその使用"についてのディスカッション - ページ 3

 
Quantum:

親愛なるFXの存在

>>親愛なる

あなたはあなたの質問に答えました:)

>> そうですね、部分的には私自身が私の質問に答えたかもしれません。

おっしゃるとおり、取引条件を変更したい場合、2つの方法があります。1つは、ストラテジーCStrategyMAに新しい条件を追加する方法(ただし、初期とは異なる新しいストラテジーを取得することになります)、もう1つは、新しいクラス(たとえば、CStrategyMA34)を作成し、そこに追加の売買条件を追加する方法です。

もちろん、新しいストラテジーのファイルをインクルードし、CAdaptiveStrategy クラスの Expert_OnInit 関数に新しいストラテジーを追加する必要があります:

2つ目の方法の方が、多くのストラテジーやそのバリエーションを追加することができます。

CStrategyMA クラスのインスタンスを削除する必要はありません(もしあれば)。

m_all_strategiesに含まれるストラテジーのリストから最適なストラテジーを決定するために、マーケットが役立ちます。

>> 私が想像していたとおりのポイントを得た。

しかし、問題はもう一つある。最適化を行うために、EAを "入力化 "しようとしています。

つまり、例としては次のようなコードの断片を意味している:

for(int i=0; i<RSIcicle; i++)
     {
      CStrategyRSI *t_StrategyRSI;
      t_StrategyRSI=new CStrategyRSI;
      if(t_StrategyRSI==NULL)
        {
         delete m_all_strategies;
         Print("Error of creation of object of the CStrategyRSI type");
         return(-1);
        }

      

       ////////////////////////// PLEASE LOOK AT THIS FOLLOWING PIECE OF CODE ///////////////////////
   //各戦略に期間を設定する
    int period=Trsi+Drsi*i;
    
    ENUM_TIMEFRAMES RSItempoframe=RSItempoframe_in; // SET TIMEFRAME (enum), INPUT, FOR STRATEGY 
    ENUM_APPLIED_PRICE RSIappprice=RSIappprice_in;  // SET APPPLIED PRICE (enum), INPUT, FOR STRATEGY
    
    int RSIvarA_root=RSIvarA_in;
    int RSIvarB_root=RSIvarB_in;
    
      // 戦略の初期化
      t_StrategyRSI.Initialization(period,true,RSItempoframe,RSIappprice,RSIvarA_root,RSIvarB_root);
      /////////////////////////////////////////////////////////////////////////////////////////////


      // 戦略の詳細を設定する
      t_StrategyRSI.SetStrategyInfo(_Symbol,"[RSI_"+IntegerToString(period)+"]",period,"Relative Strenght Index "+IntegerToString(period));
      
      if(t_StrategyRSISet_Stops_ ==true) {
      t_StrategyRSI.Set_Stops(tSMSSone,tSMSStwo); //3500,1000);
      }

where (declaration) :

//+------------------------------------------------------------------+
//|                                            CAdaptiveStrategy.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"

#include <Arrays\ArrayObj.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <CStrategyMA.mqh>
#include <CStrategyMAinv.mqh>
#include <CStrategyStoch.mqh>

#include <CStrategyRSI.mqh>   // 戦略を追加

/*
......
*/

input int Trsi=0, Drsi=10, RSIcicle=10;

input ENUM_TIMEFRAMES RSItempoframe_in= PERIOD_CURRENT;
input ENUM_APPLIED_PRICE RSIappprice_in= PRICE_CLOSE;

input int RSIvarA_in=60, RSIvarB_in=40;




input int tSMSSone=3500, tSMSStwo=1000;


input bool t_StrategyRSISet_Stops_=false;

/*
...
*/

//+------------------------------------------------------------------+
//| Class CAdaptiveStrategy                                          |

/*
...
*/

そして変数:

RSItempoframe, RSIappprice, RSIvarA_root, RSIvarB_root

との共同作業です。

//+------------------------------------------------------------------+
//|                                                  CStrategyMA.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#include <CSampleStrategy.mqh>

input int mval=0, mval1=1, mval2=2, mval3=3, mval4=4, mvalVar=0, mvalFix=0,

          mvalVar2=0, mvalFix2=0;
          

//+------------------------------------------------------------------+
//| Class CStrategyMA for implementation of virtual trading          |
//| by the moving average strategy                                   |
//+------------------------------------------------------------------+
class CStrategyRSI : public CSampleStrategy
  {
protected:
   int               m_handle;     // 移動平均(iMA)インディケータのハンドル
   int               m_period;     // 移動平均の期間
   double            m_values[];   // インジケーターの値を格納する配列





   int               RSIvarA, RSIvarB; 
   
   ENUM_TIMEFRAMES   m_timeframe;
   ENUM_APPLIED_PRICE m_appprice;



   
public:
   // ストラテジーの初期化


   int               Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
                                    ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root);


   // ストラテジーの初期化解除
   int               Deinitialization();
   // 取引条件の確認と仮想ポジションのオープン
   bool              CheckTradeConditions();
  };
//+------------------------------------------------------------------+
//| Method of initialization of the strategy                         |
//+------------------------------------------------------------------+



int CStrategyRSI::Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
                                 ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root)


  {
   //set period for the RSI     (was //set period for the moving average)
   m_period=period;
      
   m_timeframe=RSItempoframe;
   m_appprice=RSIappprice;
   
   RSIvarA=RSIvarA_root;
   RSIvarB=RSIvarB_root;

/*
...
*/

//インジケーターのハンドルを作成 
   
   m_handle=iRSI(_Symbol,m_timeframe,m_period,m_appprice);

/*
...
*/

//+------------------------------------------------------------------+
//| checking the trade conditions and opening the virtual positions  |
//+------------------------------------------------------------------+
bool CStrategyRSI::CheckTradeConditions()
  {
   RecalcPositionProperties(m_position);
  // double p_close;

/*
...
*/
   
     if(CopyRates(_Symbol,m_timeframe,0,3,m_rates)<0)

{
      Alert("Error of copying history data - error:",GetLastError(),"!!");
      return(false);
     }
// 前のバーの現在の終値をコピーする (これはバー 1)
  // p_close=m_rates[1].close;  // close price of the previous bar          

   if(CopyBuffer(m_handle,0,0,3,m_values)<0)
     {
      Alert("Error of copying buffers of the Moving Average indicator - error number:",GetLastError());
      return(false);
     }

/*
...
*/

// 買い条件1:RSIが上昇
   bool buy_condition_1=(m_values[mval]>m_values[mval1]) && (m_values[mval1]>m_values[mval2]);  // NOTICE 整数変数を配列の [] に入れる

// 買い条件2:前日終値がMAより高い
 //  bool buy_condition_2=(p_close>m_values[1]);


     bool buy_condition_2=(m_values[mval+mvalVar+mvalFix]>RSIvarA);

/*
... etc..
*/


   

質問です:

ストラテジークラスファイル(インクルードファイルすなわちCStrategyRSI.mqh)レベルで入力変数を持つために、あるいは、他のクラス/インクルードレベル(CAdaptiveStrategy.mqh)で適切なハイエアーキー/コネクション/ツリーを持つために、コードを修正するのは好都合でしょうか?

言い換えれば、最適化テストのためにいくつかの入力パラメータを追加して、EAのアイデアのコアシステムに影響を与えるために、

次のようにすべきです: (CAdaptiveStrategy.mqhの入力変数)

/*
...
*/

class CStrategyRSI : public CSampleStrategy
  {
protected:
   int               m_handle;     // handle of the Moving Average (iMA) indicator
   int               m_period;     // period of the Moving Average indicator
   double            m_values[];   // array for storing the value of indicator
   int               RSIvarA, RSIvarB;
   
   ENUM_TIMEFRAMES   m_timeframe;
   ENUM_APPLIED_PRICE m_appprice;
   
public:
   // initialization of strategy
   int               Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
                                    ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root);

/*
...
*/ 

//set period for the RSI     (was //set period for the moving average)
   m_period=period;
      
   m_timeframe=RSItempoframe;
   m_appprice=RSIappprice;
   
   RSIvarA=RSIvarA_root;
   RSIvarB=RSIvarB_root;

/*
...
*/

//インジケーターのハンドルを作成 
   
   m_handle=iRSI(_Symbol,m_timeframe,m_period,m_appprice);

/*
...
*/
 

(CSampleRSI.mqhの入力変数)。

/*
...
*/

input   int               RSIvarA_root, RSIvarB_root;
   
input  ENUM_TIMEFRAMES  RSItempoframe=PERIOD_M5;
input   ENUM_APPLIED_PRICE RSIappprice=PRICE_CLOSE;
   

class CStrategyRSI : public CSampleStrategy
  {
protected:
   int               m_handle;     // 移動平均(iMA)インディケータのハンドル
   int               m_period;     // 移動平均の期間
   double            m_values[];   // インジケーターの値を格納する配列

  ENUM_TIMEFRAMES   m_timeframe;
  ENUM_APPLIED_PRICE m_appprice;

int               RSIvarA, RSIvarB;

public:
   // 戦略の初期化
   int               Initialization(int period,bool virtual_trade_flag);  // 元のコードに注目

/*
...
*/ 

//set period for the RSI     (was //set period for the moving average)
   m_period=period;
      
   m_timeframe=RSItempoframe;
   m_appprice=RSIappprice;
   
   RSIvarA=RSIvarA_root;
   RSIvarB=RSIvarB_root;

/*
...
*/

//インジケーターのハンドルを作成 
   
   m_handle=iRSI(_Symbol,m_timeframe,m_period,m_appprice);

/*
...
*/

言い換えると、入力変数は、ストラテジー・インクルード・ファイルの中で、クラス宣言の前に使用されるべきです。

それとも、入力変数はCAdaptiveストラテジーの "for "サイクルに由来し、すべてのクラスの初期化と入力パラメータを考慮する必要がありますか?(私はこの最初の例(上記のこのコードのすぐ上)を意味します) :)

public:
// ストラテジーの初期化
int Initialization(int period,bool virtual_trade_flag,ENUM_TIMEFRAMES RSItempoframe,
ENUM_APPLIED_PRICE RSIappprice,int RSIvarA_root, int RSIvarB_root);

CStrategyRSI.mqhファイルで入力変数を使用する場合、システムのコアにどのように異なる影響を与えるか。 または CAdaptiveStrategy.mqhで入力変数を使用した場合、システムのコアにどのような違いがあるのでしょうか?

テストだけであれば、CStrategyRSI.mqhで入力変数を使用できると思います。

EAのコアシステム(アダプティブシステムとトレードシミュレータ、バーチャルトレーダーインクルード)に影響を与えるのであれば、ストラテジーインクルードではなく

入力変数をストラテジーインクルードではなく、アダプティブインクルードファイルで宣言する必要があります。

呼び出す 必要があるのでしょうか?

そうだろ?

私の言いたいことが伝わったでしょうか?

Tnkx

 
forexistence:

....しかし、今問題になっているのは、別のことだ....最適化オプションを使うために、EAを "インプット "しようとしているのですが......。

もしストラテジーテスターの 最適化オプションを使って最適なストラテジーのパラメーターを見つけたいのであれば、EAを特定のストラテジーで書き換えて、それを使ってプレイするのがよいでしょう。

アダプティブEAのコンセプトや構造上、ストラテジーテスターで直接パラメーターを最適化することはできません。

適応型EAを取引に使用したり、Strategy Testerでテストしたりする場合、私たちは異なるストラテジーからのシグナルの集合として取引システムを持つことになります。言い換えれば、テスターは作成した仮想サンドボックスにアクセスできず、それらについて何も知らないということです。

使用する取引戦略のパラメータを設定するために入力パラメータを使用したい場合は、ファイルを使用する方が良いでしょう。

 
Quantum:

ストラテジーテスターの最適化オプションを使用して、ストラテジーの最適なパラメーターを見つけたいのであれば、特定のストラテジーでEAを書き換えて、それを使ってプレイするのがよいでしょう。

>> わかりました。それは簡単なことではないでしょう。

アダプティブEAのコンセプトとその構造上、Strategy Testerで直接パラメータを最適化することはできません。

>> はい。EAは最適化されたストラテジーのパラメータで 動作するように理想化されています。私が理解したのは、マーケットがどのように/どのように反応するか(別の観点ではその逆も...)を基準として、異なるストラテジーを利用するということです。

アダプティブEAを取引に使用したり、ストラテジーテスターでテストしたりする場合、私たちは異なるストラテジーからのシグナルのセットとして取引システムを持つことになります。言い換えれば、テスターは私たちが作成した仮想サンドボックスにアクセスできず、それらについて何も知らないということです。

>> このコンセプトは理解できましたが、完全ではありませんでした。

仮想サンドボックスとテスターを対話させることに意味がないことは理解しています。

私の唯一の目的は、アドオンで使用するためにEAを修正することでした。このEAを使用する目的は、別のEAを書き換えたり、すべてのストラテジーを書き換えたり、各ストラテジーを個別にテストしたりすることなく、パラメーターを最適化することです。私のアイデアは、同じEA内でパラメーターを最適化する可能性を「快適」にするためだけでしたが、この最適化はバーチャルトレード/アダプティブシステムで動作するようには意図されていません。ただ、同じEA入力ウィンドウを使って、ストラテジーのパラメーターを最適化する可能性があればいいのであって、ストラテジーごとに別のEAを書いて、最適化されたパラメーターを取得し、それを固定値としてアダプティブ・ストラテジー・システムに入れる必要はないのです。お分かりいただけただろうか。

もし使用するストラテジーのパラメーターを設定するために入力パラメーターを使用したいのであれば、ファイルを使用する方が良いでしょう。

>> どのファイルのことをおっしゃっているのでしょうか?

CStrategyXXX.mqhを使うということですか、それとも各戦略ごとに別のEAを書いて最適化し、CStrategyXXX.mqhに固定値としてパラメータをコピーするということですか?

 

Are you talking about to use CStrategyXXX.mqh or the fact to write another individual EA for each strategy, optimize it, and copy the parameters as fixed values in CStrategyXXX.mqh?

つまり、ストラテジーコンテナはアダプティブ EA のいくつかの設定に従って埋められます。

例えば、Adaptive_Expert.Expert_OnInit() では、アダプティブ EA の設定ファイルをロードします:

MA;3
MA;15
MA;25
Stoch;3;12;20
Stoch;3;15;30

Strategy1;Param1;Param2;
Strategy2;Param1;Param2;

各行を解析することで、必要なストラテジーを認識し、対応するパラメーターを指定して追加する。これはコンパイルなしで適応型EAを設定する方法の1つです。シンプルにするために、この記事では考慮していない。

私は、テスターと仮想サンドボックスをやり取りする意味がないことを理解しています。

私の唯一の目的は、アドオンで使用するためにEAを修正することでした:このEAをパラメータの最適化にも使用することで、別のEAを書き換えたり、すべてのストラテジーを書き換えたり、各ストラテジーを個別にテストしたりする必要はありません。私のアイデアは、同じEA内でパラメーターを最適化する可能性を「快適」にするためだけでしたが、この最適化はバーチャルトレード/アダプティブシステムで動作するようには意図されていません。ただ、同じEA入力ウィンドウを使って、ストラテジーのパラメーターを最適化する可能性があればいいのであって、ストラテジーごとに別のEAを書いて、最適化されたパラメーターを取得し、それを固定値としてアダプティブ・ストラテジー・システムに入れる必要はないのです。お分かりいただけたでしょうか?

サンドボックスを見る方法はあります。それはストラテジーテスターを使って間接的に行うことができる。

記事の図2の結果を再現したいとしよう。

アダプティブ EAadaptive-systems-mql5-sources-debug-ja.zip のデバッグ版が必要である(これはサンドボックスを報告する)。次に、コンパイルしてストラテジーテスターで Adaptive_Expert_Sample を開き、EURUSD H1 2010.01.01 ~ 2010.08.20 を選択してテストを開始する。サンドボックスとアダプティブ・ストラテジーの結果は、testerfiles jaequity_res.txt に保存される。

仮想取引の株式/残高を分析することで、最適化を単純化することができます。

 

皆さん、こんにちは、

私は今、適応型EAに取り組んでいるところです。

しかし、この種のEAのどこにトレイリングストップ 機能を 含めるべきかわかりません。

そのような関数はCAdaptiveStrategy.mqh部分に追加できると思います。

どなたか教えていただけませんか?もしかしたら、すでにそのような機能を開発されているかもしれません。

よろしくお願いします!

よろしくお願いします、

パトリック

 
OOエキスパート・クラスをベースとしたエキスパートで動作するアダプティブ・トレーディングのバージョンをお持ちの方はいらっしゃいますか?
 
MQL5は私たちに大きなチャンスを与えてくれる。
 
素晴らしい記事をありがとうございます。私は適応型システムをどのように導入するか考えており、これは私が考案したアプローチの一つですが、まだ実行する時間がありません。ライブデータと組み合わせて、バックテスト 機能を使用することを検討しましたか?
 

記事の結果を再現できません

ソースファイルをダウンロードしてコンパイルし、同じタイムフレーム(EURUSD H1、2010/01/04 - 2010/08/20)で実行したところ、異なる結果が得られました。

デバッグ・ファイルを使用し、仮想取引出力をチェック しました。 ... 仮想株式グラフは同一ですが、実際の取引は一致しません。

実際のトレードのログファイルがないと、なぜ私のトレードが記事のものと一致しないのかを見つけるのは難しいです。

なぜ一致しないのでしょうか?

 
非常に良い記事だ。気が散るのは、提案された機能的な可能性を取り去ったり統合したりする代わりに、結果を再現しようとする人々から来る。今、完全に機能的で収益性の高い自動および半自動取引EAを作成する可能性が実現しました。インジケーターを広範囲にテストし、その結果をまとめ、インジケーターの統計データを抽出します。ファンダメンタル分析とテクニカル分析が MQL5言語の補助機能によってEAに組み合わされたことは今までありませんでした。将来的には、市場の変動を予測するために、あらゆる市場でEAが実現することになるでしょう。