Zero Divide (Encontrou a questão - mas por quê?) - página 3

 
double loss_for_1_lot = pips_to_bsl/ ts * tv ;

NÃO é a televisão que resulta em um div 0. só pode ser ts. Em um corretor de 5 dígitos o ts pode imprimir zero (4 dígitos)

Parece-me que você nunca abriu aquele par para obter as informações de mercado de seu corretor antes de baixar o histórico de algum outro lugar.

 

Acho difícil acreditar que a divisão zero é gerada pelo código postado.

DomGilberto compilar este script e anexá-lo ao gráfico que você acredita estar retornando um tiquetaque zero.

int start()
  {
//----
   int i = Bars-1;
   int cnt;
   int tscnt = 0;
   int tvcnt = 0;
   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   while(i >=0)
   {if(ts < 0.00001) tscnt++;
    if(tv < 0.00001) tvcnt++;
    i--;
   }
   Alert("TickSize returned an erroneous value ",tscnt," times.");
   Alert("TickValue returned an erroneous value ",tvcnt," times.");
//----
   return(0);
  }
 
DomGilberto:

Espero que este vídeo que fiz (cerca de 40 segundos) ilustre do que estou falando ( como não tenho certeza se estou deixando claro ou não ).

Vídeo: http://screencast.com/t/uMHY5DpM

Você verá que a primeira parte quando eu solto o script no gráfico ao vivo (conta real) que o valor e o tamanho do tick retornam "0" naquela "conta nocional", que eu ilustro na janela de lotes (unidades).

A segunda parte é com o mesmo corretor, mas em uma alimentação baseada no lote e desta vez ele retorna um valor e tamanho do tick. Mais uma vez, eu ilustro que você negocia usando lotes....

Portanto, com relação ao testador de estratégia, não tenho idéia do porquê ele tem funcionado e às vezes não funciona. A conta foi conectada enquanto eu também realizo os testes de retaguarda (em uma conta nocional de demonstração (unidades)).

Minha próxima pergunta seria: se esta for a resposta típica que receberei da conta nocional federal, você pode sugerir como corrijo meu cálculo de tamanho de posição nesta circunstância? Funciona perfeitamente para uma alimentação baseada em lote... Espero que isso o explique um pouco melhor?

Se você estiver usando código diferente em seu código "teste", o que isso prova?

Você está ciente que o TICKVALUE retorna o valor atual a partir de agora . . . mesmo durante um Teste de Estratégia ? portanto, para qualquer par em que a moeda base não seja a moeda de depósito, ela estará incorreta e seus cálculos de lote estarão errados . .

 

Em seu vídeo, você usa GBPUSD na primeira instância e, em seguida, GBPJPY na segunda.

Acho que se você tivesse anexado seu script a um gráfico de lote normal em GBPUSD, você obteria um valor para tickvalue, mas o ticksize também seria zero.

Isto porque seus alertas de script estão usando duplo e, portanto, 0,00001 será impresso como 0.

Use DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8) em vez disso

 

Ok, em primeiro lugar, obrigado pela ajuda de todos.

Aqui está o vídeo para "Gumrai" e "SDC" confirmando o que ambos estão me pedindo para fazer. Etiquetei os scripts com seus pseudônimos MQL4, que obviamente correspondem ao seu código que você postou aqui. Vídeo: http://screencast.com/t/kglCd2hCae

O corretor e a alimentação correspondente não foram alterados durante a pausa. É também uma conta de alimentação nocional (unidades).

@RaptorUK: Sim, eu sabia que o TICKVALUE retornava o valor atual a partir de agora. Acho que sua segunda parte olhando para ele agora é meio lógica. Estou ficando confuso com a forma como sou capaz de utilizar o tick-value como parte de minha conta nocional de alimentação para ter certeza de que o dimensionamento da posição está correto...?

 
DomGilberto:

Ok, em primeiro lugar, obrigado pela ajuda de todos.

Aqui está o vídeo para "Gumrai" e "SDC" confirmando o que ambos estão me pedindo para fazer. Etiquetei os scripts com seus pseudônimos MQL4, que obviamente correspondem ao seu código que você postou aqui. Vídeo: http://screencast.com/t/kglCd2hCae

