多通貨エキスパートテスト結果 - ページ 4

 
tol64:
また、ブランチの冒頭で行ったのと同じような例を示してもらえますか。1つのシンボルのみでの取引を含み、別のシンボルでテストする。スクリーンショットを撮り、テストが実行されているシンボルでテストしてください。分岐の最初に示したような分岐はあるのでしょうか?すべてのシンボルでバーフォーメーションが追跡されている場合、それは同一であるべきですが。でも、やっぱり全部チェックしないと...。

まあ、テストはしませんが。私はコードを投稿することができますので、あなたはそれをテストする;-)。

string Instruments[] = ...
int SymbolCount = ArraySize(Instruments);

void RefreshRates(string symbol)
{
  MqlTick tick;
  SymbolInfoTick(symbol, tick);
  SymbolInfoDouble(symbol, SYMBOL_BID);
}

bool Synchronization()
{
  static bool Sync = true;

  string StrUnsync;
  int u = 0;

  datetime dt0 = (datetime)SeriesInfoInteger(_Symbol, Period(), SERIES_LASTBAR_DATE);
  
  for(int j = 0; j < SymbolCount; j++)
  {
    RefreshRates(Instruments[j]);
    datetime dt = (datetime)SeriesInfoInteger(Instruments[j], Period(), SERIES_LASTBAR_DATE);
    if(dt != dt0)
    {
      StrUnsync = StrUnsync + Instruments[j] + " ";
      u++;
    }
  }
  if(u > 0)
  {
    Print("Some symbols are unsynchonized:", StrUnsync);
    Sync = false;
    return(false);
  }
  else
  {
    if(!Sync)
    {
      Print("Synchronization done");
    }
    Sync = true;
  }
  return(true);
}

void OnTick()
{
  if(!Synchronization()) return;
  ...
}
 
marketeer:

まあ、テストはしませんが。私はコードを投稿することができますので、あなたはそれをテストする;-)。

))与えられたバリエーションに感謝します。今は、フォーラム参加者のYedelkinと Interestingから エラーの可能性を指摘されて作成した私の提案を確認するだけで、それからあなたの変種を喜んでテストします。その結果を詳しくご報告します。))
 

Yedelkin 

コードの部分に注意してください。

ここでは、「スパイコントロールパネルMCM」のインジケーターのようなものを、2つの文字に「ヒンジ」していることがわかります。つまり、信号源として異なる記号を持っているわけです。しかし、あなたは「EURUSDで取引している」、つまりシグナルソースは1つで同じシンボルであると主張しているのです。はっきりさせましょう。

EURUSD のみで取引しています。

私のテストでは、Konstantin Gruzdev -Implementation of Multicurrency Mode in MetaTrader 5によって書かれたスキームを考慮しています。)))すべてが定義されています。添付ファイルには、Spy Control panel MCM インジケーターとexSpy Control panel MCM Expert Advisorが含まれています。Expert Advisorをチャートにインストールすることで、その動作を確認することができます。ログには、Expert Advisor が異なるシンボルから受信した指定イベントが明確に表示されます。すべてがクリアで、何も混ざらない。

現在、OnChartEvent()でIDを受信したシンボルを指定してみましたが、結果は変わりません。OnInit()の2文字目を削除したのは、間違ったイベントを受け取る可能性を排除するためです。今回、このバリエーションでテストを実施した。

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);}

 return(0);
}

