conseiller expert - questions diverses - page 4

 
  1. Oui, ils l'utilisent beaucoup. Tous ces textes ont été écrits quand il n'y avait que des devises. Maintenant, il y a les métaux et si la taille du tick != point, c'est carrément faux.
  2. 02:00:00.069 - expert personnalisé EURUSD,H1 : | _lotSize - NormalizeDouble: 0.07000000000000001
    L'OP continue d'imprimer un double à 15 chiffres et ne peut pas comprendre pourquoi ce n'est pas 0,07 exactement. Parce que certains nombres ne peuvent pas être représentés exactement 1/8. peut 1/10. ne peut pas.
 
honest_knave:
double LotCalculator(double lots)
  {
   ...
   return(NormalizeDouble(lots,2));
  }

Ce commentaire m'a beaucoup aidé, et c'est utile mais cela me donne plus de décimales.
( plus de décimales est normal - parce que j'ai déjà lu à ce sujet )

Je m'inquiète toujours de'NormalizeDouble' et je cherche un autre moyen, lequel est meilleur que 'NormalizeDouble'.

Merci !

 

Grand merci à ceux qui ont écrit des commentaires.

@whroeder1- Je ferai des recherches approfondies sur vos commentaires (/ liens), merci beaucoup.
@Marco- Je vais l'utiliser après le problème de LotSize LotStep. Merci !

 
Max Enrik:

Ce commentaire m'a vraiment beaucoup aidé, et c'est utile mais cela me donne plus de décimales.
( plus de décimales est normal - parce que j'ai déjà lu à ce sujet )

Je m'inquiète toujours de'NormalizeDouble' et je cherche un autre moyen, lequel est meilleur que 'NormalizeDouble'.

Merci !

Peut-être serait-il préférable d'établir exactement ce que vous cherchez à obtenir.

Si vous voulez qu'une fonction renvoie une taille de lot valide pour passer un ordre, vous n'avez pas besoin d'utiliser NormalizeDouble(). Mon extrait de code original ou celui de WHRoeder vous permettront d'y parvenir. Il existe des différences subtiles entre eux, qui sont une question de préférence personnelle.

Mais, si vous faites une impression directe() de cette valeur de lot, vous pouvez obtenir des résultats "bizarres"... comme votre 0.07000000000000001.

Ce n'est pas un problème pour OrderSend() mais ce n'est peut-être pas ce que vous voulez voir.

Si vous voulez voir les chiffres affichés de manière "normale", vous avez 2 choix :

1. Vous pouvez utiliser NormalizeDouble() dans la fonction. Pour une impression standard, la valeur sera telle que vous l'attendez. Mais si vous imprimez (manuellement) suffisamment de décimales, vous finirez par voir que le nombre n'est pas exactement ce que vous pensez. C'est ce que WHRoeder essaie de faire comprendre (je pense). Cette solution n'est pas la plus élégante, mais c'est la plus simple. Ou bien...

2. Vous pouvez laisser la taille du lot telle qu'elle est (c'est-à-dire ne pas utiliser NormalizeDouble) et ensuite ajuster la valeur à des fins d'affichage lorsque cela est nécessaire. Vous pouvez utiliser DoubleToStr() ou StringFormat() ou printf() pour y parvenir, en fonction de vos besoins. Il s'agit d'une approche plus souple.

N'oubliez pas que la valeur réelle et la façon dont cette valeur est affichée ne doivent pas nécessairement être identiques. Vous ne serez jamais en mesure de stocker exactement 0,07 :

   double myVal=0.07;
   printf("%.24f",myVal);

Result: 0.070000000000000006661338

Mais vous pouvez certainement afficher 0,07 si vous en avez besoin.
 
honest_knave:

Peut-être serait-il préférable d'établir exactement ce que vous cherchez à obtenir.
...

Wow, c'est bien que vous l'ayez écrit, je comprends presque comme votre commentaire.
Je vais donc écrire un nouveau commentaire, bientôt.

//--- deuxième édition

Comme je l'ai mentionné, je n'ai pas besoin que LotSize et LotStep s'affichent correctement juste à l'écran, j'ai besoin que LotSize et LotStep puissent afficher la même chose partout.
C'est ce qui m'inquiète.

 

S'il s'agit d'un lotsizing dynamique, vous pouvez toujours brancher une simple boîte de vitesses.

//Gearbox//
double Lots;
Balance=AccountInfoDouble(ACCOUNT_BALANCE);

if(Balance>10000)
{Lots=10;Print(" Gear Two");}
if(Balance>100000)
{Lots=100;Print(" Gear Three");}
if(Balance>1000000)
{Lots=1000;Print(" Gear Four");}
if(Balance>10000000)
{Lots=10000;Print(" Gear Five");}

if(Balance<10000000)
{Lots=1000;Print(" Gear Four");}
if(Balance<1000000)
{Lots=100;Print(" Gear Three");}
if(Balance<100000)
{Lots=10;Print(" Gear Two");}
if(Balance<10000)
{Lots=1;Print(" Gear One");}
if(Balance>1000000000)
{Lots=0;}
 

J'ai besoin de poster une partie de mon EA avec vous, donc j'espère que cela vous aidera à mieux me comprendre.
Donc, j'ai besoin de savoir si ce code est bon ou non ?

Je vous prie de me donner de bons conseils ou de l'aide (clairement), merci d'avance.

void OnChartEvent(const int      id     , // Event ID
                  const long   & lparam , // Parameter of type long event
                  const double & dparam , // Parameter of type double event
                  const string & sparam   // Parameter of type string events
                  )
{

    _lotCalc();
    //-------Process Button---------------------------------------------------------|
    if ( sparam == _btnLotMinus )
    {
        ObjectSetInteger( 0, _btnLotMinus, OBJPROP_STATE, false );
        _lotSize -= _lotStep;

        if ( NormalizeDouble( _lotSize, 2 ) <= 0 ) _lotSize = _lotMin;
        _calcUpdade( CALC_CHANGE_LOT );

        Print( " | Lot:   ", _lotSize );
        return;
    }   //---if Close
    //                          ...
}

double _lotCalc()
{
    //---
    _lotMin  = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN  );
    _lotMax  = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX  );
    _lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );

    //---
    return( NormalizeDouble( _lotSize, 2 ) );
}
 
