Aprender y escribir juntos en MQL5 - página 24

 

¿Qué hace esta función que está clara para todos?

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

{

MqlTradeRequest mi_comercio;

MqlTradeResult mi_comercio_resultado;

mi_comercio.acción=TRADE_ACTION_DEAL;

mi_operación.símbolo=Símbolo();

mi_comercio.volumen=NormalizarDoble(volumen,1);

mi_operación.precio=NormalizarDoble(Oferta,_Dígitos);

mi_operación.sl=NormalizarDoble(Oferta+StopLoss*_Punto,_Dígitos);

mi_comercio.tp=NormalizarDoble(Oferta-TomaBeneficio*_Punto,_Dígitos);

mi_comercio.desviación=desviación;

mi_comercio.tipo=ORDEN_TIPO_VENTA;

my_trade.type_filling=ORDER_FILLING_AON;

mi_comercio.comentario=comentario;

mi_comercio.magia=magia;


ResetLastError();

if(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal();

md=0;

Print( " Código de resultado de la operación - " ,mi_resultado_comercial.retcode);

}

si no

{

Print("Código de resultado de la operación - ",mi_resultado_comercial.retcode);

Print("Error de apertura de pedido = ",GetLastError());

}

return(0);

}

En el procedimiento OnTick()

...

OpenSell(Lots,10, "EUR/USD (Sell)",102406);

...

Al principio:

doble StopLoss=250,

TakeProfit=1400;

extern double Lots = 0.1;

¿Por qué demonios hay 220 dólares en los resultados de las pruebas?

<FECHA> <BALANCE> <CAPITAL> <NIVEL DE MARGEN

01,01,2010 0 :00:00 10000 10000 0

11,01,2010 2 :57:00 9779,29 9841,92 6827

15,01,2010 16:00:00 9829,8 9941,9 6857

22,01,2010 14:32:00 10124,1 10135,9 7167

26,01,2010 2 :14:00 10048,6 10048,6 0

26,01,2010 4 :06:00 10048,6 10038,4 7099

27,01,2010 21:12:00 10188,5 10188,5 0

29,01,2010 2 :16:00 10188,5 10308 7346

29,01,2010 7 :14:00 10188,5 10277,4 7324

04,02,2010 22:05:00 10418,63 10480,83 7592


Si me equivoco, dame un toque en la nariz.

No te dejaré ver el EA completo. La función en Buy es similar...

Cierro la posición con la orden contraria.

 

Muy bien. He estado gritando hasta la saciedad. Sólo aprendiendo el idioma. Si he ofendido a alguien, pido disculpas. Trabajaré y buscaré el problema. Probablemente lo he hecho yo mismo, pero realmente quiero aprender a hacer buenos EAs usando mql5. Es un sistema muy bueno, pero . Hasta ahora tengo problemas con él.

Aunque tengo 20 Expert Advisors en mql4 sin ningún problema.

 
Khomtchenko:
...
Sería mejor dar el historial de transacciones para el período en cuestión, en lugar de estas cifras desconocidas. Entonces, tal vez quede más claro el origen de la pérdida.
 

He empezado a estudiar la sección de "Operaciones de archivo" poco a poco. ¿Sabes si hay algún tutorial sobre cómo trabajar con archivos en MQL5?

 

¿Cuál es la forma correcta de eliminar todos los pedidos con un determinado modo?

Tengo dos funciones para esto, check_orders comprueba los pedidos con un determinado modo, y remove_sl los elimina:

void remove_sl()
     {
      int counter01;
      ulong counter02;
      while(check_orders()==true)
        {
         for(counter01=0; counter01<OrdersTotal(); counter01++)
           {
            counter02=OrderGetTicket(counter01);
            if(OrderGetInteger(ORDER_MAGIC)!=magick)
               continue;
            remove_request.action=TRADE_ACTION_REMOVE; remove_request.order=counter02;
            if(OrderCheck(start_request,check_result)==true)
               OrderSend(start_request,trade_result);
           }
        }
     }



