¿función de cálculo automático del tamaño del lote? - página 5

 

Hola Phillip, Shawn aquí de nuevo. Hice los cambios menores que discutimos la última vez (sin embargo, todavía no implementé tu última versión) y los problemas con los tamaños de los lotes de los pares JPY siguen apareciendo. Dejé que mi EA se ejecutara anoche y generó 3 operaciones (el saldo de mi cuenta era de 2550 dólares, el riesgo es del 1%, así que alrededor de 25 dólares de riesgo por operación):


(1) Vender NZDJPY, 0,89 lotes

(2) Vender AUDJPY, 0,23 lotes

(3) Vender CADJPY, 0,94 lotes


El tamaño de los lotes para la operación con el AUDJPY se ve bien, pero no los otros dos. Tuve algunas declaraciones de impresión incrustado alrededor de las llamadas a sus cosas. Primero, aquí está el código de mi EA para esta parte:


if(Bid > SellPrice && SellPrice != 0.00)
         {       
          CurrentOrderType=OP_SELL;
          CurrentStopLossPrice= FinalSellStopPrice;
          CurrentEquityAtRisk=(MaxPercentEquityAtRisk/100.0)*AccountBalance();
          CurrentLotSize=LotSize(CurrentEquityAtRisk,CurrentStopLossPrice,CurrentOrderType,CurrentSymbolType,CurrentCounterPairForCross);
          Print("SELL - ", Symbol(), "AccountBalance = ", DoubleToStr(AccountBalance(),2), " Max EquityAtRisk = $",DoubleToStr(CurrentEquityAtRisk,2)," and Max Lotsize = ",DoubleToStr(CurrentLotSize,4));
          CurrentLotSize=NormalizeLotSize(CurrentLotSize);
          Print("SELL - ", Symbol(), "Normalized LotSize is now = ", DoubleToStr(CurrentLotSize,4));
          if(CurrentLotSize<MarketInfo(Symbol(),MODE_MINLOT)) CurrentLotSize=MarketInfo(Symbol(),MODE_MINLOT);
          if(CurrentLotSize>MarketInfo(Symbol(),MODE_MAXLOT)) CurrentLotSize=MarketInfo(Symbol(),MODE_MAXLOT);
          CurrentEquityAtRisk=EquityAtRisk(CurrentLotSize,CurrentStopLossPrice,CurrentOrderType,CurrentSymbolType,CurrentCounterPairForCross);
          Print("SELL - ", Symbol(), "Current EquityAtRisk = $",DoubleToStr(CurrentEquityAtRisk,2)," and Current Lotsize = ",DoubleToStr(CurrentLotSize,4));
          Print("SELL - ", Symbol(), " MarketInfo(MODE_STOPLEVEL) = ",DoubleToStr(MarketInfo(Symbol(),MODE_STOPLEVEL),5));
          
          //Check free margin
          if (AccountFreeMargin() < (1000 * CurrentLotSize)) 
          {
             Print("We have no money. Free Margin = ", AccountFreeMargin());
             return(0);
          }
         
          Ticket=OrderSendReliable2Step(Symbol(),OP_SELLSTOP,CurrentLotSize,FinalSellPrice,Slippage,CurrentStopLossPrice,FinalSellProfTarg,Symbol()+DoubleToStr(MagicNumber,0),MagicNumber,0,Red);
          if(Ticket<=0) Print("Error = ",GetLastError());
          else 
          { 


Y aquí está la salida de las declaraciones de impresión tomadas del registro, para cada una de las 3 operaciones anteriores:


05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 and Max Lotsize = 0.8988
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYNormalized LotSize is now = 0.8900
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYCurrent EquityAtRisk = $25.26 and Current Lotsize = 0.8900
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPY MarketInfo(MODE_STOPLEVEL) = 70.00000


05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 and Max Lotsize = 0.2376
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYNormalized LotSize is now = 0.2300
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYCurrent EquityAtRisk = $24.69 and Current Lotsize = 0.2300
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPY MarketInfo(MODE_STOPLEVEL) = 50.00000


07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 and Max Lotsize = 0.9408
07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYNormalized LotSize is now = 0.9400
07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYCurrent EquityAtRisk = $25.49 and Current Lotsize = 0.9400

07:13:53 DelphiEA CADJPY,H1: VENTA - CADJPY MarketInfo(MODE_STOPLEVEL) = 60.00000


¡¡Espero que esto ayude!!

Oh Phillip, otra cosa - Creo que he encontrado un pequeño error en OrderSendReliable2Step. ¿Sabes a quién debo informar de ello?


¡Gracias!

Shawn

 
Ricotter:

Este tipo lo hace utilizando el historial de archivos.

https://www.mql5.com/en/articles/1493

Ya que es nuevo aquí, cabe mencionar que esta limitación no existe en MT5 Tester. PARA TU INFORMACIÓN.

 
gordon:

Ya que eres nuevo aquí, vale la pena mencionar que esta limitación no existe en MT5 Tester. PARA TU INFORMACIÓN.

Gracias por el consejo. ¿Hay alguna razón por la que NO debería usar MT5?

 
Ricotter:

Gracias por el consejo. Hay alguna razón por la que NO debería usar MT5?

Si quieres operar en vivo inmediatamente, entonces es mejor que te quedes con MT4, pero si planeas aprender y hacer Demo durante algunos meses antes de ir en vivo, entonces podrías considerarlo. Es una nueva plataforma con muchas mejoras con respecto a MT4, pero también es mucho más complicada y todavía no está soportada por muchos brokers. Aquí hay algo de información -> http://www.100forexbrokers.com/mt5-metatrader5. También, u podría querer comprobar hacia fuera MQL5.com.
 
shawnh:

Hola Phillip, Shawn aquí de nuevo. Hice los cambios menores que discutimos la última vez (sin embargo, todavía no implementé tu última versión) y los problemas con los tamaños de los lotes de los pares JPY siguen apareciendo.

Todo "parece" bien en tu código, todavía no tengo idea de por qué te está pasando.

Te recomiendo que cambies al código más nuevo. En este punto necesitas cambiar algo ya que lo que tienes ahora no funciona correctamente.

No sé a quién deberías reportar los errores en cuanto a los problemas de orderlib, lo siento.
 
1005phillip:

Paso 1: Coloca todos los archivos adjuntos de este post en tu ruta de inclusión (...\perts\include\*.mqh)

Paso 2: Añada lo siguiente a la parte superior de su EA para que tenga acceso a las funciones de llamada contenidas en los archivos adjuntos

Paso 3: Para calcular el tamaño del lote basado en una cantidad presupuestada de capital a arriesgar añada lo siguiente

Asumiendo que usted ha definido MaxPercentEquityAtRisk en algún lugar de su EA para ser la equidad máxima permitida para poner en riesgo de pérdida completa por el comercio en el caso de que las paradas se golpean, esta porción de código primero determinará el tamaño máximo del lote basado en openprice y stoplossprice (no pips, pero el precio real del mercado, lo mismo que usted envía en su orden al corredor) y luego se determinará el tamaño máximo de la posición que el corredor aceptará sin exceder su capital de riesgo presupuestado.

Paso 4: Si desea que los resultados de los cálculos se impriman en su registro o se añadan a la operación como un comentario de la orden, también puede añadir lo siguiente

Paso 5: Coloque su orden (utilizando el método ordersendreliable)

https://c.mql5.com/mql4/forum/2010/10/OrderReliable_2010.10.12.mqh


Hola 1005phillip,


¿Tienes una versión de los 2 mqh (analyze..., y tradepositionmanage...) que no tenga la importación de lo siguiente? Esto es porque los dos tienen que las importaciones, y por lo tanto no es permitido por el compilador.

//#include <stderror.mqh>
//#include <stdlib.mqh>


...para que no edite los archivos y los mantenga en estado de solo lectura. ¿O puedo editarlos y eliminar esos imports?

 
jcadong5:

...para no editar los archivos y mantenerlos en estado de sólo lectura. ¿O puedo editarlos y eliminar esas importaciones?


Adelante, edítalos a tu gusto. La duplicidad no impide la compilación para mí, el compilador registra una nota con respecto a la duplicidad, pero eso es todo lo que hace.
 
Gracias.
 
1005phillip:
Todo "parece" bien en tu código, todavía no tengo idea de por qué te está pasando.

Te recomiendo que cambies al código más reciente. En este punto necesitas cambiar algo ya que lo que tienes ahora no funciona correctamente.

No sé a quién deberías reportar los errores en cuanto a los problemas de orderlib, lo siento.


Hola Phillip, Shawn aquí de nuevo. Después de haber instalado su última versión hace unas semanas, estoy feliz de informar que todo parece estar bien ahora y los tamaños de los lotes calculados aparecen bang-on. ¡Supongo que sólo necesitaba la última versión!


Gracias de nuevo por toda tu ayuda, ¡eres un buen hombre!


Saludos

Shawn

 

Es un placer. Y gracias por dejarme saber que te está funcionando, aprecio los comentarios. No estoy seguro de qué fue lo que falló en el código anterior. Es posible que haya sido un error de algún tipo que he corregido involuntariamente entre las revisiones.

Probablemente tendré una versión actualizada dentro de una o dos semanas que tendrá algunas características de retroceso para su uso con backtesting en MT4 enpares de divisas cruzadas. En este momento, si usted trata de backtest un par cruzado, mientras que el uso de mi código de tamaño de lote de su backtest bomba porque el backtester no puede acceder a los precios de mercado para los pares de contador y la base requerida. (esto no es un problema en las pruebas en vivo o a futuro, es una limitación del backtester de MT4)

Voy a publicar el código cuando cruza ese puente tal vez usted u otros lo encuentran útil.

Que tengan un buen fin de semana,
- Phil

Razón de la queja: