Zero Divide (Encontrado el tema - pero ¿por qué?) - página 3

 
double loss_for_1_lot = pips_to_bsl/ ts * tv ;

NO es tv lo que resulta en un div 0. sólo puede ser ts. En un corredor de 5 dígitos ts podría imprimir cero (4 dígitos)

Me parece que nunca abriste ese par para obtener la información de mercado de tu broker antes de descargar el historial de otro sitio.

 

Me resulta difícil creer que la división a cero sea generada por el código publicado.

DomGilberto compila este script y adjúntalo al gráfico que crees que devuelve un ticksize cero.

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 video que he hecho (40 segundos más o menos) ilustre lo que estoy hablando ( ya que no estoy seguro de si lo estoy dejando claro o no ).

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

Verás que la primera parte cuando suelto el script en el gráfico en vivo (cuenta real) que el valor del tick y el tamaño del tick devuelven "0" en esa "cuenta nocional", que ilustro en la ventana de lotes (unidades).

La segunda parte es con el mismo broker pero en un feed basado en lotes y esta vez devuelve un valor de tick y un tamaño de tick. De nuevo, ilustro que se opera con lotes....

Así que con respecto al probador de estrategias, no tengo ni idea de por qué ha estado trabajando y a veces no lo hace. La cuenta ha estado conectada mientras ejecutaba las pruebas retrospectivas también (en una cuenta demo nocional alimentada (unidades)).

Mi siguiente pregunta sería, si esta es la respuesta típica que obtendré de la cuenta alimentada nocional, ¿podrían sugerirme cómo corregir mi cálculo de tamaño de posición en esta circunstancia? Funciona perfectamente para una alimentación basada en lotes... Espero que eso lo explique un poco mejor.

Si está utilizando un código diferente en su código de "prueba" entonces ¿qué prueba?

¿Es usted consciente de que TICKVALUE devuelve el valor actual de ahora... incluso durante la ejecución de una prueba de estrategia? por lo que para cualquier par en el que la moneda base no sea la moneda de depósito será incorrecto y sus cálculos de lote serán erróneos...

 

En tu vídeo, utilizas GBPUSD en el primer caso y luego GBPJPY en el segundo.

Creo que si hubieras adjuntado tu script a un gráfico de lote normal de GBPUSD, obtendrías un valor para tickvalue, pero ticksize también sería cero.

Esto se debe a que sus alertas de script están utilizando dobles y por lo tanto 0.00001 se imprimirá como 0.

Utilice DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8) en su lugar

 

Ok en primer lugar, gracias por la ayuda de todos.

Aquí está el video de "Gumrai" y "SDC" confirmando lo que ambos me piden. He etiquetado los scripts con sus alias de MQL4, que obviamente se corresponden con el código que habéis colgado aquí. Vídeo: http://screencast.com/t/kglCd2hCae

El broker y el feed correspondiente no se ha modificado durante la pausa. Es una cuenta de feed nocional también (unidades).

@RaptorUK: Si, sabía que TICKVALUE devolvía el valor actual de ahora. Supongo que tu segunda parte viéndolo ahora es algo lógico. Me estoy confundiendo con la forma en que soy capaz de utilizar tickvalue como parte de mi cuenta de alimentación nocional para asegurarse de que el tamaño de la posición es correcta ...?

 
DomGilberto:

Ok en primer lugar, gracias por la ayuda de todos.

Aquí está el video de "Gumrai" y "SDC" confirmando lo que ambos me piden. He etiquetado los scripts con sus alias de MQL4, que obviamente se corresponden con el código que habéis colgado aquí. Vídeo: http://screencast.com/t/kglCd2hCae

El broker y el feed correspondiente no se ha modificado durante la pausa. Es una cuenta de feed nocional también (unidades).

@RaptorUK: Si, sabía que TICKVALUE devolvía el valor actual de ahora. Supongo que tu segunda parte viéndolo ahora es algo lógico. Me estoy confundiendo con la forma en que soy capaz de utilizar tickvalue como parte de mi cuenta de alimentación nocional para asegurarse de que el tamaño de la posición es correcta ...?


Esos vídeos son un coñazo, son demasiado grandes para mi pantalla.

¿Por qué no publicar el código de la secuencia de comandos y el resultado de la alerta.

No sé lo que pusiste en el script que se suponía que era mi código sugerido, pero no hay manera de que pueda resultar en "08"

Usa

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


@RaptorUK: Si, sabía que TICKVALUE devolvía el valor actual de ahora. Supongo que su segunda parte mirando ahora es algo lógico. Me estoy confundiendo con cómo soy capaz de utilizar tickvalue como parte de mi cuenta de alimentación nocional para asegurarse de que el tamaño de la posición es correcta...?

Primero tienes que confirmar que TICKVALUE está devolviendo efectivamente un resultado cero, lo cual no has hecho todavía.
 
GumRai:


Esos videos son un dolor, son demasiado grandes para mi pantalla.

Por qué no publicar el código del script y el resultado de la alerta.

No sé lo que has puesto en el script que se supone que es mi código sugerido, pero no hay manera de que pueda resultar en "08"

Utilice


Lo siento - Me doy cuenta ahora que me olvidé de poner "DoubleToStr" ¡¡¡Mi culpa!!!

TickSize = 0.00100000

TickValue = 0.00001026

(Se ha dejado caer en la alimentación nocional de GBPJPY)

@SDC Simplemente copié tu código de aquí y lo puse en un nuevo script. Eso es lo que se devolvía.

 
Ok nueva actualización, he jugado con él repitiendo el lugar preciso donde se produce la división de cero.

Esta área en mi código lo tengo imprimiendo la fórmula para romper las matemáticas - Donde esto está sucediendo es en una orden pendiente de compra... sin embargo, esta parte del código "pips_to_ssl" es pips para vender la pérdida de la parada... Que NO se está utilizando para una orden pendiente de compra ....

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 nueva actualización, he jugado con él repitiendo el lugar preciso donde se produce la división de cero.

Esta área en mi código la tengo imprimiendo la fórmula para descomponer las matemáticas - Donde esto está ocurriendo es en una ORDEN DE COMPRA PENDIENTE... sin embargo esta parte del código "pips_to_ssl" es pips para VENDER stop loss... Que NO se está utilizando para una orden pendiente de compra ....



Me remito a mi post anterior

"Tenga en cuenta que

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

también resultará en cero si pips_to_bsl es cero. ¿Es esto posible?"

bsl o ssl, la misma codificación.