MEU EA DEIXA O GRÁFICO LENTO - página 2

 
northedan:

Rogério agora tá uma bala. O problema agora é como faço pra zerar a variável resultado a cada novo dia?



#s3gt_translate_tooltip_mini { display: none !important; }

Bem,  faça a seu gosto mas basta colocar no OnTick() um teste.

int OnTick()

...

   if (NovoDia()) resultado=0;


Comentário sobre o código.

HistorySelect(StringToTime("09:00"),TimeCurrent());  //  Desnecessário, pois você não vai varrer o histórico transações
use 
HistoryDealSelect(trans.deal);  // Seleciona histórico da transação que acabou de acontecer para uso seguinte.


// O resultado deu certo, porque para DEAL_ENTRY_IN o profit é igual a zero
// mas o correto é não ler o DEAL_ENTRY_IN

if(trans.type==TRADE_TRANSACTION_DEAL_ADD && GAIN_DIARIO > 0 || LOSS_DIARIO > 0 
&& deal_magic == MagicNumber && deal_symbol == _Symbol && (ENUM_DEAL_ENTRY)deal_entry!=DEAL_ENTRY_IN)  
 
northedan:

Rogério agora tá uma bala. O problema agora é como faço pra zerar a variável resultado a cada novo dia?



#s3gt_translate_tooltip_mini { display: none !important; }



ola , Existe varias formas de fazer isso , todas chegando ao resultado esperado ,..por tanto darei uma ideia que implementei.


todo ontick(), todos os programadores pegam o ultimo valor do preco, por tanto tenho a informacao do time do tick.


1 - Coloque ele dentro de uma Variavel MqlDatetime x;

2 - Crie uma variavel DIA, qdo ela for diferente , vc zera seu saldodiario, e atualiza a variavel DIA


if (DIA != x.day ) 

{

DIA=x.day;

SALDODIARIO=0;


}

Espero ter ajudado e boa sorte


Att

Sandro Lobo

 
Joscelino Celso de Oliveira:

Minha sugestão: transforme "resultado" em variável global.

Cabe o teste mas acredito que funcione. Tenho variáveis parecidas em meu código.

[ ]'s

Já fiz isso e não deu certo. Vou deixar executando no OnTick...é o jeito. Eu ia até criar outro tópico , mas deixa pra lá.
 

Boa tarde!

Bacana a contabilização, muito importante, compartilhando, eu uso a seguinte estratégia:

- contabilizo no init

- contabilizo ao iniciar cada novo dia

- toda posição aberta eu acompanho pelo tickt para iniciar algumas ações caso preveja na estratégia (revisão entrada ajustando tp/sl, break even, trailing stop, saida por prazo ou sinal, etc), quando a posição é encerrada, chamo a função para contabilizar pelo ontick filtrando a estratégia da ordem encerrada.

- para toda entrada sempre tenho a sequencia atual (quantos gain ou loss seguidos)


Abraços

Daniel

 
if(PositionSelectByTicket(TmpTictPosicao)==true) //false se posição inesistente

Retornado true a posiação esta aberta, false é que ja fechou, assim aciono a contabilização.

Quando entro, coleto o ticket

Após a saída, zero o numero do tick da variável

Só executo o código quando a variável do tickt é diferente de zero.


Att.

Daniel

 
Daniel Andrejczuk:

Retornado true a posiação esta aberta, false é que ja fechou, assim aciono a contabilização.

Quando entro, coleto o ticket

Após a saída, zero o numero do tick da variável

Só executo o código quando a variável do tickt é diferente de zero.


Att.

Daniel

Boa tarde... O código que não consigo verificar o novo dia é esse abaixo, eu tinha apagado ele. Eu percibi q esse código não contabiliza o primeiro deal do dia e também não sei como fazer com que zere a contagem a cada novo dia.


//+------------------------------------------------------------------+

void  OnTradeTransaction( 
   const MqlTradeTransaction&    trans,        // estrutura das transações de negócios 
   const MqlTradeRequest&        request,      // estrutura solicitada 
   const MqlTradeResult&         results        // resultado da estrutura 
   )
{  
   if(HistoryDealSelect(trans.deal))
   {  
      double resultado = 0.0;
      
      ulong deal_magic = HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
      string deal_symbol = HistoryDealGetString(trans.deal,DEAL_SYMBOL);
      long deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
      
      HistorySelect(StringToTime("09:00"),TimeCurrent());
      if(trans.type==TRADE_TRANSACTION_DEAL_ADD && GAIN_DIARIO > 0 || LOSS_DIARIO > 0 && deal_magic == MagicNumber 
         && deal_symbol == _Symbol && deal_entry==DEAL_ENTRY_OUT)
      {  
         double results = HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
         resultado += results;
         printf(resultado);
         if(resultado > GAIN_DIARIO && GAIN_DIARIO !=0)
         {
            printf("Meta batida");
            //trade_money = false;
            //resultado = 0.0;
         }
         else if(resultado < (LOSS_DIARIO*-1) && LOSS_DIARIO != 0)
         {
            printf("Stop atingido");
            //trade_money = false;
            //resultado = 0.0;
         }
      }
   }   
}
 
northedan:

Boa tarde... O código que não consigo verificar o novo dia é esse abaixo, eu tinha apagado ele. Eu percibi q esse código não contabiliza o primeiro deal do dia e também não sei como fazer com que zere a contagem a cada novo dia.


Boa tarde,

Eu uso como expliquei acima, a contabilização no ontick.

Para verificar um novo dia, uso:

if(((di03_data_pregao.day != di03_data_b.day) || (di03_data_pregao.mon != di03_data_b.mon) || (di03_data_pregao.year != di03_data_b.year))


Na questão do período inicial, comparando como faço, tente montar a hora inicial parecido, faça um teste no seu código

Onde você utiliza "09:00" para data inicial: HistorySelect(StringToTime("09:00"),TimeCurrent());

Uso uma variável que componho por:

di03_data_padrao_contabilizar = string(di03_data_pregao.year) + "." + string(di03_data_pregao.mon) + "." + string(di03_data_pregao.day) + string(" 00:00:01");


Abraço

Daniel

 
Rogerio Giannetti Torres:

Bem,  faça a seu gosto mas basta colocar no OnTick() um teste.

int OnTick()

...

   if (NovoDia()) resultado=0;


Comentário sobre o código.

Obg. Agora está contabilizando os DEALS corretamente. Estou aqui tentando zerar o resultado a cada novo dia.
 
sandrolho:



ola , Existe varias formas de fazer isso , todas chegando ao resultado esperado ,..por tanto darei uma ideia que implementei.


todo ontick(), todos os programadores pegam o ultimo valor do preco, por tanto tenho a informacao do time do tick.


1 - Coloque ele dentro de uma Variavel MqlDatetime x;

2 - Crie uma variavel DIA, qdo ela for diferente , vc zera seu saldodiario, e atualiza a variavel DIA


if (DIA != x.day ) 

{

DIA=x.day;

SALDODIARIO=0;


}

Espero ter ajudado e boa sorte


Att

Sandro Lobo

Não entendi. Quando crio a variável x.day e dou um printf o resultado é 0. Outra coisa a variável DIA precisa ser do tipo datetime?
 

Bom dia @northedan

já tem várias dicas aqui para testar novo dia e zerar o saldo diário.  Qual é a sua dúvida? 

Razão: