- Se busca un buen programador de MQL4. Hay dos estrategias, necesito que sean automáticas.
- Herramientas 'Cerrar todo'/'Abrir'
- EURUSD - Tendencias, previsiones e implicaciones (Parte 1)
hola comunidad. estoy trabajando en una ea y necesito de alguna función o método para cerrar todas las posiciones sell que esta haya abierto. agradezco su aportación
Hola Alexander,
Espero que este código te ayude.
//+------------------------------------------------------------------+ //| Ayuda.mq5 | //| Copyright 2022, Antonio Simón Del Vecchio | //| https://www.mql5.com/en/users/simondelvecchio | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, Antonio Simón Del Vecchio" #property link "https://www.mql5.com/en/users/simondelvecchio" #property version "1.00" //+------------------------------------------------------------------+ //| Include | //+------------------------------------------------------------------+ #include <Trade\Trade.mqh> #include <Trade\PositionInfo.mqh> //+------------------------------------------------------------------+ //| Objetos | //+------------------------------------------------------------------+ CTrade Trade; CPositionInfo Posicion; //+------------------------------------------------------------------+ //| Inputs | //+------------------------------------------------------------------+ input int Magic = 123; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { Trade.SetExpertMagicNumber(Magic); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { CerrarPosiciones(POSITION_TYPE_SELL); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CerrarPosiciones(ENUM_POSITION_TYPE Tipo) { //Recorremos todas las posiciones for(int i = PositionsTotal() - 1; i >= 0; i--) { //Seleccionamos la posición i if(Posicion.SelectByIndex(i)) //Si el magic de esa posición es igual a Magic y su tipo es Sell, cerrar la posición if(Posicion.Magic() == Magic && Posicion.PositionType() == Tipo) { Trade.PositionClose(Posicion.Ticket(), -1); } } } //+------------------------------------------------------------------+
Hola Antonio y Alexander, el codigo no esta mal, pero ante cualquier falla de ejecución se pudiera quedar alguna operación colgada, les sugiero esta variante que intentaría repetir el cierre si no se ejecuta. Saludos
//-------------------------------
void CerrarPosiciones(ENUM_POSITION_TYPE Tipo)
{
//Recorremos todas las posiciones
int i=0;
while(PositionsTotal()>i)
{
//Seleccionamos la posición i
if(Posicion.SelectByIndex(i))
//Si el magic de esa posición es igual a Magic y su tipo es Sell, cerrar la posición
if(Posicion.Magic() == Magic && Posicion.PositionType() == Tipo)
{
Trade.PositionClose(Posicion.Ticket(), -1);
Sleep(40);// le damos un tiempo al mercado para intentar otra ejecución
} else i++;
}
}
//------------------------------
Hola Antonio y Alexander, el codigo no esta mal, pero ante cualquier falla de ejecución se pudiera quedar alguna operación colgada, les sugiero esta variante que intentaría repetir el cierre si no se ejecuta. Saludos
//-------------------------------
void CerrarPosiciones(ENUM_POSITION_TYPE Tipo)
{
//Recorremos todas las posiciones
int i=0;
while(PositionsTotal()>i)
{
//Seleccionamos la posición i
if(Posicion.SelectByIndex(i))
//Si el magic de esa posición es igual a Magic y su tipo es Sell, cerrar la posición
if(Posicion.Magic() == Magic && Posicion.PositionType() == Tipo)
{
Trade.PositionClose(Posicion.Ticket(), -1);
Sleep(40);// le damos un tiempo al mercado para intentar otra ejecución
} else i++;
}
}
//------------------------------
Hola Antonio y Alexander, el codigo no esta mal, pero ante cualquier falla de ejecución se pudiera quedar alguna operación colgada, les sugiero esta variante que intentaría repetir el cierre si no se ejecuta. Saludos
//-------------------------------
void CerrarPosiciones(ENUM_POSITION_TYPE Tipo)
{
//Recorremos todas las posiciones
int i=0;
while(PositionsTotal()>i)
{
//Seleccionamos la posición i
if(Posicion.SelectByIndex(i))
//Si el magic de esa posición es igual a Magic y su tipo es Sell, cerrar la posición
if(Posicion.Magic() == Magic && Posicion.PositionType() == Tipo)
{
Trade.PositionClose(Posicion.Ticket(), -1);
Sleep(40);// le damos un tiempo al mercado para intentar otra ejecución
} else i++;
}
}
//------------------------------
Hola Raudel,
Hola Simón, en este caso el (for) funcionaría mejor sin duda. Lo q pasa es que por lo general, el cerrar o abrir posiciones sucede bajo determinadas circunstancias del mercado que quizas no se repitan. Ambos códigos, lógicamente, son a modo de ejemplo, pues no tendria sentido tener una funcion OnTick() cerrando todas las posiciones todo el tiempo.
Si se usa un (for), perfectamente viable, pudiera comprobarse que se cerraron todas las posiciones al final del ciclo y con el while pudiera agregarse un (break) de protección.
Saludos
- 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