bool check_orders()
     {
      int counter01;
      bool order_exist=false;
      for(counter01=0; counter01<OrdersTotal(); counter01++)
        {
         OrderGetTicket(counter01);
         if(OrderGetInteger(ORDER_MAGIC)==magick)
           {
            order_exist=true;
            break;
           }
        }
      return(order_exist);
 

El problema es que en el diario de EA aparecen estas líneas:

2011.05.11 21:40:19 Operaciones '726238' : falló la orden de cancelación #4375237 comprar 0.00 a 0.00000 [Solicitud inválida]
Es decir, hay peticiones redundantes al servidor de comercio para borrar la orden que ya se ha enviado.

 

Creo que tengo un problema con el cierre y la apertura de posiciones.

De alguna manera, en lugar de tener una posición para 0,1 lote, en realidad tengo varios lotes. Al parecer, las posiciones de un símbolo se superponen y el volumen de la posición crece. Sólo así se explican los problemas mencionados con los grandes valores de parada y la gran diferencia en las pruebas. Significa que estoy analizando mal la presencia de operaciones abiertas o cerrando mal las pistas.

Este es el procedimiento que utilizo para determinar si hay una posición abierta por un símbolo:

int Total()

{

count=0;

for (i=0; i<=PositionsTotal(); i++)

{

if (PositionGetSymbol(i)==_Symbol) {count++;}

}

return(count);

}

Por supuesto, la función devuelve 0 o 1.

Utilizo la siguiente entrada para abrir órdenes

si (Total()<1)

{

if (#alguna comprobación de los indicadores#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406);

if (#alguna comprobación de los indicadores#) OpenSell(Lots,10, "EUR/USD (Sell)",102406);

}

Abro compra y venta parece:

int OpenSell(double volume,int slippage=10,string comment="Abrir EUR/USD en corto (vender)",int magic0=102406)

{

MqlTradeRequest mi_comercio;

MqlTradeResult mi_comercio_resultado;

mi_comercio.acción=TRADE_ACTION_DEAL;

mi_operación.símbolo=Símbolo();

mi_comercio.volumen=NormalizarDoble(volumen,1);

mi_operación.precio=NormalizarDoble(Oferta,_Dígitos);

mi_operación.sl=NormalizarDoble(Oferta+StopLoss*_Punto,_Dígitos);

mi_comercio.tp=NormalizarDoble(Oferta-TomaBeneficio*_Punto,_Dígitos);

mi_comercio.desviación=desviación;

mi_comercio.tipo=ORDEN_TIPO_VENTA;

my_trade.type_filling=ORDER_FILLING_AON;

mi_comercio.comentario=comentario;

mi_comercio.magia=magia;


ResetLastError();

if(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal();

md=0;

Print( " Código de resultado de la operación - " ,mi_resultado_comercial.retcode);

}

si no

{

Print("Código de resultado de la operación - ",mi_resultado_comercial.retcode);

Print("Error de apertura de pedido = ",GetLastError());

}

return(0);

}

Cierro las operaciones en el procedimiento principal de la misma manera:

if (Total()>0) TryToClose();

TryToClose es así:

int TryToClose()
{
for (i=0; i<=PositionsTotal(); i++)
{
if (PositionGetSymbol(i)==_Symbol)
{
if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
if(#alguna comprobación del indicador#) OpenSell(Lots,10, "EUR/USD (Sell)",102406)
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
if(#alguna comprobación del indicador#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406);
}
}
return(0);

}

El indicador comprueba que si debería haber una posición de compra y hay una posición de venta, entonces hacemos una compra.

Donde cometí un error. Por qué se me agrandan las posiciones.

 
Khomtchenko:

Inserte el código a través del botón SRC

Будет читабельнее
¿Sabes la diferencia entre una orden MT4 y una orden MT5?
 

En mql4 las órdenes son comerciales o pendientes.

En mql5 una orden es una operación pendiente. La entrada en el mercado es la apertura de una posición. Cuando se activa la orden, se abre una posición. Sólo puede haber una posición para un símbolo, y puede haber tantas órdenes como queramos.

Спасибо за подсказку
 

Todo el mundo me insinúa que soy estúpido. Puede que sea tonto. Bueno, encuentra mis errores para que pueda corregirlos.

 
Khomtchenko:

Me está dando un toque de estupidez. Puede que sea estúpido. Bueno, encuentra mis errores para que pueda corregirlos.

No estoy insinuando nada, sólo pasé por aquí y pregunté cuál es el motivo más frecuente, no sé tu nivel de formación.

Llevo mucho tiempo aquí, ya me he formado una opinión sobre mucha gente (cada uno es fuerte a su manera), a ti todavía no te conozco, así que no voy a insinuar nada.


No veo el panorama general de la estrategia. A juzgar por la forma en que estás recorriendo las posiciones, la estrategia es multidivisa.

Pero sólo has prescrito una herramienta, si la herramienta es una, ¿por qué recorrer las posiciones?

Si conoces el instrumento, no necesitas buscarlo en todas las posiciones para encontrarlo, sólo tienes que utilizar esta función:

bool  PositionSelect(
   string  symbol     // имя инструмента
   );