错误、漏洞、问题 - 页 1960

 
DEAL_TIME_MSC 返回0的情况
// Время в миллисекундах первой балансовой сделки (DEAL_TIME_MSC) в тестере равно нулю
int OnInit()
{
  if (HistorySelect(0, TimeCurrent()) && HistoryDealsTotal())
  {
    Print((datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME)); // Время балансовой сделки
    Print(HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME_MSC));       // Это же время в мс равно нулю
  }

  return(INIT_FAILED);
}
 

如果你在优化过程中按下停止键,然后重新启动优化,它将不会运行,因为条目会如下

Core 1  occupied by another terminal
Core 2  occupied by another terminal
 
测试员不会为未检查优化的输入参数调用ParameterSetRange。由于这个原因,ParametersGetRange对相应的开始、步骤和停止值返回零。这一点也不正确。例如,由于这个原因,不可能生成一个完整的测试器本身的SET文件,也不可能纠正一个输入参数的优化范围,如果它被用户错误地设置。
 
ParameterGetRange 在OnTesterInit中不起作用。
sinput int Range = 5;

#define  PRINT(A) Print(#A + " = " + (string)(A));

void PrintParameter( const string Name, const string From )
{
  PRINT(From)
  
  bool Enable;
  long Value, Start, Step, Stop;
  
  if (ParameterGetRange(Name, Enable, Value, Start, Step, Stop))
  {
    PRINT(Start)
    PRINT(Step)
    PRINT(Stop)
    PRINT(Value)
    PRINT(Enable)
  }   
}

void OnTesterInit()
{
  ParameterSetRange("Range", true, 5, 1, 2, 3); // Задали ненулевыми все значения
  
  PrintParameter("Range", __FUNCTION__); // Возвращает одни нули
}

void OnTesterDeinit()
{
  PrintParameter("Range", __FUNCTION__); // Работает нормально
  
  ChartClose();
}

void OnTesterPass()
{
  PrintParameter("Range", __FUNCTION__); // Работает нормально
}

int OnInit()
{
  uchar Data[];
  
  FrameAdd(NULL, 0, 0, Data);
  
  return(INIT_FAILED);
}
 
fxsaber:
如何快速地把许多字符串加起来(如用字符串生成交易报告)。

结果

有一个用红色标记的事实,无法用任何方式解释。

由于内存池的特殊性,第一次调用SumString2时,内存池中的内存已经从系统中 "饱和",第二次则不再从系统中请求内存。

我建议纠正SumString1

ulong SumString1( string TmpStr, const int Amount )
{
  const ulong StartTime = GetMicrosecondCount();

  string Str;
  StringInit(Str,Amount * StringLen(TmpStr) + 1);            << обеспечим строке приёмный буфер

  for (int i = 0; i < Amount; i++)
    Str += TmpStr;

  return(GetMicrosecondCount() - StartTime);
}
 
fxsaber:

关于编辑。

  • 如果你在Metaeditor中输入以下一行,GetMicrosecondCount的工具提示(或带有选项的工具提示的正确名称是什么)就不会出现。
    双向字符串(GetMicro

突出显示很巧妙,DoubleToString参数应该是double,GetMicrosecondCount 应该是ulong。

它将这样工作。

DoubleToString( (double)GetMicro
 
fxsaber:

有什么办法可以把一个任意的输入参数的名称作为一个字符串来获取?

input double dParam1 = 1.0; // Double
input int iParam2 = 2;      // Integer

Print( InputToString( dParam1 ) ); // "dParam1"
Print( InputToString( iParam2 ) ); // "iParam2"

template<typename T>
string InputToString(T param)
{
   ???
}
 
Andrey Khatimlianskii:

有什么办法可以把一个任意的输入参数的名称作为一个字符串来获取?

input double dParam1 = 1.0; // Double
input int iParam2 = 2;      // Integer

#define  TOSTRING(A) (#A)

Print( TOSTRING( dParam1 ) ); // "dParam1"
Print( TOSTRING( iParam2 ) ); // "iParam2"
 
fxsaber:

很好,谢谢!

并在运行单个测试器时获得EA实例的列表?没有使用dll读取设置文件。
在优化后,对测试中使用的参数进行了方便的显示(通过文件和主变量),但仍有一个不便之处--所有参数都必须手动列出。

 
Andrey Khatimlianskii:

当运行单个测试器时,我是否得到一个EA实例的列表?

你不能,只有在优化模式下才可以。

关于交易、自动交易系统和交易策略测试的论坛

虫子,虫子,问题

fxsaber, 2017.07.25 11:27

如何至少在单一运行模式下知道EA的输入参数

对于指标,有IndicatorParameters。

为了优化,有FrameInputs。

但对于EA的单次运行或正常运行--什么都没有。