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

 
Oleksii Chepurnyi:
Pero entonces existe la posibilidad de perder un trato.....
Se trata del mercado. Así que no debería haber errores. O debería haber su procesamiento adecuado.
 
Artyom Trishkin:
Se trata del mercado. Así que no debería haber errores. O debería haber su procesamiento adecuado.

Si no fuera por el mercado, no me hubiera molestado mucho :)

¿Entiendo que el margen es para el deslizamiento?

 
Oleksii Chepurnyi:

Si no fuera por el mercado, no me habría molestado mucho :)

¿Entiendo que el margen es para el deslizamiento?

Sí, de hecho, para reducir un poco más la probabilidad de equivocarse en caso de movimientos bruscos de los precios.

 
Oleksii Chepurnyi:

Si no fuera por el mercado, no me habría molestado mucho :)

¿Entiendo que el margen es para el deslizamiento?

Deslizamiento - en la ejecución, y aquí - corrección de la solicitud de comercio en el momento del estado del entorno del mercado.

Calculado - comprobamos la corrección, corregimos si es necesario y enviamos la solicitud. Luego comprobamos el resultado de la solicitud. Esto es en el lado del EA.

Y la ejecución es en el lado del servidor, y el valor de deslizamiento ya es requerido por la parte del servidor para aceptar o rechazar la solicitud cuando el precio cambia.

 

Por la tarde.

De la documentación:

SYMBOL_VOLUME_LIMIT.

El máximo permitido para este símbolo es el volumen total de una posición abierta y órdenes pendientes en una dirección (Compra o Venta). Por ejemplo, si el límite es de 5 lotes, usted puede tener una posición abierta de Compra con el volumen de 5 lotes y colocar una orden pendiente de Límite de Venta con el volumen de 5 lotes. Pero usted no puede colocar una orden pendiente de Límite de Compra (porque el volumen total en una dirección excederá el límite) o colocar una orden pendiente de Límite de Venta de más de 5 lotes.


Según tengo entendido, el cálculo debería tener en cuenta el volumen de todas las posiciones y órdenes sólo en la dirección en la que vamos a abrir una operación o colocar una orden.

Pero aquí la limitación del número de lotes para un símbolo la dirección no se tiene en cuenta en absoluto....

¿O he entendido algo mal?

 
Vladislav Andruschenko:

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:

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 es probado en el mercado, todo el mundo está contento con él

¡Gracias Vladislav!

Tu variante sigue funcionando, a diferencia de la mía, que antes funcionaba bien y ésta, a la que nos dirige el validador:

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);
  }
 
Ramiz Mavludov:
¡Gracias Vladislav!

Tu variante sigue funcionando a diferencia de la mía, que funcionaba bien antes y esta otra, a la que nos dirige el validador:

¿Dónde se muestra este código?

PD Lo he encontrado en las versiones portuguesa y japonesa del artículo y lo he corregido. También hay gd
 
Oleksii Chepurnyi:

Por la tarde.

De la documentación:

SYMBOL_VOLUME_LIMIT.

El máximo permitido para este símbolo es el volumen total de una posición abierta y órdenes pendientes en una dirección (Compra o Venta). Por ejemplo, si el límite es de 5 lotes, usted puede tener una posición abierta de Compra con el volumen de 5 lotes y colocar una orden pendiente de Límite de Venta con el volumen de 5 lotes. Sin embargo, usted no puede colocar una orden pendiente de Límite de Compra (porque el volumen total en una dirección excederá el límite) o colocar una orden pendiente de Límite de Venta de más de 5 lotes.


Según tengo entendido, el cálculo debería tener en cuenta el volumen de todas las posiciones y órdenes sólo en la dirección en la que vamos a abrir una operación o colocar una orden.

Pero aquí la limitación del número de lotes para un símbolo la dirección no se tiene en cuenta en absoluto....

¿O he entendido algo mal?

Tienes razón, en este ejemplo la dirección no se tiene en cuenta. Puede intentar hacerlo teniendo en cuenta el signo: las órdenes de compra se toman positivamente, las de venta - negativamente. El valor y el signo en la salida nos dará el volumen y la dirección.

Tenemos que corregir

 
Rashid Umarov:

¿Dónde se muestra este código?

PD Lo he encontrado en las versiones portuguesa y japonesa del artículo y lo he corregido. También hay gd

No puedo mostrarlo ahora, cuando lo envié para validación, en el informe haciendo click en el error 148 llegué al

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);
  }
La versión del sitio todavía estaba en ruso.
 
Rashid Umarov:

Tiene razón, en este ejemplo no se tiene en cuenta la dirección. Podemos intentar hacerlo teniendo en cuenta el signo: las órdenes de compra se toman positivamente, las de venta - negativamente. El valor y el signo en la salida nos dará el volumen y la dirección.

Hay que corregir

No entiendo lo del signo...

Escribí esto

//--- volumen máximo para todos los elementos
   double max_volume = SymbolInfoDouble(CheckSymb,SYMBOL_VOLUME_LIMIT);
   if(ED(max_volume,0)) return(true);
//---
   double sum_volume = 0;
   int    oper = 0;
   if(CheckOperation==ORDER_TYPE_BUY  || CheckOperation==ORDER_TYPE_BUY_LIMIT  || CheckOperation==ORDER_TYPE_BUY_STOP  || CheckOperation==ORDER_TYPE_BUY_STOP_LIMIT)  oper = 1;
   if(CheckOperation==ORDER_TYPE_SELL || CheckOperation==ORDER_TYPE_SELL_LIMIT || CheckOperation==ORDER_TYPE_SELL_STOP || CheckOperation==ORDER_TYPE_SELL_STOP_LIMIT) oper = 2;
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(!pst.SelectByIndex(i)) ShowError;
      if(pst.Symbol()==CheckSymb)
        {
         if(oper==1 && pst.PositionType()==POSITION_TYPE_BUY)  sum_volume += pst.Volume();
         if(oper==2 && pst.PositionType()==POSITION_TYPE_SELL) sum_volume += pst.Volume();
        }
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!ord.SelectByIndex(i)) ShowError;
      if(ord.Symbol()==CheckSymb)
        {
         if(oper==1 && (ord.OrderType()==ORDER_TYPE_BUY  || ord.OrderType()==ORDER_TYPE_BUY_LIMIT  || ord.OrderType()==ORDER_TYPE_BUY_STOP  || ord.OrderType()==ORDER_TYPE_BUY_STOP_LIMIT))  sum_volume += ord.VolumeCurrent();
         if(oper==2 && (ord.OrderType()==ORDER_TYPE_SELL || ord.OrderType()==ORDER_TYPE_SELL_LIMIT || ord.OrderType()==ORDER_TYPE_SELL_STOP || ord.OrderType()==ORDER_TYPE_SELL_STOP_LIMIT)) sum_volume += ord.VolumeCurrent();
        }
     }
   if(sum_volume+CheckVolume > max_volume)
     {
      Alert(OrdersText(0010),DoubleToString(max_volume,VolumeDigits(CheckSymb)));
      return(false);
     }
//---
   return(true);