Teste de fundo de EA Multimoedas - página 3

 

Eu queria publicar isto naquela época, mas fiquei horrível na primeira página:

Lógica de um Portfólio EA

 

Oi pessoal e garotas,

Também me deparei com este assunto há algum tempo e discutimos aqui: https://www.mql5.com/en/forum/1642

Minha EA tem uma estratégia de preços apenas abertos e eu queria me ater a isso para economizar tempo durante os testes de retaguarda (obviamente).

A solução que eu concebi é a seguinte:

  1. use o par mais ativo durante o período principal de negociação de sua EA como o "condutor" (o gráfico que produz os carrapatos).
  2. em cada onTick() verifique se seu motorista entrou em uma nova barra
    1. se não houver um novo bar, espere um pouco mais
    2. se houver uma nova barra, distribua a mensagem OnTick() para seus comerciantes individuais (cada comerciante é responsável por um par de moedas)
  3. no trader verificar se a última vez do par de moedas do trader é igual ao "tempo da nova barra" do motorista
    1. se sim, você pode continuar como normalmente
    2. se não, você tem que tratar o preço de fechamento do bar atual como o preço de abertura que você está procurando e se você está procurando informações de bares anteriores leve em conta esta situação "por um".

Vou cortar e colar as seções importantes do código do meu EA aqui abaixo. Espero que isto seja de alguma ajuda para vocês!

Abraço!


// this is from the Trader base class

    // manage a new tick and predetermines whether a new bar hast started
    virtual void onTick() {
        MqlRates rates[1];
    
        // check the rates of the tick stream we're attached to (_Symbol!!!)
        if (CopyRates(_Symbol, _period, 0, 1, rates) != 1) {
            Print("CopyRates of ", _Symbol, " failed");
            return;
        }

        if (_newBar = (rates[0].time != _currBarTime)) {
            _prevBarTime = _currBarTime;  // remember the previous bar time
            _currBarTime = rates[0].time;  // remember the current bar time
        }

    }


