Erros, bugs, perguntas - página 1960

 
Caso em que DEAL_TIME_MSC devolve zero
// Время в миллисекундах первой балансовой сделки (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);
}
 

Se carregar em Stop durante a optimização e depois reiniciar Optimisação, não irá, pois esta será a entrada

Core 1  occupied by another terminal
Core 2  occupied by another terminal
 
O testador não chama ParameterSetRange para parâmetros de entrada que não são verificados para Optimização. Por este motivo, a ParametersGetRange devolve zeros para os valores de Início, Passo e Paragem correspondentes. Isto não é de todo correcto. Por exemplo, devido a isto, é impossível gerar um ficheiro SET completo do próprio testador ou corrigir o intervalo de optimização de um parâmetro de entrada se este for incorrectamente definido pelo utilizador.
 
ParameterGetRange não funciona no 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:
Como somar rapidamente muitas cordas (por exemplo, gerar um relatório comercial em cadeia)

Resultado

Há um facto marcado a vermelho que não pode ser explicado de forma alguma.

A peculiaridade da reserva de memória, a primeira chamada SumString2 na reserva de memória está "saturada" com memória do sistema, a segunda vez, a memória já não é solicitada ao sistema.

Recomendo a correcção do 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:

Sobre o editor.

  • Se escrever a seguinte linha no Metaeditor, a dica de ferramenta (ou qual é o nome correcto para uma dica de ferramenta com opções?) GetMicrosecondCount não aparece.
    DoubleToString(GetMicro

O destaque é inteligente, o argumento da DoubleToString deve ser duplo e aGetMicrosecondCount deve ser ulong.

Funcionaria desta forma:

DoubleToString( (double)GetMicro
 
fxsaber:

Alguma ideia de como obter o nome de um parâmetro de entrada arbitrária como uma string?

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:

Alguma ideia de como obter o nome de um parâmetro de entrada arbitrária como uma string?

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

#define  TOSTRING(A) (#A)

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

Óptimo, obrigado!

E para obter uma lista de casos de EA ao executar um único teste? Sem ler o ficheiro de definições usando dll.
Feito uma conveniente exibição dos parâmetros utilizados no teste após a optimização (via ficheiro e variáveis principais), subsiste um inconveniente - todos os parâmetros têm de ser listados manualmente.

 
Andrey Khatimlianskii:

Recebo uma lista de casos de EA ao executar um único teste?

Não pode, apenas no modo Optimização.

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

fxsaber, 2017.07.25 11:27

Como conhecer os parâmetros de entrada de uma EA, pelo menos no modo de execução única?

Para os indicadores existe o IndicatorParameters.

Para optimizações, existe o FrameInputs.

Mas para uma corrida única da EA ou corrida normal - nada.