ERROR DE CÁLCULO EN LA GESTIÓN DEL DINERO
13 respuestas
loonet
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.
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.
JS17
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
loonet
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)
Mark Fric
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
loonet
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.
JS17
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
Mark Fric
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
JS17
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"?
tomas262
hace 9 años #130205
En el campo %, el valor del riesgo debe ser superior a cero, es decir, 0,1, 1, etc.
NirvanaFx
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.
tturtle
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
tomas262
hace 8 años #131257
De acuerdo, ¿podría adjuntar el archivo SQW?
o
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
Mark Fric
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
Viendo 13 respuestas - de la 1 a la 13 (de un total de 13)