Max Enrik:

J'ai besoin de poster une partie de mon EA avec vous, donc j'espère que cela vous aidera à mieux me comprendre.
Donc, j'ai besoin de savoir si ce code est bon ou non ?

S'il vous plaît, donnez moi de bons (clairs) conseils ou de l'aide, merci d'avance.

Tard dans la nuit, non compilé, non testé.

Nous ne voyons pas où vous définissez d'abord _lotSize... rappelez-vous que vous devrez vous assurer que _lotSize est toujours un multiple de _lotStep.

Il serait préférable de regrouper tous les calculs de lots, plutôt que de les répartir entre OnChartEvent() et _lotCalc(). Une seule fonction qui vérifie min / max / pas et fait l'incrémentation / décrémentation.

void OnChartEvent(const int      id     , // Event ID
                  const long   & lparam , // Parameter of type long event
                  const double & dparam , // Parameter of type double event
                  const string & sparam   // Parameter of type string events
                  )
{
    _lotCalc();
    //-------Process Button---------------------------------------------------------|
    if ( sparam == _btnLotMinus )
    {
        ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
        _lotSize = fmax(_lotMin, _lotSize-_lotStep);
        _calcUpdade( CALC_CHANGE_LOT );
        printf( " | Lot: %.2f  ", _lotSize );
        return;
    }   //---if Close
    //                          ...
}

void _lotCalc()
{
    //---
    _lotMin  = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN  );
    _lotMax  = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX  );
    _lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );

    //---
}
 
honest_knave:

Tard dans la nuit, non compilé, non testé.
Nous ne voyons pas où vous avez d'abord défini _lotSize... rappelez-vous que vous devrez vous assurer que _lotSize est toujours un multiple de _lotStep.
Il serait préférable de regrouper tous les calculs de lots, plutôt que de les répartir entre OnChartEvent() et _lotCalc(). Une fonction qui vérifie min / max / pas et fait l'incrémentation / décrémentation.

Cela m'a beaucoup aidé, cela signifie que cela a résolu mes problèmes de lotSize et losStep.
Un grand merci.

#Lot 0 (zéro) & (entre le problème résolu de la taille du lot et celui du pas de lot) - Fermé

 

Oui, j'ai oublié le code de lotSize, donc je l'utilise dans la fonctioninit.
Est-ce un bon endroit pour _lotSize ?

Merci !

int OnInit()
{
    _pip = Point;
    if( Digits == 0 || Digits == 2 || Digits == 3 || Digits == 5 ) _pip = 10 * Point;
    _lotSize = _lotValue * MarketInfo( Symbol(), MODE_MINLOT );

    //...
}