O corretor e a alimentação correspondente não foram alterados durante a pausa. É também uma conta de alimentação nocional (unidades).

@RaptorUK: Sim, eu sabia que o TICKVALUE retornava o valor atual a partir de agora. Acho que sua segunda parte olhando para ele agora é meio lógica. Estou ficando confuso com a forma como sou capaz de utilizar o tick-value como parte de minha conta nocional de alimentação para ter certeza de que o dimensionamento da posição está correto...?


Esses vídeos são uma dor, são muito grandes para a minha tela.

Por que não simplesmente postar o código do script e o resultado do alerta?

Eu não sei o que você colocou no script que deveria ser meu código sugerido, mas não há como ele resultar em "08".

Use

Alert("TICKVALUE= ",DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8));
Alert("TICKSIZE= ",DoubleToStr(MarketInfo(Symbol(),MODE_TICKSIZE),8));
 
DomGilberto:


@RaptorUK: Sim, eu sabia que TICKVALUE retornava o valor atual a partir de agora. Acho que a segunda parte de sua análise agora é meio lógica. Estou ficando confuso com a forma como sou capaz de utilizar o tick-value como parte da minha conta nocional de alimentação para ter certeza que o dimensionamento da posição está correto...?

Primeiro você tem que confirmar que o TICKVALUE está de fato retornando um resultado zero, o que você ainda não fez.
 
GumRai:


Esses vídeos são uma dor, são muito grandes para a minha tela.

Por que não simplesmente postar o código do roteiro e o resultado do alerta?

Eu não sei o que você colocou no script que deveria ser meu código sugerido, mas não há como ele resultar em "08".

Use


Desculpe - agora percebo que esqueci de colocar "DoubleToStr", erro meu!!

TickSize = 0.00100000

TickValue = 0,00001026

(Derrubado em GBPJPY notional feed)

@SDC eu simplesmente copiei seu código daqui e o coloquei em um novo script. Isso era o que estava sendo devolvido.

 
Ok nova atualização, eu brinquei com ela repetindo o local exato onde ocorre a divisão zero.

Esta área em meu código tenho-a imprimindo a fórmula para quebrar a matemática - Onde isto está acontecendo é em uma PEDIDO DE COMPRA... no entanto esta parte do código "pips_to_ssl" é pips para VENDER parar a perda... que NÃO está sendo usada para uma parada de compra pendente de ordem....

double loss_for_1_lot1 = pips_to_ssl/  ts * tv  ;
   if( loss_for_1_lot1 == 0.0 )Print(" ERROR - loss_for_1_lot1 = 0.0 || The formula for this is: ", pips_to_ssl,"/",ts,"*",tv);


2013.10.02 11:57:19     2001.02.12 16:00  Trend Fishing - V1 - Notional Lots USDJPYnb,H1:  ERROR - loss_for_1_lot1 = 0.0 || The formula for this is: 0/0.001*0.0001

double pips_to_ssl=SellStopPrice-sellPrice;
   if(pips_to_ssl == 0)Print(" ERROR - pips_to_ssl = 0 || The formula for this is: ", SellStopPrice,"-",sellPrice); 

2013.10.02 12:08:01	2001.02.12 16:00  Trend Fishing - V1 - Notional Lots USDJPYnb,H1:  ERROR - pips_to_ssl = 0 || The formula for this is: 117.249-117.249

 
DomGilberto:
Ok nova atualização, eu brinquei com ela repetindo o local exato onde ocorre a divisão zero.

Esta área em meu código tenho-a imprimindo a fórmula para quebrar a matemática - Onde isto está acontecendo é em uma PEDIDO DE COMPRA... no entanto esta parte do código "pips_to_ssl" é pips para VENDER parar a perda... que NÃO está sendo usada para uma parada de compra pendente de ordem....



Eu o remeto de volta ao meu posto anterior

"Note que

double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?

também resultará em zero se pips_to_bsl for zero. Isto é possível?".

bsl ou ssl, a mesma codificação.

Razão: