Respuesta

ERROR DE CÁLCULO EN LA GESTIÓN DEL DINERO

13 respuestas

loonet

Abonado, bbp_participant, comunidad, cliente, sq-ultimate, 15 respuestas.

Visitar el perfil

hace 9 años #113539

Hola Mark Soy Riccardo de Sapienza Finanziaria
Te advierto que en mi opinión EAW tiene un fallo en el cálculo del Riesgo de Gestión Monetaria con Fixed% del patrimonio de la cuenta.
En el sistema de comercio que estoy planeando fijé un riesgo por operación de 1%
Prueba a ver por ejemplo lo que ocurre en la operación # 79 que resalto en la imagen adjunta.

traderesult.jpg

 
Antes de la operación #79 en mi cuenta tengo un saldo de 21680 USD, y establezco un Riesgo por Operación 1%.
Significa que podría perder unos 217 USD si me quedo con el SL.
La operación # 79 es una operación de COMPRA con Precio de entrada en 1,3703 y SL en 1,3640.
La operación sale a mercado con 3:40 lotes, por lo que cada pip son 34 USD .
La operación se cierra con una pérdida de 1241 pipos (= 63 x 34).
En realidad, para respetar un Riesgo por Operación de 1%, el sistema de negociación debería haber abierto esa operación con 0,34 lotes y no con 3,40 lotes.

 

Soy programador de MQL así que he intentado corregir la función EAW sqMMFixedRisk sustituyéndola por una función propia que comunico a continuación para ayudaros a solucionar el fallo:

    //------ sqMMFixedRisk arreglado por Riccardo
     
    double sqMMFixedRisk (int orderMagicNumber, int orderType)
    {
    double TamañoLote=0;
    double _riskInPercent = PorcentajeDeRiesgo;
    double _maximumLots = 5,0;
    double slSize = sqMMGetOrderStopLossDistance(orderMagicNumber, orderType) * gPointPow;
     
     
    double riskPerTrade=SaldoDeCuenta() *(_riskInPercent/100);
    if(slSize 0 && TickValue>0)
    {
    LotSize = MarketInfo(Symbol(),MODE_TICKSIZE) * riskPerTrade / (slSize * TickValue * MarketInfo(Symbol(),MODE_POINT) );
     
    int err=GetLastError();
    if(err==4013)
    { //ERR_ZERO_DIVIDE
    Verbose("Err: división por cero: StopLoss:",slSize," TickValue:",TickValue," LotSize:",LotSize);
    return(-1);
    }
    }
     
    //--- Gestión de MAXLOT y MINLOT
    double Lote_más_pequeño = MarketInfo(Symbol(), MODE_MINLOT);
    double Largest_Lot = MarketInfo(Symbol(), MODE_MAXLOT);
     
    if (Tamaño_lote  Lote_más_grande) Tamaño_lote = Lote_más_grande;
     
    if(Tamaño_lote > _lote_máximo) {
    Tamaño_lote = _lote_máximo;
    }
    //--------------------------------------------
     
     
     
    //--- LotSize redondeado respecto a Broker LOTSTEP
    if(MarketInfo(Symbol(),MODE_LOTSTEP)==1)
    {
    TamañoLote=NormalizeDouble(TamañoLote,0);
    }
    if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.1)
    {
    TamañoLote=NormalizeDouble(TamañoLote,1);
    }
    if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01)
    {
    TamañoLote=NormalizeDouble(TamañoLote,2);
    }
    if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.001)
    {
    TamañoLote=NormalizeDouble(TamañoLote,3);
    }
    //--------------------------------------------
     
    return (TamañoLote);
     
    }
    //--------------------------------------------------------------------

Utilizando esa función también es posible evitar fijar el   Lotes Decimal  y el   Tipo de cambio de la divisa base  Parámetros MM que se volverán ininfluyentes.

 

0

JS17

Cliente, bbp_participant, comunidad, 73 respuestas.

Visitar el perfil

hace 9 años #129896

Riccardo

 

Gracias por esto, pero tengo una serie de preguntas

 

1. ¿Qué parte del código de la orden de detención europea debe suprimirse?

2. ¿Es necesario declarar nuevas variables para que el código funcione?

 

Gracias 🙂 Gracias

0

loonet

Abonado, bbp_participant, comunidad, cliente, sq-ultimate, 15 respuestas.

Visitar el perfil

hace 9 años #130005

1. Sólo tienes que sustituir la función sqMMFixedRisk por el código que pongo.

2. No necesitas declarar ninguna variable adicional (ten en cuenta que con mi función el Lotes Decimal  y el  Tipo de cambio de la divisa base  Ea Wizard Los parámetros de gestión del dinero se vuelven ininfluyentes)

0

Mark Fric

Administrador, sq-ultimate, 2 respuestas.

Visitar el perfil

hace 9 años #130015

Hola Riccardo,

 

Siento tardar tanto en responder. Ya he mirado a su función y probado, pero es muy diferente de nuestra propia función y no he tenido tiempo para probar a fondo en todos los entornos, incluyendo el comercio de CFD, etc, que es diferente de la divisa.

 

Me gustaría ponerme a ello cualquier día, pero estoy demasiado ocupado con imprevistos todo el tiempo.

