Bibliotecas: Symbol - página 4

 

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

Aprendizado de máquina na negociação: teoria e prática (negociação e não apenas)

fxsaber, 2018.04.15 16:31

Vamos criar um símbolo personalizado com a distribuição de ticks correta e escrever um TC grail. Vamos fazer um backtest e postar o resultado.

// Exemplo de criação de um caractere personalizado a partir de ticks gerados

#property script_show_inputs

input string SymbName = "TESTER";

#include <fxsaber\ThirdPartyTicks\CustomSymbol.mqh> // https://www.mql5.com/pt/code/20225

// Geração do histórico de ticks com a propriedade necessária - exemplo técnico
int GetTicks( MqlTick &Ticks[], const int Amount = 1 e5 )
{
  static const MqlTick NullTick = {0};
  
  const int Size = ArrayResize(Ticks, Amount);
  
  long time = (TimeCurrent() - 7 * 24 * 3600) * 1000;
  
  for (int i = 0; i < Size; i++)
  {
    Ticks[i] = NullTick;
    
    const double Price1 = NormalizeDouble(MathRand() / 1000.0, 3);
    const double Price2 = NormalizeDouble(MathRand() / 1000.0, 3);
    
    Ticks[i].bid = MathMin(Price1, Price2);
    Ticks[i].ask = MathMax(Price1, Price2);
    
    time += MathRand();
    
    Ticks[i].time_msc = time;
    Ticks[i].time = (datetime)(time / 1000);
  }
  
  return(Size);
}

void OnStart()
{  
  CUSTOMSYMBOL Symb(SymbName); // Criou um símbolo

  if (Symb.IsCustom())
  {
    Symb.SetProperty(SYMBOL_TRADE_STOPS_LEVEL, 0);    

    // Tornar as moedas do símbolo a moeda da conta
    Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY));
    Symb.SetProperty(SYMBOL_CURRENCY_BASE, AccountInfoString(ACCOUNT_CURRENCY));

    // Para calcular o lucro
// Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);
// Symb.SetProperty(SYMBOL_TRADE_TICK_SIZE, Symb.GetProperty(SYMBOL_POINT));
    
    MqlTick Ticks[];
    
    GetTicks(Ticks); // Formou um histórico de ticks
    
    if ((Symb.AddTicks(Ticks) > 0) && (Symb.DataToSymbol() > 0) && Symb.On()) // Enviar histórico de ticks para o símbolo
      ChartOpen(Symb.Name, PERIOD_CURRENT); // Abriu o gráfico
  }
}

Nesse script, precisamos escrever apenas nosso próprio GetTicks. Com base no histórico gerado, teremos um símbolo (personalizado) quase completo disponível para negociação no testador.


 
fxsaber:

Outro cenário de uso de símbolos personalizados (não necessariamente com a ajuda dessa biblioteca).


É possível automatizar totalmente o backtest regular do Expert Advisor em dados históricos recentes e transferir os resultados do teste para o Expert Advisor de combate para sincronizar a imagem real com o testador. Isso permite que você implemente essa lógica de negociação sem escrever seu próprio testador


Outra possibilidade de usar esse esquema:

Uma versão demo gratuita do Consultor Especialista do Mercado é obtida e perseguida no testador por novas cotações, a copiadora obtém dados do resultado do testador. Dessa forma, a versão paga não é necessária.


Talvez seja necessário proibir o backtest de Expert Advisors do Mercado em símbolos personalizados....

// Incluir o dia atual no backtest
#property script_show_inputs

#include <Symbol.mqh> // https://www.mql5.com/pt/code/18855

input int Offset = -24 * 7; // Deslocamento em horas

#define  HOUR 3600

void OnStart()
{
  const SYMBOL Symb(_Symbol + "_Offset" + (string)Offset); // Criou um símbolo

  if (Symb.IsExist()) // Se o símbolo for criado
  {
    Symb.CloneProperties(); // Copiou as propriedades
    
    MqlRates Rates[];

    // Tempos de barra deslocados
    for (int i = CopyRates(_Symbol, PERIOD_M1, 0, (int)SeriesInfoInteger(_Symbol, PERIOD_M1, SERIES_BARS_COUNT), Rates) - 1; i >= 0; i--)
      Rates[i].time += Offset * HOUR;
      
// Symb.CloneTicks(Ticks);

    // Registre as barras de deslocamento e inclua o símbolo no Market Watch
    if ((Symb.CloneRates(Rates) > 0) && Symb.On())
      ChartOpen(Symb.Name, PERIOD_CURRENT); // Abriu um novo gráfico de símbolos
  }
}

MT5 Build 1880 - funciona até agora.

 

Duas maneiras de definir derrapagens no testador

  1. Inserir pseudo-ticks (preços degradados pelo valor do slippage) entre os ticks reais. Então, ticks ímpares - análise, ticks pares - negociação.
  2. Análise por um símbolo real, negociação - por um símbolo personalizado. Personalizado - deterioração do símbolo real pelo valor de slippage.

 