// this is the actual trader for a specific currency pair

    // checks whether a new trade (closing or opening) is to be performed
    void checkForTrade(void) {    
    
        MqlRates rates[3];

        if (CopyRates(_symbol, _period, 0, 3, rates) != 3) {
            Print("CopyRates of ", _symbol, " failed");
            return;
        }

        bool inSameBar = (rates[2].time == _currBarTime);  // _currBarTime determined in OnTick()!


        double sBuf[3];  // signal buffer! 2: current bar, 1: previous bar, 0: current - 2 

        if (CopyBuffer(_ind, SIGNAL3, 0, 3, sBuf) != 3) {
            Print("copy signal from indicator failed, no data");
            return;
        }    
        
        
        // first close exiting orders
        double v0 = inSameBar ? sBuf[0] : sBuf[1];  // determine the actual 'previous' bar
        double v1 = inSameBar ? sBuf[1] : sBuf[2];  // determine the actual 'current' bar
        
        if (_volume > 0) {
            if (crossesZeroDownwards(v0, v1)) {  // cross down?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        } else if (_volume < 0) {
            if (crossesZeroUpwards(v0, v1)) {  // cross up?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        }

        ...
Tick generation - Open bar only
  • www.mql5.com
The whole list printed shows also many discrepancies in times.
 

Eu mesmo acabei de me deparar com este problema. Você adivinhou, tentando portar da JForex para a MQL5! Estou começando a desejar não ter me incomodado, embora suponho que a prorrogação do prazo ajude :)

Parece que a MetaQuotes ainda não a consertou.

O MT5 não parece suportar o DOM.

isNewBar não vai me ajudar.

Parece um estado de coisas ridículo.

Alguém sabe se alguma coisa mudou dentro do MT5 em relação a esta questão?

Alguém sabe de uma solução que funciona para uma estratégia de múltiplas moedas que está esperando ser alimentada com carrapatos?

A sua em frustração,

Jim

 
TradingGurus:

Eu mesmo acabei de me deparar com este problema. Você adivinhou, tentando portar da JForex para a MQL5! Estou começando a desejar não ter me incomodado, embora suponho que a prorrogação do prazo ajude :)

Parece que a MetaQuotes ainda não a consertou.

O MT5 não parece suportar o DOM.

isNewBar não vai me ajudar.

Parece um estado de coisas ridículo.

Alguém sabe se alguma coisa mudou dentro do MT5 em relação a esta questão?

Alguém sabe de uma solução que funciona para uma estratégia de múltiplas moedas que está esperando ser alimentada com carrapatos?

A sua em frustração,

Jim


Tente usar OnTimer() com temporizador de 1 segundo em vez de OnTick().
 

Oi, viva,

enivid:
Tente usar OnTimer() com temporizador de 1 segundo em vez de OnTick().

Obrigado pela sugestão. Sua solução funciona muito melhor que qualquer uma das outras que tentei, certamente para nossas exigências.

No entanto, a execução de testes com múltiplas moedas contra diferentes pares ainda produz resultados ligeiramente diferentes.

Não inspira muita confiança!

Estou indo para queimar muito mais óleo à meia-noite agora!

Abraço,

Jim

 
enivid:
Tente usar OnTimer() com temporizador de 1 segundo em vez de OnTick().

TradingGurus:

No entanto, a execução de testes com múltiplas moedas contra diferentes pares ainda produz resultados ligeiramente diferentes.

Jim, eu uso a solução OnTimer com 1 segundo na minha carteira de concursos EA. Se sua estratégia depende de cada tick, então sim, você terá resultados diferentes ao usar OnTimer vs OnTick em uma única moeda, já que mais de um tick por segundo é possível. Descobri que normalmente faz mais diferença quando o tick "faltando" cria uma nova barra alta ou baixa. Você pode verificar a barra anterior alta/baixa e a barra atual alta/baixa para detectar qualquer mudança e inseri-la como "falta" quando elas ocorrem, a menos, é claro, que o tick atual tenha criado a nova barra alta/baixa.

Lembre-se também que o MetaTrader Strategy Tester apenas simula os dados do tick. Dependendo de quão sensível sua estratégia é ao movimento do tick, esta simulação pode ter um impacto significativo nos testes de retaguarda em relação aos testes de avanço.

- Patrick

 
Oi Patrick,
Pix:

Se sua estratégia depende de cada tick, então sim, você obterá resultados diferentes ao usar OnTimer vs OnTick em uma única moeda, já que mais de um tick por segundo é possível.

- Patrick


Não era bem isso que eu queria dizer. Nosso (ainda só potencial!) concurso EA comercializa todos os 12 pares. Usando apenas OnTimer(), obtenho resultados diferentes se selecionar GBP/USD em testador de estratégia ao invés de EUR/USD, por exemplo.

Estou muito familiarizado com as limitações do MT4 quando faço backtest usando carrapatos simulados. Infelizmente, parece que o MT5 não é muito melhor!

Jim

 

Estávamos extremamente interessados em fazer tudo isso com carrapatos por razões históricas, mas desistimos. Simplesmente, não conseguimos fazer as coisas consistentes.

Mordemos a bala e agora estamos trabalhando com barras de 1 minuto com a ajuda do OnTimer() e do isNewBar().

As coisas começaram a parecer vagamente sensatas finalmente, e o que é mais, ainda faltam 4 horas para o prazo final do campeonato :)

Jim
 

Finalmente, submetemos nossa EA com cerca de 5 minutos de antecedência ao prazo.

Um backtest sob sua correia, e nenhuma otimização.

Nunca tendo feito isto antes, alguém pode me dizer se ainda tem uma chance de ser aprovado?

Se sim, seremos autorizados a mexer nas configurações de entrada durante a próxima semana, ou não?

Jim

 
TradingGurus:

Finalmente, submetemos nossa EA com cerca de 5 minutos de antecedência ao prazo.

Um backtest sob sua correia, e nenhuma otimização.

Nunca tendo feito isto antes, alguém pode me dizer se ainda tem uma chance de ser aprovado?

Se sim, seremos autorizados a mexer nas configurações de entrada durante a próxima semana, ou não?

Jim

Boa Sorte Jim!

Se sua EA tiver testado corretamente dentro de 2010.01.01 até 2010.08.01 sem erros(erros comerciais, etc.) e sem lucro, então você provavelmente será aprovado, desde que suas informações pessoais também estejam corretas. Entretanto, você não poderá alterar nada a partir deste ponto, inclusive as configurações (parâmetros de entrada).

Espero ver seu bot em ação!

- Patrick