多币种专家测试结果 - 页 4

 
tol64:
你能不能展示一个类似于我在分支开始时做的例子。只包括在一个符号上的交易,但在另一个符号上测试。拍摄一张截图,并在运行测试的符号上进行测试。是否会出现像分支开始时显示的分歧?尽管如果在所有的符号上都追踪到了条形结构,它应该是相同的。但你仍然需要检查一切...

好吧,我不会测试它。我可以发布代码,你来测试;-)。

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:

好吧,我不会测试它。我可以发布代码,你来测试;-)。

))谢谢你提供的变体。现在我只检查我的猜想,这个猜想是由论坛参与者YedelkinInteresting 指出一个可能的错误而产生的,然后我将很乐意测试你的变体。我将详细报告结果。))
 

Yedelkin 

注意代码的部分。

在这里你可以看到,你在两个不同的字符上 "铰接 "了某种 "间谍控制面板MCM "指标。就是说,你有不同的符号作为信号源。但你声称 "我们在欧元兑美元上交易",即信号源是同一个符号。让我们把话说清楚。

我们只在欧元兑美元 上交易。

在我的测试中,我考虑了Konstantin Gruzdev编写的方案--MetaTrader 5中多货币模式的实现。)))一切都被定义了。所附文件包含Spy Control panel MCM 指标和exSpy Control panel MCM Expert Advisor。通过在图表上安装专家顾问,你可以看到它如何工作。日志清楚地显示了专家顾问从不同符号收到的指定事件。一切都很清楚,没有任何东西是混合的。

我现在尝试在OnChartEvent()中指定接收ID的符号,但这并没有改变结果。我从OnInit()中删除了第二个字符,以消除任何接收错误事件的可能性。现在使用这种变体进行试验。

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

欧元兑美元 图表中的欧元兑美元 符号进行测试。

GBPUSD 图表上测试EURUSD 工具。

结果并不一致。

有趣的是

从这段代码来看,信号确实来自两个符号,但专家顾问可以延迟处理其中一个信号。

第二个符号不再出现,信号只来自欧元兑美元。但不幸的是,这并不能解决问题。

 
marketeer:

好吧,我不会测试它。我可以发布代码,你来测试;-)。

测试了你的版本。))结果几乎是相同的。对于初步(快速)测试来说,它可能足够好。我们将使用OnTimer()函数来获得绝对相同的结果。

以下是测试的结果。

欧元兑美元 图表上测试欧元兑 美元工具。

GBPUSD 图表上测试EURUSD 工具。

 
MetaDriver:

我认为10秒的间隔时间太短了。如果 只对已形成的条形图 感兴趣,那么间隔时间至少应该是一分钟

缩短时间没有意义,一分钟 最小的合理 间隔......

又做了一系列测试,以显示10秒以上结果的不一致性。我们将与同样的 "基准 "进行比较,这个基准是在本专题开始时提供的。也就是说,从OnTick()函数由形成的日线条,当专家顾问在被测试的符号上。在这里,它是。

那么所有的结果都将来自OnTimer()函数。专家顾问是在GBPUSD 符号上。

GBPUSD 图表中测试EURUSD 符号。计时器的时间间隔是10 秒。

这是最准确的结果。

GBPUSD 图表中测试EURUSD 符号。计时器的间隔时间是1 分钟。

这是不正确的。结果甚至明显更好,这也是不正确和误导。

GBPUSD 图表中对EURUSD 进行测试。计时器的时间间隔为60 分钟。

结果在很多地方与基准不一致。

GBPUSD 图表上测试EURUSD。计时器的间隔时间是1 天。

其结果是比任何其他东西都不相同的。

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

一般来说,为了完全相信正确的结果,应该通过OnTimer()函数测试多币种专家顾问系统,设置最小间隔。

 
tol64:

又做了一系列测试,以显示10秒以上结果的不一致性。我们将与同样的 "基准 "进行比较,这个基准是在本专题开始时提供的。也就是说,从OnTick()函数由形成的日线条,当专家顾问在被测试的符号上。在这里,它是。

那么所有的结果都将来自OnTimer()函数。专家顾问是在GBPUSD 符号上。

GBPUSD 图表中测试EURUSD 符号。计时器的时间间隔是10 秒。

这是最准确的结果。

GBPUSD 图表中测试EURUSD 符号。计时器的时间间隔是1 分钟。

