程序库: 多功能测试仪 - 页 16

 

最便捷的方法是下载历史交易点数(在终端 中运行智能交易系统)。

#property description "下载蜱通过测试仪"。

sinput datetime inFromDate = D'2019.01.01'; // 从哪个日期开始上传刻度线
sinput bool inAllSymbols = false;           // 按所有字符(真)或当前字符(假)

#include <fxsaber\MultiTester\MTTester.mqh> //https://www.mql5.com/zh/code/26132

string PrevTesterSettings = NULL;

string GetMyName( void )
{
  return(StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Experts\\")));
}

bool RunMe( const datetime FromDate, const bool AllSymbols = false )
{
  const string Str = "[Tester]" +
                     "\nExpert=" + GetMyName() +
                     "\nSymbol=" + _Symbol +
                     "\nOptimization=" + (AllSymbols ? "3" : "0") +
                     "\nModel=4" +
                     "\nFromDate=" + TimeToString(FromDate, TIME_DATE) +
                     "\nToDate=" + TimeToString(TimeCurrent(), TIME_DATE) +
                     "\nForwardMode=0" +
                     "\nProfitInPips=1" +
                     "\nOptimizationCriterion=0" +
                     "\nVisual=0";
                     
  return(MTTESTER::SetSettings2(Str) && MTTESTER::ClickStart());
}

int OnInit()
{
  bool Res = !MQLInfoInteger(MQL_TESTER) && EventSetTimer(1);

  if (Res = Res && MTTESTER::GetSettings(PrevTesterSettings))
    if (!(Res = RunMe(inFromDate, inAllSymbols)))
      MTTESTER::SetSettings2(PrevTesterSettings);

  return(Res ? INIT_SUCCEEDED : INIT_FAILED);
}

void OnTimer()
{
  if (MTTESTER::IsReady())
  {
    MTTESTER::SetSettings2(PrevTesterSettings);
    
    if (inAllSymbols)
      MTTESTER::CloseNotChart();

    ExpertRemove();
  }
}


之后,您就可以在终端中运行与刻度线相关的脚本,而不必在没有生命迹象的情况下等待很长时间。

 
Stanislav Korotky:

通过支持文本格式的测试器传递设置(如符号、时间框架和其他可在每行中传递给TesterSettings.Add 的内容),您可以无需为TesterSettings.Add 调用编写自己的 MQL5 控制器。然后制作一个通用的 Expert Advisor 控制器(添加到库中),它只接受一个参数作为输入--一个包含设置的文件,并在其基础上实现SetTesterSettings,这样用户就不需要编写任何程序了。

最终,我做到了这一点。我们从 ini 文件中生成一批任务并发送执行。

因此,ini 变体并不总是合适的。


ZY在此 实现。

 
对于练习测试仪自动化的人,我建议查看以下设置
MQL5\Profiles\Tester\Groups\*.txt
MQL5\Profiles\Tester\Symbols\*.txt
 
fxsaber:

下载勾选历史记录的最便捷方法(在终端 中运行 EA)。

之后,您就可以在终端中运行与 ticks 相关的脚本,而不必在没有生命迹象的情况下等待很长时间。

这对于从真实符号的刻度历史中创建自定义符号非常有用。自定义符号与原始符号的不同之处在于,它们将完全对应刻度线和条形图。因此,测试仪(示例)不会出现错误结果。

 
遗憾的是,即使在测试仪中下载了刻度线历史记录,仍然无法从终端访问几年前的刻度线数据。我必须先从测试仪中将刻度线卸载到文件中,然后再通过终端将其加载到自定义符号中。下面是一个智能交易系统的示例,首先应在测试仪中以真实刻度线模式运行,收集刻度线,然后在终端中将刻度线加载到自定义符号中。
附加的文件:
 
Evgenii Kuznetsov:
遗憾的是,即使在测试仪中下载了刻度线历史记录,仍然无法从终端访问几年前的刻度线数据。我必须先从测试仪中将刻度线卸载到文件中,然后再通过终端将其加载到自定义符号中。下面是一个 Expert Advisor 的示例,它必须先在测试器中以真实刻度线模式运行以收集刻度线,然后在终端中将刻度线加载到自定义符号中。

您的方案可以通过在终端运行智能交易系统来实现,其中将使用 MTTester.mqh。


多年来,我从未遇到过用刻度线创建自定义符号的任务。有一年,我在终端中使用了刻度线,没有出现任何问题。也许您没有分段请求,只是在请求大间隔时因内存不足而踌躇不前。

 
内存不足的 情况下,CopyTicksRange 会给出-1,因此可以通过 GetLastError() 找出错误,但在我的情况下,它只给出了 0。
 
Evgenii Kuznetsov:
内存不足的 情况下,CopyTicksRange 会给出-1,因此可以通过 GetLastError() 找出错误,但在我的情况下,它只给出了 0。

如果有数据可以复制,开发人员就可以查看并纠正错误。

 

只需从 2013 年起在测试仪中以真实点数模式运行任何智能交易系统即可。

然后在终端运行脚本:

void OnStart(){
   MqlTick Ticks[];
   Print("!!! ",CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (ulong)D'2013.01.01' * 1000, (ulong)D'2013.02.01' * 1000));
}
 
Evgenii Kuznetsov:

是的,只需从 2013 年起在测试仪中以真实点数模式运行任何 EA 即可。

然后在终端运行脚本:

2020.02.12 16:35:03.435 Test6 (USDSEK,M1)       !!! 2370228