EA com Meta batida - Backtest - Resultado de lucro/prejuízo atrasado em relação ao saldo da conta

 

Prezados, espero que possam me ajudar...

Confessando inicialmente que sou recém chegado nesse interessante universo da escrita de EA (o que confesso estou fascinado), gostaria de pedir ajuda à comunidade.

Basicamente o meu EA para daytrade (que vai operar dentro do mercado financeiro brasileiro) está pronto, faltando somente a parte de parar as atividades quando bater as metas diárias de gain e loss. Eu inserir o seguinte bloco:

void OnTradeTransaction()

   {                   
      string   ordem_simbolo;      
      double   ordem_lucro;
      ENUM_DEAL_TYPE ordem_tipo;
      
      saldo = 0;   // Variável está declarada no início

      HistorySelect((TimeCurrent() - (TimeCurrent() % 86400)),TimeCurrent());  // (TimeCurrent() % 86400) para pegar o início do dia
            
      deals_total = HistoryDealsTotal();
      
      for(int m = deals_total - 1; m > 0; m--)
         {            
               ordem_ticket  = HistoryDealGetTicket(m);
               
               if (ordem_ticket >= 0)
                     {
                        ordem_lucro   = HistoryDealGetDouble  (m, DEAL_PROFIT);
                        ordem_simbolo = HistoryDealGetString  (m, DEAL_SYMBOL);                       
                        
                        if(ordem_simbolo == Symbol()) 
                           {
                              saldo = ordem_lucro + saldo;
                           }
                                                                                         
                     }            
         }         
         
      if (metagain != 0 && saldo >= metagain)   // Se metagain for zero, significa que não se quer meta diária (ganância mode ON)
         {
            metabatida = true;      // metabatida é um bool para alimentar outra void que checa também outras variáveis para operar
         }  
   
      if (metaloss != 0 && saldo <= (metaloss * (-1)))  // Inversão de sinal, para o campo ser alimentado com numero positivo no #input
         {
            metabatida = true;          
         }
        
   }


Pois bem, no void OnTick tenho um comment que pega o valor do saldo e mostra na tela, para monitoramento (apenas nessa fase de desenvolvimento). Foi nesse momento que percebi que o resultado está desconsiderando as duas últimas operações fechadas. Exemplo:

1o trade: lucro de R$ 100,00

2o trade: prejuízo de R$ 20,00

3o trade: prejuízo de R$ 100,00

4o trade: lucro de R$ 200,00


Assim, embora apareça no histórico do backtest (com o gráfico ainda em execução, pois o dia não acabou naquela simulação), o lucro de R$ 180,00, no resultado do comment aparece como lucro de R$ 80,00. Ou seja, desconsiderou os trades 3 e 4... Se aparecer uma 5a transação, ele considera os trades 1 a 3, e assim sucessivamente.

Imaginei que o ticket do deal estava descompassado por considerar a adição automática de fundos como ticket 1, embora o total deals seja zero, tentando ajustar os valores do HistoryDealsTotal, mas sem sucesso algum. 

Enfim, gostaria que me ajudassem a mostrar onde estou errando, pois não consigo enxergar (perdi as contas de quantas tentativas fiz nessa parte, sem evolução alguma, seja nos resultados finais, seja - principalmente - na aquisição de conhecimento).

Nota: gostaria que o EA pegasse o lucro de cada ativo que irá operar, e não o saldo geral da conta, uma vez que desejo que, em rodando o mesmo EA para vários ativos, cada um tenha sua meta diária.

 

Acredito que um dos erros deve ser isso for(int m = deals_total - 1; m > 0; m--)

supondo que vc tenha 10 operações, como vc fez deals_total -1 , então será 10-1= 9... o outro ponto é o m>0 ou seja ele não irá contar outra operação então de 10 ele irá ver 8 operações apenas, reveja seu laço for para ver se está do jeito que realmente quer

 

Era isso mesmo...

Eduardo Oliveira:

Acredito que um dos erros deve ser isso for(int m = deals_total - 1; m > 0; m--)

Revisei a forma de condução do loop "for", seu operador e entendi seu apontamento, retificando-o. Também revisei dentro do operador do loop, e entendi como são tratados esses dados em função da entrada.

Está funcionando a contento, podendo prosseguir com as próximas etapas do desenvolvimento do meu EA.

Perdoe-me me pelo parco argumento carecendo de vocábulos mais técnicos. 

Meu sentimento de gratidão a você, pela ajuda prestada, não tem como ser descrita.

 

Bom dia,

vou dar dois pitacos no seu código.

1) O comando correto para obter dados do deal.

ordem_lucro= HistoryDealGetDouble(ordem_ticket, DEAL_PROFIT);

ordem_symbol= HistoryDealGetString(ordem_ticket, DEAL_SYMBOL);


2) Uma sugestão: use os nomes corretos para variáveis, pois ordem, posição e deal tem contexto diferente. No exemplo você está um dos DEAL(s) referente a uma POSIÇÃO que é o resultado de uma ou centenas de ORDENS(*).


(*) modo NETTING

 
Rogerio Giannetti Torres:

Bom dia,

vou dar dois pitacos no seu código.


Bom dia,

Obrigado pelos pitacos. Fiz conforme orientação em ambos.

Realmente tem razão quanto ao segundo. Eu percebi ontem, tarde da noite, e já estava com a paciência esgotada, e caiu no esquecimento de revisar.

Muito obrigado pelas sugestões.