不正确。结果甚至明显更好,这也是错误和误导。

GBPUSD 图表中对EURUSD 进行测试。计时器的时间间隔是60 分钟。

结果在许多地方与基准不一致。

GBPUSD 图表上测试EURUSD。计时器的时间间隔是1 天。

其结果是比任何其他东西都不相同的。

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

一般来说,为了完全相信正确的结果,应该通过OnTimer()函数测试多货币专家顾问,同时设置最小间隔。

我不太明白。你做了一个错误的比较。

第一个测试是正确的:比较两种测试方式--在 "你的 "工具上和另一个工具上。然后你把这第一个结果作为一个基准,并把所有其他的结果与它进行比较。

这是不正确的。 你应该将其余的身份运行不是与第一个结果进行比较,而是与 "你的 "仪器上的相同滴答频率的运行进行比较。

它们会与 "10秒 "不同,这是很自然的,主要是它们应该是成对相同的。

请完成测试。

否则就会发现你只是浪费了时间,很奇怪地设法证实了你最初 "关于10秒测试的优势 "的幻想。

 
tol64:

测试了你的选项。))结果几乎是相同的。对于初步(快速)测试来说,它已经足够好了。为了得到完全相同的结果,我们将使用OnTimer()函数。

据我所知,你现在测试的不是我的同步方式,而是MetaTrader的tick发生器。重点是,当你运行测试时,产生了不同的tick基数--以eurusd的名义和以gbpusd的名义,而且结果几乎从不相同。在现实中,如果你在不同的符号上用指定的同步块运行两个EA,差异应该可以忽略不计或根本没有。
 
MetaDriver:

我不太明白。你比较的东西是不正确的。

第一个测试是正确的:比较两种测试方式--在 "你的 "仪器上和另一个仪器上。然后你把第一个结果作为基准,并把其他所有的结果与它进行比较。

这是不正确的。 你应该将其余的身份运行不是与第一个结果进行比较,而是与 "你的 "仪器上的相同滴答频率的运行进行比较。

它们会与 "10秒 "不同,这是很自然的,主要是它们应该是成对相同的。

请完成测试。

否则就会变成浪费时间,因为它奇怪地设法证实了它最初的 "10秒测试的优势 "的幻觉。

很好。现在我已经开始了另一个漫长的测试。当我醒来时,它就会结束。但我已经可以告诉你,它们成对的时候是相同的,因为我已经看到了。剩下的就是让我给你看。但你可以自己做同样的测试。这是测试交易系统的一个重要点。我可能是做错了什么))。

P.S. 最主要的是,它们一定不是成对的,因为通过OnTimer()函数测试时,它们在任何情况下都显得相同。最初的目的是使它们与在正常模式下使用OnTick()函数获得的结果相同,并明确检查条形。在一个符号上交易的专家顾问做得很完美。但在多货币模式下,有必要找出。其结果是显而易见的。

 
marketeer:
据我所知,你现在测试的不是我的同步方式,而是MetaTrader的tick发生器。问题是,当你运行测试时,你产生了不同的tick base--在eurusd和gbpusd的名称下,它们的结果几乎不会相同。在现实中,如果你在不同的符号上用指定的同步块运行两个EA,差异应该可以忽略不计或根本没有。
你说的是什么现实?实时测试?如果是这样,那么我当然同意。如果你把两个EA挂在它们的符号上,一切都将是正确的。但我正在测试多币种模式。而只用OnTimer()(10秒)显示了一个相同的结果。
 
tol64:

交易只针对欧元兑美元

让我们从正确的措辞开始。在最初的例子中,你希望有 "欧元兑美元的交易"。事实上,从两个符号中收到了自定义事件,在事件处理程序中,当收到来自这两个符号中任何一个的事件时,TradeSignalCounter()+TradePerformer()被调用。我们可以假设,事件队列总是满的。

现在你已经删除了一个信号源,但出于某种原因在事件处理程序中输入了"if(sparam == Symbol_01) "的检查。但下一个问题是不同的。根据代码,Lizar的方案在 "所有刻度 "模式下使用,在信号源(EURUSD)的每一个刻度上,都会调用TradeSignalCounter()+TradePerformer()函数。有趣的是,已经暗示了事件队列可能溢出的问题。但我想知道这两个函数的Symbol_01参数用的是什么仪器,以及你是否尝试过改变Lizar方案中事件的周期性。