多通貨エキスパートテスト結果

 

多通貨EAの構築に関する記事を読み、コミュニティの「門番」たちに質問し、回答を得ましたが、私にとっては、"テスト結果が正しくなるようにEAコードを構成するにはどうしたらよいか?"という疑問が残ります。この問いを見つけることだけが、このトピックの目的である。

コミュニティのメンバーから提案された3種類の方法を使ってテストしてみました。

-OnTick()

- このメソッドは、Konstantin Gruzdevの記事「Implementation of multi-currency mode in MetaTrader 5」で提案されています。

-OnTimer() です。

マルチカレンシーエキスパートアドバイザーの仕組みは、ニコライ・コシチン氏の記事「異なるシンボルで取引するエキスパートアドバイザーを 作る」で詳しく説明されているので、それを拝借しました。

テストは、テスト結果を比較することが本質なので、簡単なEAを書きました。参考」となるのは、2000年以降のEURUSD 日足チャート の結果です。そして、同じパラメータを使ったこの結果を、GBPUSD チャートから得られた結果と比較します。原則的にテストに関わる機器は1つですが、どの機器をテストしても結果は同じになるはずです。

OnTick()

int OnInit()
{
 return(0);
}

void OnDeinit()
{
}

void OnTick()
{  
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
   
 // Получение торговых сигналов
 TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);

 // Совершение торговых операций
 TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
}

EURUSDのチャートから EURUSDの テスト。

ラベル:01_tick

GBPUSDのチャートから EURUSDの テスト。

ラベル:02_tick

テスト結果が一定しない。

OnChartEvent()

enum ENUM_CHART_EVENT_SYMBOL
  {
   CHARTEVENT_NO        =0,          // События отключены
   CHARTEVENT_INIT      =0,          // Событие "инициализация" 
   
   CHARTEVENT_NEWBAR_M1 =0x00000001, // Событие "новый бар" на 1 -минутном графике
   CHARTEVENT_NEWBAR_M2 =0x00000002, // Событие "новый бар" на 2 -минутном графике
   CHARTEVENT_NEWBAR_M3 =0x00000004, // Событие "новый бар" на 3 -минутном графике
   CHARTEVENT_NEWBAR_M4 =0x00000008, // Событие "новый бар" на 4 -минутном графике
   
   CHARTEVENT_NEWBAR_M5 =0x00000010, // Событие "новый бар" на 5 -минутном графике
   CHARTEVENT_NEWBAR_M6 =0x00000020, // Событие "новый бар" на 6 -минутном графике
   CHARTEVENT_NEWBAR_M10=0x00000040, // Событие "новый бар" на 10-минутном графике
   CHARTEVENT_NEWBAR_M12=0x00000080, // Событие "новый бар" на 12-минутном графике
   
   CHARTEVENT_NEWBAR_M15=0x00000100, // Событие "новый бар" на 15-минутном графике
   CHARTEVENT_NEWBAR_M20=0x00000200, // Событие "новый бар" на 20-минутном графике
   CHARTEVENT_NEWBAR_M30=0x00000400, // Событие "новый бар" на 30-минутном графике
   CHARTEVENT_NEWBAR_H1 =0x00000800, // Событие "новый бар" на 1 -часовом графике
   
   CHARTEVENT_NEWBAR_H2 =0x00001000, // Событие "новый бар" на 2 -часовом графике
   CHARTEVENT_NEWBAR_H3 =0x00002000, // Событие "новый бар" на 3 -часовом графике
   CHARTEVENT_NEWBAR_H4 =0x00004000, // Событие "новый бар" на 4 -часовом графике
   CHARTEVENT_NEWBAR_H6 =0x00008000, // Событие "новый бар" на 6 -часовом графике
   
   CHARTEVENT_NEWBAR_H8 =0x00010000, // Событие "новый бар" на 8 -часовом графике
   CHARTEVENT_NEWBAR_H12=0x00020000, // Событие "новый бар" на 12-часовом графике
   CHARTEVENT_NEWBAR_D1 =0x00040000, // Событие "новый бар" на дневном графике
   CHARTEVENT_NEWBAR_W1 =0x00080000, // Событие "новый бар" на недельном графике
     
   CHARTEVENT_NEWBAR_MN1=0x00100000, // Событие "новый бар" на месячном графике   
   CHARTEVENT_TICK      =0x00200000, // Событие "новый тик"
   
   CHARTEVENT_ALL       =0xFFFFFFFF, // Все события включены
  };

...

int OnInit()
{
 if(iCustom("EURUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),0,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на EURUSD"); return(true);}
   
 if(iCustom("GBPUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),1,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на GBPUSD"); return(true);}
}

void OnDeinit()
{
}

