Buen día, Si alguien me pudiera ayudar por favor. A mi entender, hice todo lo que se indica en el articulo. Pero no logro poder tener dos operaciones simultaneas abiertas, mas allá de lo que entiendo que el autor quiso hacer de no colocar compra si ya había compra o venta si ya había venta. Mi estrategia, manda por ejemplo señal de venta cuando tengo una orden abierta de compra, y en lugar de abrir una venta, el codigo me cierra la operación de compra sin que esta pueda tocar el tp/sl. Y asi me quedo sin venta ni compra. La venta cierra compra y compra cierra venta. Estoy usando en mi estrategia solo un par, solo una temporalidad y solo un tamaño de lote. Me podrían decir como puedo tener compra y venta abiertas al mismo tiempo si así lo llega a activar la estrategia? Es decir, que las ordenes ÚNICAMENTE se cierren mediante tp/sl. De antemano, muchas gracias.
Estoy en el"Probador de Estrategias" con este archivo del final de la Guía y me muestra el siguiente error:
*el error ya ha sido comentado aquí en este artículo, pero ninguna solución escrita me ha funcionado y necesito vuestra ayuda.
OF 012:44:39.040 EA_ADX (XAUUSD,H1) 2020.01.0319:00:00Alert: The Buy order request could not be completed -error:4756
ED 212:44:39.043 Trades 2020.01.0320:00:00 failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP 012:44:39.043 EA_ADX (XAUUSD,H1) 2020.01.0320:00:00Alert: The Buy order request could not be completed -error:4756
ER 212:44:39.049 Trades 2020.01.0321:00:00 failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR 012:44:39.049 EA_ADX (XAUUSD,H1) 2020.01.0321:00:00Alert: The Buy order request could not be completed -error:4756
PP 212:44:39.053 Trades 2020.01.0322:00:00 failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]
//--- ¿Tenemos ya puestos abiertos?bool Buy_opened= false ; // variable para guardar el resultado de Comprar posición abiertabool Sell_opened= false ; // variable para contener el resultado de Vender posición abiertaif ( PositionSelect ( _Symbol ) == true ) // tenemos una posición abierta
{
if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
{
Buy_opened = true ; //Es una Compra
}
elseif ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
{
Sell_opened = true ; // Es una Venta
}
}
Dado que PositionSelect selecciona la primera posición para _Symbol, si el EA abre una posición de compra, la variable Sell_opened siempre será falsa mientras la posición de compra esté abierta, provocando que se realicen múltiples posiciones de venta cada vez que haya una señal de venta.
Para corregir esto y saber si hay posiciones de compra y venta abiertas simultáneamente, se puede utilizar la siguiente lógica:
//--- ¿Tenemos ya puestos abiertos?bool Buy_opened = false ; // variable para guardar el resultado de Comprar posición abiertabool Sell_opened = false ; // variables para contener el resultado de Vender posición abiertaif ( PositionSelect ( _Symbol ) == true ) // tenemos una posición abierta
{
for ( int i= 0 ;i< PositionsTotal ();i++){
PositionSelectByTicket ( PositionGetTicket (i));
if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
{
Sell_opened = true ; // Es una Venta
} elseif ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
{
Buy_opened = true ; //Es una Compra
}
}
Muchas gracias por el artículo Samuel. ¡Eres un crack!
Me ha costado un poco que me funcionase con mi broker porque el artículo es en versión en modo "net" y he tenido que buscar información para ponerlo en modo "hedging". El primer problema que me encontré es con el mrequest.type_filling.
Para el broker XM, el que funciona es:
mrequest.type_filling = ORDER_FILLING_IOC; // Tipo de ejecución de la orden
Si no sabes cual es la que permite tu MT5, mi recomendación es que uses la función TypeFilling() en un Print(TypeFilling()) o un Comment( TypeFilling()) y este devuelve el tipo; si te dice que es 1 (ORDER_FILLING_FOK) o 2 (ORDER_FILLING_IOC) ya sabes cual tienes que poner (https://www.mql5.com/es/docs/constants/tradingconstants/orderproperties#enum_order_type_filling) ya que a mi el ORDER_FILLING_FOK (1) no me funciona con este broker.
Una vez arreglado eso, el problema es que con el PositionSelect abre muchísimas posiciones. Aunque no lo dice Samuel en su estrategia, entiendo que el objetivo es abrir una única posición buy o sell (la que primero se de) con el criterio establecido (los 4 pasos booleanos) y que hasta que no se cierre esta posición, no podemos abrir otra.
Yo lo que he hecho es cambiar este código ...
//--- no tenemos errores, así que continuamos//--- ¿Tenemos posiciones abiertas ya?bool Buy_opened=false; // variable que almacena el resultado de la posición abierta Comprabool Sell_opened=false; // variable que almacena el resultado de la posición abierta Ventaif (PositionSelect(_Symbol) ==true) // tenemos una posición abierta
{
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
Buy_opened = true; // Es una Compra
}
elseif(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
Sell_opened = true; // Es una Venta
}
}
Por este...
//--- No tenemos errores así que continuamos//--- ¿Tenemos posiciones abiertas ya?bool Buy_opened = false; // Variable que almacena el resultado de la posición abierta de Comprabool Sell_opened = false; // Variable que almacena el resultado de la posición abierta de Venta// Vamos a recorrer todas las órdenes para ver si hay alguna abiertafor(int i = 0; i < PositionsTotal(); i++)
{
ulong ticket = PositionGetTicket(i);
PositionSelectByTicket(ticket);
if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
Buy_opened = true; // es una compra
}
elseif(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
Sell_opened = true; // es una venta
}
}
// si hay una posición abierta esperamos hasta que la operación activa se cierre (que toque el SL o elTP)if (Buy_opened || Sell_opened) return;
Nota: Justo después viene la linea...
//--- Copiar el precio de cierre de la barra anterior a la barra actual, que es la barra1
p_close=mrate[1].close;
De esta forma me ha funcionado bien. Espero que os sirva.
¿Alguien sabe si puedo usar este EA para mini-index o mini-dólares?
Hola chicos, buenos días.
Estoy en el"Probador de Estrategias" con este archivo del final de la Guía y me muestra el siguiente error:
*el error ya ha sido comentado aquí en este artículo, pero ninguna solución escrita me ha funcionado y necesito vuestra ayuda.
El archivo está al final de la Guía.
¿Cómo puedo solucionar este problema?
Yo también sigo teniendo este error después de haber hecho las dos correcciones sugeridas:
ZeroMemory(mrequest);
y también
if(Compra_abierta || Venta_abierta)
¿Puede alguien ayudarme con el error 4756? Parece que no se puede colocar una orden de compra.
Compruebe si utilizó la función SymbolInfoTick y escribió esta parte del código:
Dado que PositionSelect selecciona la primera posición para _Symbol, si el EA abre una posición de compra, la variable Sell_opened siempre será falsa mientras la posición de compra esté abierta, provocando que se realicen múltiples posiciones de venta cada vez que haya una señal de venta.
Para corregir esto y saber si hay posiciones de compra y venta abiertas simultáneamente, se puede utilizar la siguiente lógica:
Hola a todos, buenos días.
Estoy en el"Probador de Estrategias" con este archivo del final de la Guía y muestra el siguiente error:
*el error ya ha sido comentado aquí en este artículo, pero ninguna solución escrita me ha funcionado y necesito vuestra ayuda.
El archivo está al final de la Guía.
¿Cómo puedo solucionar este problema?
Comprueba el precio de venta que estás solicitando, para ello utiliza breakpoint para depurar las variables mrequest.price, mrequest.sl y mrequest.tp.
Pruebe a cambiar
a:
Algunos papeles tienen reglas mínimas de stop loss, lea más aquí: https://www.mql5.com/pt/forum/319474
Hola,
Muchas gracias por el artículo Samuel. ¡Eres un crack!
Me ha costado un poco que me funcionase con mi broker porque el artículo es en versión en modo "net" y he tenido que buscar información para ponerlo en modo "hedging". El primer problema que me encontré es con el mrequest.type_filling.
Para el broker XM, el que funciona es:
Si no sabes cual es la que permite tu MT5, mi recomendación es que uses la función TypeFilling() en un Print(TypeFilling()) o un Comment( TypeFilling()) y este devuelve el tipo; si te dice que es 1 (ORDER_FILLING_FOK) o 2 (ORDER_FILLING_IOC) ya sabes cual tienes que poner (https://www.mql5.com/es/docs/constants/tradingconstants/orderproperties#enum_order_type_filling) ya que a mi el ORDER_FILLING_FOK (1) no me funciona con este broker.
Una vez arreglado eso, el problema es que con el PositionSelect abre muchísimas posiciones. Aunque no lo dice Samuel en su estrategia, entiendo que el objetivo es abrir una única posición buy o sell (la que primero se de) con el criterio establecido (los 4 pasos booleanos) y que hasta que no se cierre esta posición, no podemos abrir otra.
Yo lo que he hecho es cambiar este código ...
Por este...
Nota: Justo después viene la linea...
De esta forma me ha funcionado bien. Espero que os sirva.
Un saludo.
Yo también sigo teniendo este error después de haber hecho las dos correcciones sugeridas:
ZeroMemory(mrequest);
y también
if(Compra_abierta || Venta_abierta)
¿Puede alguien ayudarme con el error 4756? Parece que no se puede colocar una orden de compra.
Tal vez el tipo de llenado de su corredor es ORDER_FILLING_IOC, usted puede tratar de editar el código de:
mrequest.type_filling = ORDER_FILLING_FOK;A:
mrequest.type_filling = ORDER_FILLING_IOC;Yo tenía el mismo problema y ahora lo he resuelto con éxito