asesor experto - preguntas varias - página 4

 
  1. Sí, lo utilizan mucho. Todos esos se escribieron cuando sólo había divisas. Ahora hay metales y si el tamaño de la garrapata != punto es plana mal.
  2. 0200:00.069 - experto personalizado EURUSD,H1: | _lotSize - NormalizeDouble: 0.07000000000000001
    El OP sigue imprimiendo un doble a 15 dígitos y no puede entender por qué no es 0,07 exactamente. Porque algún número no puede ser representado exactamente 1/8. puede 1/10. no puede.
 
honest_knave:
double LotCalculator(double lots)
  {
   ...
   return(NormalizeDouble(lots,2));
  }

Este comentario realmente me ayuda mucho, y esto es útil pero que me da más decimales.
( más decimales es normal - porque ya leí sobre ello )

Todavía me preocupa'Normal izeDouble' y estoy buscando otra manera, que es mejor que 'NormalizeDouble'

¡Gracias!

 

Grandes gracias que se escribió comentarios.

@whroeder1- Voy a investigar ampliamente su comentario (/ enlaces) grandes gracias.
@Marco- Voy a utilizarlo después de la cuestión LotSize LotStep. ¡Gracias!

 
Max Enrik:

Este comentario realmente me ayuda mucho, y esto es útil pero que me da más decimales.
( más decimales es normal - porque ya leí sobre ello )

Todavía me preocupa'NormalizeDouble' y estoy buscando otra manera, que es mejor que 'NormalizeDouble'

¡Gracias!

Tal vez lo mejor sería establecer exactamente lo que usted está buscando para lograr.

Si lo que quieres es que la función devuelva un tamaño de lote válido para realizar una orden, no necesitas utilizar NormalizeDouble(). Mi fragmento de código original o el de WHRoeder lo conseguirán. Hay sutiles diferencias entre ellos que serán una cuestión de preferencia personal.

Pero, si usted hace un Print() directo de ese valor del lote puede obtener algunos resultados "extraños" ... como su 0.07000000000000001

Esto no será un problema para OrderSend() pero puede no ser lo que usted espera ver.

Si quiere ver los números mostrados de manera "normal", tiene 2 opciones:

1. Puede utilizar NormalizeDouble() en la función. Para una impresión estándar, el valor será el que usted espera. Pero si imprimes (manualmente) suficientes decimales, eventualmente verás que el número no es exactamente lo que crees que es. Este es el punto que WHRoeder está tratando de hacer (creo). Esta solución no es la más elegante, pero es la más sencilla. O...

2. Puedes dejar el tamaño del lote como está (es decir, no usar NormalizeDouble) y luego ajustar el valor para fines de visualización cuando sea necesario. Podría utilizar DoubleToStr() o StringFormat() o printf() para lograr esto, dependiendo de lo que necesite. Este es un enfoque más flexible.

Recuerde que el valor real y la forma en que ese valor se muestra no tienen que ser los mismos. Nunca podrá almacenar exactamente 0,07:

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

Result: 0.070000000000000006661338

Pero sí puede mostrar 0,07 si lo necesita.
 
honest_knave:

Tal vez sería mejor establecer exactamente lo que usted está buscando para lograr.
...

Wow, agradable a usted lo escribió, casi entiendo como su comentario.
Así que voy a escribir un nuevo comentario, pronto.

//--- segunda vez editado

Como he mencionado que no necesito LotSize y LotStep muestra a la derecha sólo en la pantalla, necesito LotSize y LotStep podría mostrar lo mismo en todas partes.
Sólo me preocupa eso.

 

Bueno, si se trata de un loteamiento dinámico siempre se puede conectar una caja de cambios simple.

//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;}
 

Necesito publicar parte de mi EA con usted, así que espero que le ayudará a entender más claramente a mí.
Por lo tanto, necesito saber es que un buen código o qué?

Por favor, dame un buen consejo (claramente) o ayuda, gracias de antemano.

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:

Necesito publicar parte de mi EA con usted, así que espero que le ayudará a entender más claramente a mí.
Entonces, necesito saber si es un buen código o qué?

Por favor, dame un buen consejo (claramente) o ayuda, gracias de antemano.

Tarde en la noche, no compilado, no probado.

No podemos ver dónde estableces primero _lotSize... recuerda que tendrás que asegurarte de que _lotSize es siempre un múltiplo de _lotStep.

IMHO sería mejor si mantuvieras todos tus cálculos de lote juntos, en lugar de dividirlos entre OnChartEvent() y _lotCalc(). Una función que compruebe min / max / step y haga el incremento / decremento.

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:

A última hora de la noche, sin compilar, sin probar.
No podemos ver donde se establece primero _lotSize ... recuerde que usted tendrá que asegurarse de que _lotSize es siempre un múltiplo de _lotStep.
IMHO sería mejor si mantuvieras todos tus cálculos de lote juntos, en lugar de dividirlos entre OnChartEvent() y _lotCalc(). Una función que compruebe min / max / step y haga el incremento / decremento.

Eso me ayudó mucho, eso significa que resolvió mis problemas de lotSize y losStep.
Muchas gracias hombre.

#Lote 0 (cero) & (entre el problema resuelto del tamaño del lote y el paso del lote) - Cerrado

 

Sí, olvidé el código de lotSize, así que lo uso en la funcióninit.
¿Es un buen lugar para _lotSize?

Gracias.

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

    //...
}