void OnChartEvent(const int id,         // идентификатор события
                  const long&   lparam, // флаг события поступившего от агента панели.
                                        // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
{
 if(id >= CHARTEVENT_CUSTOM)      
   {
    // Объявление массивов переменных для торговых сигналов
    static datetime New_Bar[1];  
    static bool UpSignal[1], DnSignal[1];
      
    // Получение торговых сигналов
    TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);
   
    // Совершение торговых операций
    TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
   }
}

EURUSDのチャートから EURUSDで テスト。

ラベル:01_event ==01_tick

01_tickと 表記されている結果と同じになります。

GBPUSDのチャートから EURUSDで テスト。

ラベル:02_event ~=02_tick

テスト結果にばらつきがある。

OnTimer()

int OnInit()
{
 EventSetTimer(10);

 return(0);
}

void OnDeinit()
{
 EventKillTimer();
}

void OnTimer()
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
   
 // Получение торговых сигналов
 TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);

 // Совершение торговых операций
 TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
}

タイマーは10秒に設定されています。

EURUSDチャートから EURUSD インストゥルメントでテストします。

Label:01_time==01_tick&& 01_time==01_ event

GBPUSDのチャートから EURUSDの テスト。

Label:02_time==01_tick&& 02_time==01_ event

テスト結果は同じです。一か所だけ、小さな不正確さが見受けられました。また、タイマーの間隔を小さくすればするほど、より正確な結果が得られることにも気づきました。つまり、日足でテストを行い、テスターの間隔を例えば1時間に設定しても、テストは10秒よりかなり速く実行されるが、テスト結果は一致しない。

------

以上です。みんなの意見に興味津々、解決方法にもさらに興味津々)))


 

私の考えでは、これらの選択肢を別々に比較するのは正しくありません。

私自身は、アニメのタイマーは必ずそうでなければならないという意見を堅持しており、そこに何を加えるか(ティックかイベントか)は別問題だと考えています。

私の考えでは、利用可能なハンドラはすべて使用すべきであり、問題はその充填と一般的なアルゴリズムの実装にあると思います。

 
tol64:

"検査結果が正しくなるように、検査者コードをどうまとめるか?"ということです。

当初、質問文が理解できなかった。正しい」検査結果とは、どのようなもので、なぜそれを実現する必要があるのでしょうか。
 
Interesting:

私の考えでは、これらの選択肢を別々に比較するのは正しくありません。

個人的には、アニメの中のタイマーは必ず存在するもので、そこに何を付加するか(ティックかイベントか)は別問題だと考えています。

つまり、利用可能なハンドラはすべてmuleで利用されるべきで、その詰め方と一般的なアルゴリズムの実装が問題になるだけです。


なぜ、これらの選択肢を比較することが正しくないのでしょうか?単純なExpert Advisorの範囲内で、必要なシンボル、必要なTFでバーが形成された後に判断する場合は、正しいと思う。

後述するように不正確なのは、同じ目盛りを使って現状を分析する、より複雑なアルゴリズムが追加された場合である。しかし、私は成形された棒にしか興味がないのです。

 
Yedelkin:
当初、質問の意図が分かりませんでした。正しい」検査結果とは、どのようなもので、なぜそれを実現する必要があるのでしょうか。

つまり、現実に対応するものです。どのキャラクターからテストしても、結果は同じになるはずです。この場合、OnTimer()関数を使うだけで同じ結果が得られました。

Konstantin Gruzdevのメソッドにとても興味があります。もしかしたら、私のやり方が悪いから正しい(信頼できる)結果が出なかったのかもしれません。また、この件に関する彼のコメントも期待しています。

 
tol64:

なぜ、これらの選択肢を比較することが正しくないのでしょうか?このシンプルなExpert Advisorの枠組みの中で、正しいシンボルと正しいTFでバーが形成された後に判断すると、正しい判断ができると思います。

後述するように不正確なのは、同じティックを使ってより複雑な現状分析アルゴリズムを追加した場合である。でも、私は成形された棒にしか興味がないんです。

理論的には正しいのですが、実際には疑問が多いのです。

例えば、次のようなものです。ticksのハンドラで実装されていますが、サーバーとの接続が切れてしまいます。システムはどのように機能し、何か問題が発生した場合にどのように検知するのか。

タイマーのみでの実現 - 多少は許容範囲だが、期間の選択で相応の妥協が必要(ただし、それでも困難はある)。

イベント - イベント自体もあまり効率的ではありません。一般的に、ティックとイベントの処理は、リソースを最も効果的に使用し、Expert Advisorがデータの新しい部分の処理に迅速に切り替わるように実装する必要があります。

イェデルキン
最初から質問の意味がわからなかった。正しい」検査結果の意味と、それを得るべき理由とは?