Mark
Arquitecto de StrategyQuant

0

loonet

Abonado, bbp_participant, comunidad, cliente, sq-ultimate, 15 respuestas.

Visitar el perfil

hace 9 años #130020

Gracias, Marc,

Lo utilizo básicamente en el comercio Forex.

He comparado el cálculo entre la función original y la modificada.

La función original me da un comportamiento extraño en el cálculo del lote: en algunos casos parece que no tiene en cuenta el porcentaje de riesgo que he fijado.

Si quieres te puedo enviar un ejemplo de los resultados de backtest obtenidos utilizando ambas funciones.

0

JS17

Cliente, bbp_participant, comunidad, 73 respuestas.

Visitar el perfil

hace 9 años #130049

Riccardo,

 

Gracias por su respuesta y explicación - como Mark ha respondido ahora voy a esperar a que termine sus pruebas - gracias de nuevo

0

Mark Fric

Administrador, sq-ultimate, 2 respuestas.

Visitar el perfil

hace 9 años #130154

Lo he probado y todo parece funcionar correctamente, así que acabo de publicar una actualización automática del Asistente de EA que contiene la corrección de Riccardo sobre la Gestión del Dinero.

Mark
Arquitecto de StrategyQuant

0

JS17

Cliente, bbp_participant, comunidad, 73 respuestas.

Visitar el perfil

hace 9 años #130163

¿Puedo preguntar si al utilizar esta función introduzco 0 en riesgo %, entonces la función utilizará el valor introducido en "lotes si no MM"?

0

tomas262

Administrador, sq-ultimate, 2 respuestas.

Visitar el perfil

hace 9 años #130205

En el campo %, el valor del riesgo debe ser superior a cero, es decir, 0,1, 1, etc.

0

NirvanaFx

Cliente, bbp_participant, comunidad, 5 respuestas.

Visitar el perfil

hace 8 años #130401

He intentado utilizar el Riesgo en % y no importa lo que intente, cualquier porcentaje que pongo en el campo (es decir, 1,20,.06. .3, etc) que es el exacto fijo tamaño de lote que se negocia. No está variando el tamaño del lote en absoluto.. No es por defecto a lotes si no MM o algo así y tengo el stoploss para el riesgo que se calcula. ¿Es esto un error que alguien más ha experimentado últimamente? Yo también tengo la última actualización.

0

tturtle

Abonado, bbp_participant, comunidad, 6 respuestas.

Visitar el perfil

hace 8 años #131241

Hola Marc y Tomas,

 

Este parece el hilo más cercano a lo que estoy experimentando.

 

MM a % fijo de la equidad se establece, así como Global Stop Loss. Todas las operaciones están configuradas para utilizar estos ajustes.

 

En el TEster en MT4, todos los tamaños de lote están por defecto a 0.01 Lotes en EURUSD.

 

Adjunto el código que estoy usando. Por favor, hágamelo saber si usted puede ver algo.

 

Estoy usando MT4 Build 840

 

Gracias y saludos

Tim

 

0

tomas262

Administrador, sq-ultimate, 2 respuestas.

Visitar el perfil

hace 8 años #131257

De acuerdo, ¿podría adjuntar el archivo SQW?

0

o

Suscriptor, bbp_participant, comunidad, 2 respuestas.

Visitar el perfil

hace 8 años #133734

Hola, 
No estoy seguro de si este es el lugar adecuado para publicar este comentario, pero creo que también hay un error en StrategyQuant (v3.8.1) Cálculo del lote:

 

Línea 14 : if(MathMod(lotMM*100, lotStep*100) > 0) {

 

debe ser

 

               if(MathMod(lotMM1*100, lotStep*100) > 0) {

double computeMMFromRiskPerTrade(double riskPerTrade, double slSize) {
   if(slSize 0) {
      lotMM = lotMM1 - MathMod(lotMM1, lotStep);
   } else {
      lotMM = lotMM1;
   }

   lotMM = NormalizeDouble( lotMM, LotsDecimals);

   if(MarketInfo(Symbol(), MODE_LOTSIZE)==10000.0) lotMM=lotMM*10.0 ;
   lotMM=NormalizarDoble(lotMM,LotesDecimales);

   //Log("Calculando lotes, riesgo: ", riskPerTrade, ", lotMM1: ", lotMM1, ", lotStep: ", lotStep, ", lotes: ", lotMM);
   double Lote_más_pequeño = MarketInfo(Symbol(), MODE_MINLOT);
   double Largest_Lot = MarketInfo(Symbol(), MODE_MAXLOT);

   if (lotMM Lote_más_pequeño) lotMM = Lote_más_pequeño;

   if(lotMM > Lote_máximo) {
      lotMM = Lotes_máximos;
   }

   //Log("Tamaño SL: ", slTamaño, ", LoteMM: ", loteMM);

   return (lotMM);
}

Saludos,

o

0

Mark Fric

Administrador, sq-ultimate, 2 respuestas.

Visitar el perfil

hace 8 años #133753

Hola Olivier,

 

Tienes razón, hay un error. Mañana publicaré una actualización con una solución.

Mark
Arquitecto de StrategyQuant

0

Viendo 13 respuestas - de la 1 a la 13 (de un total de 13)