asesor experto - preguntas varias - página 32

 

( Antes de intentar escribir este comentario, creo que he investigado mucho para encontrar la solución, sí he encontrado hilos similares, pero no he encontrado la solución para este problema. )

Utilizo el siguiente código para la orden de venta que me muestra el Stop Loss en pips, me muestra el valor correcto hasta que el Stop Loss se convierte en positivo.
Por lo tanto, no tengo ninguna idea de cómo puedo intentar algo para resolver este problema.

Cualquier comentario bueno, sería mejor, por favor.
( nota: No estoy usando Trailing Stop por ahora. También por debajo de código sólo para actualizaciones de información, no para OrderSend() o cosas similares. )

if(OrderType()==OP_SELL || (OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP))
  {
   riskinpips=change_to_pips(OrderStopLoss()-OrderOpenPrice());
  }
Print("stop loss in pips",DoubleToString(riskinpips,2));

Gracias de antemano.

Cuando el Stop Loss en el beneficio positivo

( nota: etiquetas de captura de pantalla hecha por el programa de edición de fotos para describir mi problema )
 

Bueno, es el valor más alto menos el valor más bajo el que te da el resultado, así que puedes comprobar cuál es el más alto

if(OrderStopLoss()>OrderOpenPrice())
{
  // orderstoploss - orderopenprice
}

else if(OrderOpenPrice()>OrderStopLoss())
{
  // orderopenprice - orderstoploss
}
 
Marco vd Heijden:

Bueno es el valor más alto menos el valor más bajo el que te da el resultado así que puedes comprobar cual es el más alto

if(OrderStopLoss()>OrderOpenPrice())
{
  // orderstoploss - orderopenprice
}

else if(OrderOpenPrice()>OrderStopLoss())
{
  // orderopenprice - orderstoploss
}

Sólo me río de mí mismo que nunca me importa. Creo que esto podría ayudarme. Pronto lo probaré.

Muchas gracias Sr. Marco

 

#Cálculo de divisas de beneficios - Cerrado

Hasta ahora funciona perfectamente.
Muchas gracias @Marco vd Heijden y @whroeder1

 

#Tiempo - Abierto

Desde que empecé a investigar sobre el Tiempo / Reloj para mi EA. Veo que los autores utilizan start() JUSTO en el indicador para ello.
Yo uso OnTimer() y OnTick() en mi EA, no me gustaría usar start().
Así que sólo necesito estar seguro / aprender qué función especial sería mejor para la función de Tiempo y Reloj?

Voy a seguir investigando sobre este tema 10 horas más tarde.
( nota: Ya he encontrado algunos indicadores de Tiempo y Reloj de la página Mql5.com Codebase - pero no me gusta copiar y pegar )

Cualquier buen comentario, compartir el foro, y los enlaces y algo más sería mejor para mí.

Gracias de antemano.

 

La función de inicio se sustituye por OnStart sólo en los scripts. En los Asesores Expertos y en los indicadores debe ser renombrada como OnTick y OnCalculate, respectivamente. El código que debe ejecutarse durante la operación de un programa mql5 debe ubicarse en estas tres funciones:

Ver: https://www.mql5.com/en/docs/migration

Documentation on MQL5: Moving from MQL4
Documentation on MQL5: Moving from MQL4
  • www.mql5.com
Moving from MQL4 - Reference on algorithmic/automated trading language for MetaTrader 5
 
Marco vd Heijden:

La función de inicio se sustituye por OnStart sólo en los scripts. En los Asesores Expertos y en los indicadores debe ser renombrada como OnTick y OnCalculate, respectivamente. El código que debe ejecutarse durante la operación de un programa mql5 debe ubicarse en estas tres funciones:

Muchas gracias más @Marco este común tan informativo para mí. Ya he leído "Pasar de MQL4 a MQL5".
 
Max Enrik:

#Tiempo - Abierto

Desde que empecé a investigar sobre el Tiempo / Reloj para mi EA. Veo que los autores utilizan start() JUSTO en el indicador para ello.
Yo uso OnTimer() y OnTick() en mi EA, no me gustaría usar start().
Así que sólo necesito estar seguro / aprender qué función especial sería mejor para la función de Tiempo y Reloj?

Voy a seguir investigando sobre este tema 10 horas más tarde.
( nota: Ya he encontrado algunos indicadores de Tiempo y Reloj de la página Mql5.com Codebase - pero no me gusta copiar y pegar )

Cualquier buen comentario, compartir el foro, y los enlaces y algo más sería mejor para mí.

Gracias de antemano.

Utilice OnTimer().

Usar TimeLocal() dará una mejor apariencia, pero no se sincronizará con la zona horaria del broker.

Usando TimeCurrent() se sincronizará con su broker, pero puede retrasarse y luego "saltar" segundos dependiendo de cuando lleguen los ticks. Este ejemplo resalta el problema:

#property strict

int OnInit()
  {
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }

void OnTimer()
  {
   Comment(StringFormat("%s - Local\n%s - Broker",TimeToString(TimeLocal(),TIME_SECONDS),TimeToString(TimeCurrent(),TIME_SECONDS)));
  }
 

#Tiempo - Cerrado

honest_knave:

Utilice OnTimer().
Usar TimeLocal() dará una mejor apariencia, pero no se sincronizará con la zona horaria del broker.
Usando TimeCurrent() se sincronizará con su broker, pero puede retrasarse y luego "saltar" segundos dependiendo de cuando lleguen los ticks. Este ejemplo resalta el problema:

#property strict

int OnInit()
  {
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }

void OnTimer()
  {
   Comment(StringFormat("%s - Local\n%s - Broker",TimeToString(TimeLocal(),TIME_SECONDS),TimeToString(TimeCurrent(),TIME_SECONDS)));
  }
Comentario completamente útil. Muchas gracias hombre.
 

Foro sobre trading, sistemas de trading automatizados y prueba de estrategias de trading

Asesor experto - preguntas varias

honest_knave, 2016.11.30 01:28

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 );

    //---
}

#Lot Step - ReOpen

@honest_knave- gracias por su mayor ayuda sobre el tamaño del lote y el paso del lote.

Así que sólo tengo que mejorar esta parte del código para cuando "Tamaño del lote >= ( Paso del lote * 100 )" que el paso del lote se incrementa en "Paso del lote * 100"

// lot plus
if(sparam==lotbuttonplus)
  {
   if(lotsize>=(lotstep*100))
     {
      lotstep=lotstep*100;
      Print("lot step: ",lotstep);
     }

   lotmaxdivide=lotmax/lotmax *(lotvalue*10);
   lotsize=fmin(lotmaxdivide,lotsize+(( ctrlfalse) ? lotstep*10 : lotstep));

// global variable
   infoupdate();

   printf("Lot: %.2f ",lotsize);
   ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
   return;
  }

Gracias de antemano.

Razón de la queja: