Discusión sobre el artículo "Qué comprobaciones debe superar un robot comercial antes de ser publicado en el Mercado"

 

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.

 

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?

 
Andrey Barinov:

Esta es la parte que plantea dudas:

¿Por qué se compara el margen exigido con el capital y no con el margen libre?

Razonable - lo arreglaremos.
 

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

En la función

bool CheckMoneyForTrade(string symb, double lots,int type)

debe cambiar la función de comprobación del margen libre de,

double free_margin=AccountFreeMarginCheck(symb,lots,type);

a

double free_margin=AccountFreeMarginCheck(symb,type,lots);

para que funcione correctamente.

 
Artículo arreglado en todos los idiomas, gracias.
 
El circo de los dardos. En lugar de programar todas las comprobaciones necesarias una vez en el lado de la terminal, los desarrolladores decidieron no molestarse y hacer que cada usuario escribiera y depurara los mismos códigos, organizando "bailes con panderetas" alrededor de un comando elemental OrderSend. Muchas gracias al autor del artículo por dedicar tiempo a describir los escollos, que no deberían existir en absoluto si los desarrolladores de terminales tuvieran un enfoque amigable con los usuarios. Personalmente sólo tengo desprecio por los desarrolladores de terminales por tal enfoque. Porque su pereza cuesta miles de horas de desarrolladores perdidas en MQL.