void OnChartEvent(const int id,         // идентификатор события
                  const long&   lparam, // флаг события поступившего от агента панели.
                                        // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
 
 if(id >= CHARTEVENT_CUSTOM)
   {
    if(sparam == Symbol_01)
      {
       // Получение торговых сигналов
       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 シンボルでのテストです。

GBPUSDの チャートからEURUSDの ツールでテストします。

結果は一貫していない。

興味深い

このコードから判断すると、シグナルは確かに2つのシンボルから来ています。 しかし、Expert Advisorはこれらのシグナルのうちの1つを遅延して処理することができます。

2つ目のシンボルはなくなり、シグナルはEURUSDからのみと なりました。しかし、残念ながらこれで問題が解決するわけではありません。

 
marketeer:

まあ、テストはしませんが。私はコードを投稿することができますので、あなたはそれをテストする;-)。

あなたのバージョンをテストしました。))結果はほぼ同じです。予備(クイック)テストには十分かもしれません。OnTimer()関数を使用して、全く同じ結果を得ることができるようにします。

以下はテスト結果です。

EURUSD ツールでEURUSD チャートからテストしてください。

GBPUSDの チャートからEURUSDの ツールでテストします。

 
MetaDriver:

10秒というのは短すぎると思うんです。 形成されたバーだけが 注目される場合 、間隔は少なくとも1分 であるべきです。

短くする意味はない、1 分が妥当な最小 間隔だ...。

10秒以上での結果の矛盾を示すために、別の一連のテストを行いました。冒頭と同じ「ベンチマーク」で比較します。つまり、Expert Advisorがテスト対象のシンボルにあるとき、形成された日足バーによるOnTick()関数からです。これです。

そうすると、すべての結果はOnTimer()関数からのものになります。Expert AdvisorはGBPUSDの シンボル上にあります。

GBPUSDの チャートからEURUSDの シンボルでテストします。タイマーの間隔は10 秒です。

これが最も正確な結果です。

GBPUSDの チャートからEURUSDの シンボルでテストします。タイマーの間隔は1 分です。

これは事実ではありません。結果はさらに大幅に良くなったが、これも不正確であり、誤解を招く。

GBPUSDの チャートからEURUSDの テスト。タイマーの間隔は60 分。

その結果、多くの場所でベンチマークと一致しない。

GBPUSDの チャートからEURUSDで テスト。タイマーの間隔は1 日です。

その結果、何よりも非同一であることがわかります。

-------------------------

一般的に、正しい結果を完全に確信するためには、多通貨 Expert Advisors はOnTimer() 関数を通じて、最小間隔を設定してテストする必要があります。

 
tol64:

10秒以上での結果の矛盾を示すために、別の一連のテストを行いました。冒頭と同じ「ベンチマーク」で比較します。つまり、Expert Advisorがテスト対象のシンボルにあるとき、形成された日足バーによるOnTick()関数からです。これです。

そうすると、すべての結果はOnTimer()関数からのものになります。Expert AdvisorはGBPUSDの シンボル上にあります。

GBPUSDの チャートからEURUSDの シンボルでテストします。タイマーの間隔は10 秒です。

これが最も正確な結果です。

GBPUSDの チャートからEURUSDの シンボルでテストします。タイマーの間隔は1 分です。

正しくありません。結果はさらに大幅に良くなっており、これも間違いであり、誤解を招くものである。

GBPUSDの チャートからEURUSDの テスト。タイマーの間隔は60 分です。

その結果、多くの場所でベンチマークと一致しない。

GBPUSDの チャートからEURUSDで テスト。タイマーの間隔は1 日です。

その結果、何よりも非同一であることがわかります。

-------------------------

一般的に、正しい結果を完全に確信するために、多通貨 Expert Advisors は最小間隔を設定しながらOnTimer() 関数を通してテストされるべきです。

よくわからないのです。比較対象を間違えています。

最初のテストは正しいです。「あなたの」ツールと別のツールで、2つのテスト方法を比較することです。そして、この最初の結果をベンチマークとして、他のすべての結果をそれと比較したわけです。

これは正しくありません。 残りのIDの実行は、最初の結果ではなく、「あなたの」楽器で同じティッキング周波数の実行と比較する必要があります。

10秒」と異なるのは当然で、要はペア的に同一であることが重要なのです。

テストを完了してください。