また、100%同一の結果を得てはいけないと思います。しかも、乗算の可能性を1つの記号の取引に限定するのはおかしい。

少なくとも2つのシンボルが取引されるとします(そのうちの1つは、もしかしたらチャートシンボルになるかもしれません)。

 
tol64:

つまり、現実に対応するものです。どのシンボルからテストしても、結果は同じになるはずです。

100%の非同一性を見つけることは、自己欺瞞であり、幻想であると信じています。永遠に働き続けるGRAALのような錯覚と同じです。常に一定の誤差・非同一性を考慮しなければならない。

そしてそのまま、アニメをテストしても、あまり明らかになりません。マルチについての議論は、あくまでも複数のシンボルでの取引、または1つのシンボルで複数のストラテジーでの取引という観点で行う必要があります。

マルチシンボルでは、常に同じ結果が得られることが重要なのではなく、専門家がポジションと履歴を考慮して取引を決定できる仕組みが重要だということです。

例えば、EURUSDと GBPUSDの2つのシンボルを 取引してみてください。一方、取引は2番目のシンボルでヘッジとシグナルを使用して実行する必要があります。

 
Interesting:

100%の非同一性の追求は、自己欺瞞であり、幻想であると信じています。まさに、常勝GRAALのような錯覚。常に一定の誤差・非同一性を考慮しなければならない。

そしてそのまま、アニメをテストしても、あまり明らかになりません。マルチについての議論は、あくまでも複数のシンボルでの取引、または1つのシンボルで複数のストラテジーでの取引という観点で行う必要があります。

マルチシンボルでは、常に同じ結果が得られることは重要ではなく、専門家がポジションと履歴を考慮して取引を決定することができる重要なメカニズムであることを意味しています。

例えば、EURUSDとGBPUSDの2つのシンボルを取引してみてください。一方、取引は2番目のシンボルでヘッジとシグナルを使用して実行する必要があります。

これで、EAがどのように機能すべきかという全体像が見えてきたと思います。実際の取引のためのプログラム 実装の難しさや技術的な詳細については、すべて省略しましょう。この記事では、その事柄が非常に重要である。

1.シンプルなトレーディングシステムです。成形したバーをベースにしています。

2.あるシンボルでのテストが、別のシンボルから行われること。

構成はあえて最小限に簡略化しました。検査結果の解析を容易にするために行われます。すべてのシンボルをテストしても、結果が良くなることはないでしょう。分析が難しく、長くなるような混乱が生じます。Expert Advisorは、それが配置されているシンボルで正確なアクションを表示しますが、それは他のすべてで混乱を引き起こし、まさにこれらの結果が示すものです。そうでなければ、Expert Advisor があるシンボルで正しいエントリーを行い、他のシンボルでは行わない、またはシステムに正確に従わないことが判明します。このズレはかなり顕著です。

これまでは、OnTimer()関数によってのみIDを実現することができました。

追伸:私はグレイルを信じません。というか、他の多くの人とは違う理解をしています)。

 

以下は、OnTimer()関数により、5文字で一気に結果を出したものです。

どのシンボルから検査を行っても、結果は同じです。

しかし、他のメソッド(OnTick()やOnChartEvent())を使用した場合、Expert Advisorが配置されているシンボルを変更すると、結果が異なってしまうのです。そして、Expert Advisorが他のシンボルに対して誤ったアクションを行うことを確認するだけです。

OnTick()で発生する理由は明らかです。すでに何度も議論されていることです。しかし、OnChartEvent()メソッドにはまだ疑問があります。

 

tol64:

OnTick()を使えば、なぜこのようなことが起こるのかがわかります。これはすでに何度も議論されてきたことです。しかし、OnChartEvent()メソッドにはまだ疑問があります。

イベント処理の 遅延、あるいはイベントのLOSSの可能性を考慮する必要があります。
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
tol64:

つまり、現実に対応するものです。どのキャラクターからテストしても、結果は同じになるはずです。この場合、OnTimer()を使用したときのみ、同一の結果が得られました。

ざっくりとしたイメージですね。実際には、マルチカレンシーエキスパートアドバイザーを構築するための「エンジン」を選択することになります。そのためには、原始的な取引戦略を、まず「シグナルソースとシグナルハンドラが一つのシンボルに存在する」方式で実行し、次に「シグナルソースとシグナルハンドラが異なるシンボルに存在する」方式で実行することになります。これでよいのでしょうか?

もしそうなら、「GBPUSDのチャートから EURUSDの ツールでテストする」といった表現がよく理解できません。この場合、どのシンボルがシグナルソースで、どのシンボルにシグナルハンドラが接続されているのでしょうか?

理由: