Discusión sobre el artículo "Qué comprobaciones debe superar un robot comercial antes de ser publicado en el Mercado"
Esta es la parte que plantea dudas:
bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type) { //--- obtener el precio de apertura MqlTick mqltick; SymbolInfoTick(symb,mqltick); double price=mqltick.ask; if(type==ORDER_TYPE_SELL) price=mqltick.bid; //--- valores de los fondos propios y del margen requerido double margin,equity=AccountInfoDouble(ACCOUNT_EQUITY); //--- llamar a la función de prueba if(!OrderCalcMargin(type,symb,lots,price,margin)) { //--- algo salió mal, informe y devuelva false Print("Error in ",__FUNCTION__," code=",GetLastError()); return(false); } //--- si no hay fondos suficientes para realizar la operación if(margin>equity) { //--- informa de un error y devuelve false Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError()); return(false); } //--- la prueba fue exitosa return(true); }
¿Por qué se compara el margen exigido con los fondos propios y no con el margen libre?
Esta es la parte que plantea dudas:
¿Por qué se compara el margen exigido con el capital y no con el margen libre?
Gracias por el artículo, pero hasta ahora no he sido capaz de obtener un resultado de trabajo con el.
bool CheckMoneyForTrade(string symb, double lots,int type) { double free_margin=AccountFreeMarginCheck(symb,lots,type); //-- si no hay suficiente dinero if(free_margin<0) { string oper=(type==OP_BUY)? "Buy":"Sell"; Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError()); return(false); } //-- la prueba se ha realizado correctamente return(true); }
Cualquier variación de AccountFreeMarginCheck da errores, es imposible configurar el Asesor Experto para el mercado en absoluto, traté de averiguar de los usuarios, entonces apareció el artículo, no hay manera, no importa lo que hagas o dejes de hacer
Si añades GetLastError()!=134 a la condición GetLastError()!=134 o utilizas la función anterior, simplemente falla con errores.
La función anterior se las arregla para lanzar errores como este.
2016.07.25 15:15:54.200 2016.01.04 19:59 RSI_Grabber.1.1 XAUUSD,H1: invalid lots amount for FreeMarginCheck function 2016.07.25 15:15:54.200 2016.01.04 19:59 RSI_Grabber.1.1 XAUUSD,H1: Not enough money for Buy 0.1 XAUUSD Error code=4051
Puede que me equivoque, pero 0.1 es un lote normal especificado a mano. MODE_MINLOT para un par de divisas es 0.01.
Pero para ser honesto, cuanto más indago, menos entiendo cuál es el problema(s).
Tal vez habría que normalizar el lote en esta función para que no haya Desactivado.
y entonces la función escribe que no hay dinero, pero no envía una petición al servidor para abrir posiciones, lo que satisface las reglas del mercado.
Recientemente he comenzado a utilizar una instrucción de este tipo hace unos 2 años:
double margin=EMPTY_VALUE; margin=AccountFreeMarginCheck(sy,op,ll); if(margin>0) { ticket=OrderSend(sy,op,ll,NormalizeDouble(pp,MarketInfo(sy,MODE_DIGITS)),Slippage,NormalizeDouble(sl,MarketInfo(sy,MODE_DIGITS)),NormalizeDouble(tp,MarketInfo(sy,MODE_DIGITS)), coomment,mn,0,clOpen); } else Print("Not Enought Money Margin Required"+(string)margin);
En realidad todo funciona.
Al abrir una operación, el Asesor Experto simplemente devuelve lacadena Print("Not Enought Money Margin Required "+( cadena)margen) ;
El Asesor de Expertos se prueba en el mercado, todo el mundo está contento con él
Yo uso esta opción para el cálculo exacto, es la única que me ayudó a resolver este problema. Luego puedes compararlos libremente.
Laverage = AccountInfoInteger(ACCOUNT_LEVERAGE); //Hombro RazmerKontrakta=LotSize*MarketInfo(Symbol(),MODE_LOTSIZE); //TradeVol*1 lote MargaB=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits()); MargaS=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits()); FreeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
Hace medio año probé un Asesor Experto del Mercado, se estrellaba en el probador en el segundo o tercer día con un error de división a cero. Asesor Experto con varias decenas de comentarios, es decir, se compra. Y varios cientos de comentarios.
¡¡¡¡Y muchos escriben que existe este problema y se aconseja reiniciar una vez al día!!!!
Resulta que el rigor de las normas en el Mercado se compensa con la opcionalidad de su aplicación?
SUS: No recuerdo el nombre del Asesor Experto, pero es un top y no es barato. Una especie de scalper.
Estimado autor, gracias por el artículo.
Hay un pequeño error en el código para MQL4, si se me permite. Para la función CheckMoneyForTrade:
double free_margin=AccountFreeMarginCheck(symb,lots,type);
requerido:
double free_margin=AccountFreeMarginCheck(symb,type,lots);

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Qué comprobaciones debe superar un robot comercial antes de ser publicado en el Mercado:
Antes de su publicación, todos los productos del Mercado pasan por una comprobación preliminar de carácter obligatorio, con objeto de proporcionar un estándar único de calidad. En este artículo hablaremos de los errores más frecuentes que cometen los desarrolladores en sus indicadores técnicos y robots comerciales. Asimismo, mostraremos cómo puede usted comprobar por sí mismo su producto antes de enviarlo al Mercado.
El simulador de estrategias permite, no solo poner a prueba sistemas comerciales basándose en la historia, sino también detectar errores lógicos y algorítmicos cometidos al escribir el robot comercial. Durante la simulación, todos los mensajes sobre operaciones comerciales y errores detectados se muestran en el Registro del simulador. A la hora de analizarlos, estos mensajes se ven con facilidad en el Visor de archivos log, que se llama con el comando del menú contextual.
Autor: MetaQuotes Software Corp.