そうでなければ、「10秒テストの利点」という最初の幻想を見事に裏付けて、時間を無駄にしただけということになる。

 
tol64:

オプションをテストしました。))結果はほぼ同じです。予備(クイック)テストには十分な性能です。完全に同じ結果を得るには、OnTimer()関数を使用します。

私が理解する限り、あなたが今テストしているのは私の同期方法ではなく、MetaTraderのティックジェネレータなのです。ポイントは、テストを実行すると、eurusdという名前とgbpusdという名前で、異なるティックベースが生成され、その結果がほとんど同じにならないことです。実際には、指定された同期ブロックを持つ2つのEAを異なるシンボルで実行すると、その差は無視できるか全くないはずです。
 
MetaDriver:

よくわからないんです。間違って比較したもの。

最初のテストは正しい。「自分の」楽器と別の楽器で、2つのテスト方法を比較するのだ。そして、その最初の結果をベンチマークとして、他のすべての結果をそれと比較したのです。

これは正しくありません。 残りのIDの実行は、最初の結果ではなく、「あなたの」楽器で同じティッキング周波数の実行と比較する必要があります。

10秒」と異なるのは当然で、要はペア的に同一であることが重要なのです。

テストを完了してください。

そうでなければ、「10秒テストの利点」という最初の幻想を妙に裏付けてしまい、時間の無駄になってしまうからだ。

よかったです。今はもう、別の長いテストが始まっています。目が覚めたら終わっている。でも、ペアで同じものであることは、もう、見たからにはわかりますよ。あとは、私がお見せするだけです。でも、同じテストを自分でもできるんですよ。トレーディングシステムをテストする上で、重要なポイントになります。私のやり方が悪いのかもしれませんが))。

追伸:OnTimer()という関数を通してテストすると、どのような場合でも同一に見えるので、ペアで同一であってはいけないというのが主なポイントでした。当初は,OnTick()関数でバーを明示的にチェックし,通常モードで得られる結果と同じにすることが目的でした。1つのシンボルで取引するExpert Advisorは、それを完璧にこなします。しかし、多通貨モードでは、それを見極める必要があったのです。その結果は一目瞭然です。

 
marketeer:
私が理解する限り、あなたが今テストしたのは私の同期方法ではなく、MetaTraderのティックジェネレータです。ポイントは、テストを行う際に、eurusdとgbpusdという異なるティックベースを生成し、それらの結果がほぼ同じになることはないということです。実際には、指定された同期ブロックを持つ2つのEAを異なるシンボルで実行すると、その差は無視できるか全くないはずです。
どんなリアリティがあるんだ?リアルタイムテスト?もしそうなら、もちろん賛成です。2つのEAをそのシンボルにぶら下げれば、すべてが正しくなります。しかし、私は多通貨モードをテストしています。また、OnTimer()のみを使用した場合(10秒)も同様の結果を示しています。
 
tol64:

取引はEURUSDのみ です。

まずは正しい表現から。最初の例では、「EURUSDで取引する」ようにしたいのです。実際には、2つのシンボルからカスタムイベントを 受信し、イベントハンドラでは、この2つのシンボルのいずれかからイベントを受信したときにTradeSignalCounter()+TradePerformer()が呼び出されました。イベントキューは常に満杯だったと推測されます。

さて、シグナルソースの1つを削除したのに、なぜかイベントハンドラに「if(sparam == Symbol_01)」というチェックが入っていますね。しかし、次の質問は違います。コードから判断すると、Lizarのスキームは「All ticks」モードで使用され、関数TradeSignalCounter()+TradePerformer()がシグナルソース(EURUSD)から毎ティックで呼び出されています。興味深いのは、すでにイベントキューがオーバーフローする可能性を示唆していることです。しかし、この2つの関数のSymbol_01パラメータとしてどのような計測器が使われているのか、また、Lizarのスキームでイベントの周期性を変えてみたのか、知りたいところです。