ótima biblioteca, mas, e eu cito.

Andrey Khatimlianskii:

Obrigado! Como sempre, um pouco mais complicado do que eu gostaria ;)

Seus códigos têm uma vantagem inegável: eles podem ser pegos e usados. Mas é muito difícil ajustar qualquer coisa neles, isso é uma desvantagem.

É muito conveniente que, com uma linha, eu crie uma cópia totalmente pronta de um símbolo personalizado, mas..:

diga-me como criar seu próprio símbolo usando sua biblioteca, mas não para copiar dados históricos - quero modificar o OHLC e não quero estragar seu código ))), agradeço antecipadamente!

 
E eu me pergunto por que são necessários símbolos personalizados? Se os símbolos reais disponíveis no DC são negociados?
 
Viktar Dzemikhau:
E eu me pergunto por que são necessários símbolos personalizados? Se os símbolos reais disponíveis no DC são negociados?

Eu desenvolvo o pensamento de dickfix, como "nem sempre é possível usar qualquer símbolo para negociação automática, se o EA não funcionar com esse símbolo, talvez ele precise de outro símbolo ou usar gráficos personalizados".

Há uma certa lógica nisso.

;)

 
Igor Makanu:

Estou desenvolvendo o pensamento de dickfix, como "que nem sempre é possível usar qualquer símbolo para negociação automática, se o EA não funcionar com esse símbolo, talvez ele precise de outro símbolo ou usar gráficos personalizados".

Há uma certa lógica nisso.

;)

Isso é besteira. Que diferença faz qual é o símbolo? Se o símbolo for real, ele poderá ser acessado. Tenho minha própria classe de símbolo. O único membro necessário da classe é o nome do instrumento negociado. Você insere outro instrumento e eu obtenho todos os dados necessários. Então me perguntei, depois de entrar neste tópico, por que um símbolo personalizado? Se ele pode ser negociado, seu nome é tal e tal, e se não pode ser negociado... como não pode?
 
Viktar Dzemikhau:
Se ele pode ser negociado, seu nome é fulano de tal, e se não pode ser negociado... como não pode ser negociado?

Por que não pode ser negociada? O Expert Advisor funcionará no testador de estratégia, portanto, você pode usar o otimizador... o que significa que você pode procurar padrões.

Como dizem, cada um tem seu próprio caminho - se você acha que pode armazenar dados em uma classe, fique à vontade. Para mim, é mais fácil gerar dados em um símbolo personalizado e depois usar indicadores nesse gráfico.

Aqui está o spread EURUSD - GBPUSD de meus sintéticos.

https://charts.mql5.com/18/849/spread-h1-alpari-international-limited.png

É muito conveniente que você possa ver visualmente o gráfico e analisar o tempo das barras e, além disso, há todos os TFs e você pode executar uma estratégia no testador de estratégias, e não é um problema voltar aos símbolos reais.

 
Igor Makanu:

Por que não? No testador de estratégia, o Expert Advisor funcionará, portanto, você poderá usar o otimizador... o que significa que você pode procurar padrões.

Se você acha que os dados podem ser armazenados em uma classe, vá em frente; para mim, é mais fácil enviar os dados para um símbolo personalizado e depois usar indicadores nesse gráfico.

É claro que sim. Afinal de contas, no 5 você pode acessar diferentes ferramentas a qualquer momento. E escrever uma classe para cada ferramenta é uma redundância. É como se tivéssemos formas, e não usássemos a classe de forma básica, mas sempre escrevêssemos uma nova. Não estou criticando, é claro. O fxsaber escreve coisas bastante competentes às vezes. E ele sabe mais, aparentemente ele precisa disso. Mas acho que isso é desnecessário.


Igor Makanu:

Por que não? Um Expert Advisor funcionará no testador de estratégias, portanto, você pode usar o otimizador... o que significa que você pode procurar padrões

Se você acha que os dados podem ser armazenados em uma classe, fique à vontade. Para mim, é mais fácil gerar dados em um símbolo personalizado e usar indicadores nesse gráfico.

Aqui está um esboço do spread EURUSD - GBPUSD a partir de meus sintéticos.

https://charts.mql5.com/18/849/spread-h1-alpari-international-limited.png

É muito conveniente que você possa ver visualmente o gráfico e analisar o tempo das barras e, além disso, há todos os TFs e você pode executar uma estratégia no testador de estratégias, e não é um problema voltar aos símbolos reais.

Se eu soubesse o que isso proporcionaria, talvez tivesse apoiado essa ideia. Mas, do jeito que está...)))

 
Igor Makanu:

Por favor, diga-me como criar seu próprio símbolo usando sua biblioteca, mas não para copiar dados históricos - quero modificar o OHLC e não quero estragar seu código ))), desde já agradeço!

Acima está um código curto. Há comentários detalhados aqui.