Bibliotecas: Symbol - página 5

 
Viktar Dzemikhau:
Gostaria de saber por que são necessários símbolos personalizados?

histórico de ticks de terceiros - não do MT5. Você pode entender imediatamente como a fonte se adapta ao seu TS em termos de condições de negociação.

  • Você pode sincronizar os históricos de preços de diferentes símbolos para evitar situações de falsa arbitragem.
  • Você pode executar Expert Advisors estatísticos no testador em diferentes históricos de preços e comparar as condições de negociação.
  • Você pode comparar defasagens entre diferentes feeds.
  • Você pode remover erros óbvios no histórico de preços e preencher buracos.
  • Você pode gerar seu próprio histórico de preços com os dados estatísticos necessários - Monte Carli TC.
  • Você pode gerar o histórico de preços de símbolos sintéticos e executar o TC neles.
  • ...
  • Algumas coisas foram implementadas nessa ramificação.

     
    fxsaber:

    No testador MT5, como regra (forex, por exemplo), as ordens de limite têm derrapagem positiva, o que leva ao Chame ExpertRemove quando o evento correspondente tiver ocorrido. Assim, a otimização é significativamente mais rápida.

    Isso é especialmente importante para símbolos personalizados, já que as transações são feitas mesmo com saldo negativo.

    O ExpertRemove simples não funcionará, pois forçará o fechamento das posições atuais a zero no último preço, caso não haja dados sobre isso nos símbolos personalizados (na maioria das vezes).


    Portanto, para ainda sair do backtest sem pôquer, você deve fazer o seguinte antes do ExpertRemove

    // Fecha posições por meio de ordens limitadas
    bool CloseAll()
    {
      bool Res = true;
      
      for (int i = OrdersTotal() - 1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS))
          Res &= (OrderType() > OP_SELL) ? OrderDelete(OrderTicket())
                                         : OrderSend(OrderSymbol(), OrderType() ? OP_BUYLIMIT : OP_SELLLIMIT , OrderLots(), OrderClosePrice(), 100, 0, 0) && false;
        
      return(Res);
    }
    
    void OnTick( void )
    {
      if (IsRemove() && CloseAll())
        ExpertRemove();
    }


    Observe que o fechamento no tick atual será apenas na compensação (onde a tarefa original de remover deslizamentos de ordens de limite é implementada), uma vez que o fechamento no tick atual será apenas na compensação (onde a tarefa original de remover deslizamentos de ordens de limite é implementada).

    Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

    Bibliotecas: Symbol

    fxsaber, 2018.04.06 16:43

    As ordens de limite ao preço atual nos símbolos de câmbio das contas de Netting serão executadas (e no Tester) imediatamente, sem esperar pelo próximo tick.


    Observe que não é apenas o símbolo da ação que é importante, mas também a conta de compensação. Por exemplo, você pode usar um símbolo MOEX em um Hedge-MQ-Demo, mas ele não será executado da mesma forma (e no Tester) que no mesmo Netting-MQ-Demo.

    Esse é um dos motivos pelos quais os backtests dos mesmos símbolos MOEX completamente idênticos podem ser diferentes, dependendo do tipo de conta.

    Portanto, às vezes é preciso esperar pelo próximo tick.


    Esse é o tipo de dança.

     

    Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

    Bibliotecas: Symbol

    fxsaber, 2018.04.07 22:37

    Resumo

    Em ticks reais, o número de ticks diminuiu em 16 vezes (o filtro mais leve), a velocidade de otimização aumentou em 14 vezes, a qualidade não sofreu nada (análise que não entrou aqui). Obviamente, isso só pode ser feito quando se escreve o TS de uma determinada maneira. Em particular, com a ausência de análise de barras.

    A aceleração universal gratuita anterior proporcionou apenas um aumento de duas vezes. A atual também é gratuita (a qualidade não é afetada), mas é menos universal. No entanto, o retorno é maior do que uma ordem de grandeza. Agora, otimizo o TC somente dessa forma. Não há erro.

    Já que o tópico se refere à aceleração, aqui está outra receita para aceleração

    Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

    Erros, bugs, perguntas

    fxsaber, 2018.09.11 17:15

    Pasta do testador movida para 5Gb RAMDisk e no diretório MT5 executado

    mklink /j Tester z:\Tester


    Agora o SSD dorme tranquilamente, a otimização ficou ~1,5 vezes (a olho nu) mais rápida, de graça!

    Ao mesmo tempo, a SSD não é eliminada.

     
    fxsaber:

    simples que o ExpertRemove não pode fazer, porque as posições atuais são forçadas a serem fechadas com o último preço zero se não houver dados sobre elas nos símbolos personalizados (na maioria das vezes).


    Essas são as danças.

    As muletas também estão em outro

    Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

    Erros, bugs, perguntas

    fxsaber, 2018.09.12 18:30

    No vídeo

    Instrumento de câmbio em ticks reais. As barras são construídas por Bid, sem dados de flipper, a posição BUY está aberta. Pode-se ver claramente que o preço de fechamento atual da posição

    PositionGetDouble(POSITION_PRICE_CURRENT)

    é constantemente igual a zero, apesar do fato de que o Bid está mudando o tempo todo. Como posso explicar ao testador que um símbolo de ação deve fechar uma posição de COMPRA pelo lance? No momento, nem mesmo o patrimônio líquido é calculado.


    Por isso, a única solução por enquanto é fazer (Bid+Ask)/2.

     
    fxsaber:

    Como o tópico diz respeito à aceleração

    O passo a passo de "ticks reais" do testador por três meses (8 milhões de ticks) leva 100 ms (4000 OrderSend, 800 negociações + lógica da EA). A receita são símbolos personalizados.

     

    Obrigado pelo código. Criei algo para mim com base nele... No entanto, modifiquei ligeiramente o método de clonagem para que fosse possível carregar uma determinada parte do histórico. Caso contrário, se houver muitos ticks, isso consumirá muita RAM.

    bool CiCustomSymbol::Clone(const string _src_symbol,const ulong _from_msc=0,const ulong _to_msc=LONG_MAX)
    
     
    Denis Kirichenko:

    Ajustamos ligeiramente o método de clonagem para permitir o carregamento de uma determinada parte do histórico. Caso contrário, se houver muitos ticks, isso consumirá muita RAM.

    Eu o atualizei levando em conta seu comentário, obrigado.

     

    Também criei dois métodos para carregar um histórico personalizado de um arquivo. Digamos que haja 2 arquivos com ticks e minutos. A tarefa é carregá-los no banco de dados de ticks e cotações do símbolo selecionado.

    bool              LoadTicks(const string _src_file_name);
    bool              LoadRates(const string _src_file_name);
     
    Denis Kirichenko:

    Também criei dois métodos para carregar um histórico personalizado de um arquivo. Digamos que haja 2 arquivos com ticks e minutos. A tarefa é carregá-los no banco de dados de ticks e cotações do símbolo selecionado.

    Portanto, o formato não é definido no caso geral.

     
    fxsaber:

    Portanto, o formato não é definido de forma geral.

    Sim, mas precisamos pensar sobre isso. Mas eu tenho arquivos de ticks com um formato especificado e, por enquanto, eu o criei. Bastante simples: <DATE>,<TIME>,<BID>,<ASK>.