Discussão do artigo "Desenvolvendo um EA multimoeda (Parte 2): Transição para posições virtuais de estratégias de trading" - página 2

 
Yuriy Bykov #:

Ainda não considerei essa opção, mas terei em mente que ela também é possível. No entanto, se eu conseguir encontrar um bom conjunto de Expert Advisors prontos no mercado, como posso usá-los juntos? Basta executar todo o conjunto com os parâmetros MM selecionados?

Sim.

 

Yuriy Bykov #:

Estou acostumado com as funções de negociação do MT5.

Sou bom nelas, mas desisti delas por esse motivo.

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

Discussão do artigo "Developing a multicurrency Expert Advisor (Part 2): Passando para estratégias de negociação de posições virtuais"

fxsaber, 2024.02.07 01:03 pm

Escolha com cuidado a API de negociação para negociação virtual. Escolha entre as disponíveis. É lógico dar preferência à API, na qual é o mais fácil possível programar o TS. Eu realmente não entendo a prática comum de todas as plataformas de negociação de inventar sua própria bicicleta - API de negociação. Para dotá-la de entidades OOP "prontas para uso", etc. Nesse sentido, o MQ seguiu um bom caminho - todas as APIs sem OOP.

 
fxsaber #:

O conceito em si é bom para a negociação real. Mas, para o sincronizador, você terá que manter o histórico da negociação virtual. Muitas coisas. Um caminho sério, para dizer o mínimo.

Aqui eu não entendo por que, para a negociação real, você teria que manter um histórico de negociação virtual. Talvez tenhamos uma interpretação um pouco diferente de "virtualidade". Eu simplesmente não me deparei com a necessidade de manter um histórico, pois sempre tenho posições virtuais sincronizadas com as reais, e não há possibilidade de desativar a sincronização por um tempo (ainda não?).

 
Onde posso obter o arquivo do EA para testá-lo?
 
fxsaber #:

Arquitetonicamente, a virtualização seria desacoplada do TC.

Ou seja, o TS usa funções de negociação comuns, como OrderSend(), e nós usamos nossa biblioteca para substituí-las para usar posições virtuais?

 
fxsaber #:

Escolha cuidadosamente uma API de negociação para negociação virtual. Escolha entre as disponíveis. É lógico dar preferência à API na qual seja o mais fácil possível programar o TS.

Vi que, de fato, desde o final de 2021, já uso minha API para negociação virtual do meu TS. É claro que me acostumei a implementar tudo o que preciso nela, usando apenas dois métodos comuns para posições e ordens pendentes - Open() e Close().

Mais uma vez, sinto muito por não ter encontrado sua biblioteca virtual a tempo.)

 
summertop #:
Onde posso obter o arquivo do EA para testar?

Há uma lista de arquivos anexados no final do artigo

 
Yuriy Bykov #:

Aqui eu não entendi por que você teria que manter um histórico de negociação virtual para a negociação real. Talvez tenhamos uma interpretação um pouco diferente do conceito de "virtualidade". Eu simplesmente não me deparei com a necessidade de manter um histórico, pois sempre tenho posições virtuais sincronizadas com as reais, e não há possibilidade de desativar a sincronização por um tempo (ainda não?).

Exemplo.

  1. Virtual e real sincronizados com uma posição e sua retirada.
  2. O tique atingiu o takeout: na posição virtual, ele foi acionado; na posição real, o takeout foi reacionado (limitador).

É impossível fechar uma posição real com uma ordem a mercado porque não há posições no mercado virtual (por exemplo, rollover, grande deslizamento em uma ordem a mercado).

O preço não tocou o takei novamente, mas foi na direção oposta. Parece que é possível manter um take take no histórico de uma posição fechada em uma conta virtual. Mas o preço pode nunca chegar a ele. Então, por quais níveis devemos sincronizar?

E então aparece um terminal virtual que sempre negocia - ele tem um núcleo de sinal. E ele é necessário apenas para fechar posições penduradas no mercado real.

Em geral, esse é um tópico importante. Tenho três kernels virtuais para sincronização com o real:

  1. O kernel que negocia com restrições de tempo - não sincroniza com o real.
  2. O BestInterval é enviado para a primeira virtualização. - Ela é sincronizada com o real para abrir posições.
  3. O kernel que negocia sem restrições de tempo (sempre em negociação) - sincronizado com o real para fechar posições.

 
Yuriy Bykov #:

Ou seja, o TS usa funções de negociação normais, como OrderSend(), e nós usamos nossa biblioteca para substituí-las para usar posições virtuais?

Sim, esse princípio não exige a reescrita de nada no TS, porque o TS não sabe onde negocia. Seu código não é alterado para que ele possa negociar em diferentes posições virtuais ou reais.

 
fxsaber #:

As entradas são um bom exemplo. Cada parâmetro de entrada deve ser escrito cinco ou seis vezes.

Fiz a refatoração por entradas. Algumas partes do código resultante para o exemplo.

//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));

   // Adicionar uma instância da estratégia
   expert.Add(new CSimpleVolumesStrategy( symbol_, inStrategyInput + inSimpleVolumesStrategyInput));

   return(INIT_SUCCEEDED);
}
   InputBase.fixedLot = NormalizeDouble(0.01 / 0.16 * depoPart_, 2);
   const double Array0[] = {13, 0.3, 1.0, 0, 10500, 465, 1000, 3};
   strategies[0] = new CSimpleVolumesStrategy("EURGBP", InputBase + Input[Array0]);
//+------------------------------------------------------------------+
//| Construtor|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy( string p_symbol, const string sInputs ) : CStrategy(p_symbol, sInputs)
{
   this.Input = sInputs;

   ArrayResize(m_orders, this.Input.maxCountOfOrders);

   // Carregar o indicador para obter volumes de ticks
   iVolumesHandle = iVolumes(m_symbol, this.InputStrategy.timeframe, VOLUME_TICK);

// Defina o tamanho da matriz receptora de volumes de ticks e o endereçamento necessário
   ArrayResize(volumes, this.Input.signalPeriod);
   ArraySetAsSeries(volumes, true);
}
Arquivos anexados: