Bibliotecas: Init_Sync - página 2

 
fxsaber:

Não encontrei um exemplo perigoso.

Na minha memória, essa é a única biblioteca em que a #include está presente, mas nada dela é chamado pelo usuário em qualquer parte do código.

Bem, o principal aspecto dessa biblioteca é uma substituição complicada de funções padrão. Acontece que se trata de uma chamada implícita.

Estou lhe falando sobre o perigo do ponto de vista das alterações e do suporte ao código. Todas essas substituições implícitas serão facilmente esquecidas e, quando a plataforma mudar ou o sincronizador quebrar, será muito difícil detectá-las. Mas, ainda assim, concordo que essa é uma situação rebuscada. Em geral, a ideia é muito original e sensata. De fato, ao simplesmente conectar a biblioteca, sem nenhuma chamada, obtemos um resultado muito útil.

 
fxsaber:


A propósito, obrigado pelo código. Aprendi muitas coisas valiosas e tive algumas ideias interessantes.
 
Medi o tempo de atraso
    static const ulong StartTime = GetMicrosecondCount();    

// se (FirstRun && (!::GlobalVariableCheck(INIT_SYNC::InitSync.GlobalName)))
    if (FirstRun && (!INIT_SYNC::ResourceCheck(INIT_SYNC::InitSync.GlobalName)))
    {
// FirstRun = (::GlobalVariableSet(INIT_SYNC::InitSync.GlobalName, 0) == 0);
      FirstRun = !INIT_SYNC::ResourceCreate(INIT_SYNC::InitSync.GlobalName);

      if (!FirstRun)
      {
        Print(GetMicrosecondCount() - StartTime);

Às vezes, ele chega a 300 ms ao alternar o TF. E isso não acontece no "frio". Acontece que mesmo um terminal "quente" às vezes fica mais lento.

Provavelmente, eu deveria escrever sobre isso para que o SD o conserte.

 

Infelizmente, não consigo entender isso. Nenhuma sequência é perturbada em meus testes.

O DeInit e o Init são executados conforme o esperado. Qualquer outra coisa seria bastante questionável.


Então, eu me pergunto o que esse exemplo de código deve fazer!

 

Suspeito que isso ocorra às vezes, mas nem sempre e nem necessariamente.

Provavelmente, isso se deve ao "threadrace" e não é possível determinar o que é executado quando e em que ordem.

Certa vez, eu mesmo tive a ideia (no MT4, mas também deve funcionar no MT5)

   int lastPing = TerminalInfoInteger(TERMINAL_PING_LAST);

de usar uma interrupção da conexão com o servidor - não é possível!

Como o teste de ping é executado pelo terminal em seu próprio thread, não é certo que esse comando, mesmo que seja o primeiro, muito, muito primeiro em OnCalculate() ou OnTick(), exibirá o cálculo inferior corretamente.

Se o teste de ping foi executado apenas um milissegundo antes, ele mostra que está tudo bem :(

Experimente simplesmente puxar o cabo de aterrissagem...

Minha sugestão é alterar o encadeamento (provavelmente difícil) ou fornecer os últimos 2 ou 3 testes de ping (seria fácil) de um EA ou indicador para poder reconhecer uma interrupção com muita facilidade: Não temos intenção....

 
Otto Pauser:

Infelizmente, não consigo entender isso. Nenhuma sequência é perturbada em meus testes.

O DeInit e o Init são executados conforme o esperado. Qualquer outra coisa seria bastante questionável.


Portanto, eu me pergunto o que esse exemplo de código deve fazer!

Se você iniciar esse indicador e alterar seu período de tempo ou símbolo, verá um distúrbio na ordem das cadeias de caracteres "Init" e "Deinit" no diário.
 

Uma miscelânea de outra especificidade do indicador MT5.


Há um ponto muito sutil na fonte da biblioteca

  static string GetMyUniqueName( void )
  {
    const int handle = GetMyHandle();

    MqlParam Params[];
    ENUM_INDICATOR Type;

    const int Total = ::IndicatorParameters(handle, Type, Params);
    ::IndicatorRelease(handle);

    uchar Bytes[];

    for (int i = 1; i < Total; i++)
    {
      ::ArrayCopy(Bytes, _R(Params[i].double_value).Bytes, ::ArraySize(Bytes));
      ::ArrayCopy(Bytes, _R(Params[i].integer_value).Bytes, ::ArraySize(Bytes));
      ::ArrayCopy(Bytes, _R(Params[i].string_value).Bytes, ::ArraySize(Bytes));
    }

    return("::" + (string)::ChartID() + (string)INIT_SYNC::crc64(Bytes) + ::MQLInfoString(MQL_PROGRAM_NAME));
  }


É uma linha destacada, que é obrigatória, mas o motivo é difícil de explicar em palavras.

[Excluído]  

Olá @fxsaber, estou recebendo os seguintes erros ao tentar usar sua biblioteca


Como faço para corrigir isso? Obrigado.

 
Paul Carissimo:

Olá @fxsaber, estou recebendo os seguintes erros ao tentar usar sua biblioteca

Como faço para corrigir isso? Obrigado.

Leia a descrição com atenção.