Zero Divide (Trouver le problème - mais pourquoi ?) - page 3

 
double loss_for_1_lot = pips_to_bsl/ ts * tv ;

Ce n'est PAS tv qui donne lieu à un div 0. Cela ne peut être que ts. Sur un courtier à 5 chiffres, ts peut imprimer zéro (4 chiffres).

Il me semble que vous n'avez jamais ouvert cette paire pour obtenir les informations de marché de votre courtier avant de télécharger l'historique depuis un autre endroit.

 

J'ai du mal à croire que la division par zéro soit générée par le code posté.

DomGilberto, compilez ce script et attachez-le au graphique qui, selon vous, renvoie une taille de tick nulle.

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:

J'espère que cette vidéo que j'ai faite (40 secondes environ) illustre ce dont je parle (car je ne suis pas sûr d'être clair ou non).

Vidéo : http://screencast.com/t/uMHY5DpM

Vous verrez que dans la première partie, lorsque je dépose le script sur le graphique en direct (compte réel), la valeur du tick et la taille du tick renvoient "0" sur ce "compte notionnel", que j'illustre dans la fenêtre des lots (unités).

La deuxième partie est avec le même courtier mais sur une alimentation basée sur les lots et cette fois-ci, il retourne une valeur de tick et une taille de tick. Encore une fois, j'illustre que vous tradez en utilisant des lots.....

En ce qui concerne le testeur de stratégie, je ne sais pas pourquoi il fonctionne et parfois ne fonctionne pas. Le compte a été connecté pendant que j'effectuais les back-tests également (sur un compte démo notionnel alimenté (unités)).

Ma prochaine question est la suivante : si c'est la réponse typique que j'obtiendrai du compte notionnel, pouvez-vous me suggérer comment corriger le calcul de la taille de ma position dans cette circonstance ? Il fonctionne parfaitement pour une alimentation basée sur les lots... J'espère que c'est un peu mieux expliqué ?

Si vous utilisez un code différent dans votre code "test", qu'est-ce que cela prouve ?

Savez-vous que TICKVALUE renvoie la valeur actuelle à partir de maintenant . . . même pendant un test de stratégie ? Ainsi, pour toute paire dont la devise de base n'est pas la devise de dépôt, la valeur sera incorrecte et vos calculs de lot seront erronés . . .

 

Dans votre vidéo, vous utilisez GBPUSD dans la première instance, puis GBPJPY dans la seconde.

Je pense que si vous aviez attaché votre script à un graphique GBPUSD à lot normal, vous obtiendriez une valeur pour tickvalue, mais ticksize serait également zéro.

Ceci est dû au fait que les alertes de votre script utilisent des doubles et donc que 0.00001 sera imprimé comme 0.

Utilisez plutôtDoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8).

 

Ok, tout d'abord, merci pour l'aide de chacun.

Voici la vidéo pour "Gumrai" et "SDC" confirmant ce que vous me demandez tous les deux de faire. J'ai étiqueté les scripts avec vos alias MQL4, qui correspondent évidemment à votre code que vous avez posté ici. Vidéo : http://screencast.com/t/kglCd2hCae

Le courtier et le flux correspondant n'ont pas été modifiés pendant la pause. Il s'agit également d'un compte de flux notionnel (unités).

@RaptorUK : Oui, je savais que TICKVALUE retournait la valeur actuelle à partir de maintenant. Je suppose que votre deuxième partie en regardant maintenant est assez logique. Je suis confus quant à la façon dont je peux utiliser tickvalue dans le cadre de mon compte d'alimentation notionnel pour m'assurer que le dimensionnement de la position est correct... ?

 
DomGilberto:

Ok, tout d'abord, merci pour l'aide de chacun.

Voici la vidéo pour "Gumrai" et "SDC" confirmant ce que vous me demandez tous les deux de faire. J'ai étiqueté les scripts avec vos alias MQL4, qui correspondent évidemment à votre code que vous avez posté ici. Vidéo : http://screencast.com/t/kglCd2hCae

Le courtier et le flux correspondant n'ont pas été modifiés pendant la pause. Il s'agit également d'un compte de flux notionnel (unités).

@RaptorUK : Oui, je savais que TICKVALUE retournait la valeur actuelle à partir de maintenant. Je suppose que votre deuxième partie en regardant maintenant est assez logique. Je suis confus quant à la façon dont je peux utiliser tickvalue dans le cadre de mon compte d'alimentation notionnel pour m'assurer que le dimensionnement de la position est correct... ?


Ces vidéos sont pénibles, elles sont trop grandes pour mon écran.

Pourquoi ne pas simplement poster le code du script et le résultat de l'alerte.

Je ne sais pas ce que vous avez mis dans le script qui était censé être le code que je vous ai suggéré, mais il n'y a aucune chance qu'il puisse aboutir à "08".

Utilisez

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


@RaptorUK : Oui, je savais que TICKVALUE retournait la valeur actuelle à partir de maintenant. Je suppose que votre deuxième partie en regardant maintenant est assez logique. Je suis confus quant à la façon dont je peux utiliser tickvalue dans le cadre de mon compte d'alimentation notionnel pour m'assurer que le dimensionnement de la position est correct... ?

Vous devez d'abord confirmer que TICKVALUE renvoie bien un résultat nul, ce que vous n'avez pas encore fait.
 
GumRai:


Ces vidéos sont une douleur, elles sont trop grandes pour mon écran.

Pourquoi ne pas simplement poster le code du script et le résultat de l'alerte.

Je ne sais pas ce que vous avez mis dans le script qui était censé être le code que je vous ai suggéré, mais il n'y a aucune chance qu'il aboutisse à "08".

Utilisez


Désolé - je me rends compte maintenant que j'ai oublié de mettre "DoubleToStr" ; ma faute !

TickSize = 0.00100000

TickValue = 0.00001026

(Déposé sur le flux notionnel GBPJPY)

@SDC J'ai simplement copié votre code d'ici et l'ai placé dans un nouveau script. C'est ce qui était renvoyé.

 
Ok, nouvelle mise à jour, j'ai joué avec la répétition de l'endroit précis où la division par zéro se produit.

Dans cette zone de mon code, j'ai imprimé la formule pour décomposer les maths - Là où cela se produit, c'est sur un ordre d'achat en attente... pourtant cette partie du code "pips_to_ssl" est un stop loss de vente de pips... Ce qui n'est PAS utilisé pour un ordre d'achat en attente....

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, nouvelle mise à jour, j'ai joué avec la répétition de l'endroit précis où la division par zéro se produit.

Cette zone dans mon code, je l'ai fait imprimer la formule pour décomposer les maths - Où cela se produit est sur un ordre d'achat en attente ... pourtant cette partie du code "pips_to_ssl" est pips à vendre stop loss ... Ce qui n'est PAS utilisé pour un ordre d'achat stop en attente....



Je vous renvoie à mon message précédent

"Notez que

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

aura également pour résultat zéro si pips_to_bsl est zéro. Est-ce possible ?"

bsl ou ssl, même codage.