¿Cómo saber si el mercado está cerrado? (mql4) - página 2

 
Alexey:

int Weekday = TimeDayOfWeek(TimeLocal());                                                          //Локальное время  |
int Weekdays = TimeDayOfWeek(TimeCurrent());                                                       //Серверное время  |

while(IsExpertEnabled())                                                                 //До тех пор пока запушенно  |

     {
     if(Weekday!=0||Weekday!=6){Exp=true;if(Weekday==1){Info(4,Weekday,0);}}       //Если не Сбб. Воск. то разрешено  |
     if(Weekdays==0||Weekdays==6)                                                  //Если Сбб. Воск. то не разрешено  |
       {
       Exp=false;Info(5,Weekdays,0);
       if(Weekdays==6){Sleep(86400000);}                                                //Если суббота пауза 24 часа  |
       if(Weekdays==0){Sleep(3600000);}                                               //Если воскресение пауза 1 час  |
       }

Así es más o menos como lo resolví, mediante pausas y bucles, pero es código antiguo, antes de que se actualizara la versión del terminal. Ahora hay formas más sencillas, sólo hay que leer un poco la literatura.
Gracias, por supuesto, pero es como dicen, subir por el ojo de un lugar) También puedo poner una pausa en el euro en el servidor 5.0 me permite hacerlo y luego con cada ciclo de temporizador tratar de cambiar la pausa, si el error 132, entonces el mercado está cerrado, si es normal, entonces el comercio está ahí, pero en el momento de la negociación de este servidor se inunda, quiero resolver el problema humanamente, no a través de "bucles", pero depende de los desarrolladores de MK.
 

IsTradeAllowed

Devuelve información sobre la posibilidad de operar con Asesores Expertos.

boolIsTradeAllowed();

La segunda forma de esta llamada devuelve información sobre la capacidad de negociar para un símbolo específico en un momento determinado.

boolIsTradeAllowed(
const string symbol// símbolo
datetimetested_time// hora
);

Parámetros

símbolo

[en] símbolo.

tiempo_de_prueba

[en] Tiempo.

Valor devuelto

Devuelve true si el EA puede operar y el hilo está libre, en caso contrario devuelve false.

 
if(SymbolInfoInteger(NULL,SYMBOL_TIME)>60) return(0);
 
Kino:
Gracias, por supuesto, pero es como dicen para entrar por el ojo de un lugar) También puedo poner una pausa en el euro a 5,0 servidor lo permitirá, y luego con cada ciclo de temporizador tratar de cambiar la pausa, si el error 132 entonces el mercado está cerrado, si es normal, entonces el comercio es, pero en el momento de la negociación de este servidor está inundando, me gustaría resolver el problema humanamente, no a través de "bucles", pero este es el MK desarrolladores.
Es necesario solicitar permiso para comerciar. No tengo esta solicitud en mi ejemplo porque hay una diferencia de tres horas entre el cierre del mercado y 3 horas antes del cierre del mercado, es mayormente plana. Por eso allí lo hice de forma diferente, pero también con pausas, pero con un intervalo mucho menor.
 
offfline:

IsTradeAllowed

Devuelve información sobre la posibilidad de operar con Asesores Expertos.

boolIsTradeAllowed();

La segunda forma de esta llamada devuelve información sobre la capacidad de negociar para un símbolo específico en un momento determinado.

boolIsTradeAllowed(
const string symbol// símbolo
datetimetested_time// hora
);

Parámetros

símbolo

[en] símbolo.

tiempo_de_prueba

[en] Tiempo.

Valor devuelto

Devuelve true si el EA tiene permiso para operar y el hilo para realizar operaciones está libre, en caso contrario devuelve false.

Alexander, te equivocas)


//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  if (IsTradeAllowed() == True) Print("---- Ура торгуем -----");
   {
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
      {
         if (ticket <0) Print("---- Уже не торгуем -----",GetLastError());
      }
   }

  }
//+------------------------------------------------------------------+
 

este funciona bastante bien

//+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                                                   Sergey Gritcay |
//|                                               sergey1294@list.ru |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritcay"
#property link      "sergey1294@list.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(isNewTime())
     {
      Print("---- Ура торгуем -----");
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
        {
         if(ticket<0) Print("---- Уже не торгуем -----",GetLastError());
        }
     }
     else Print("---- функция isNewTime() = false, возможно торговля закрыта ");

  }
//+------------------------------------------------------------------+
bool isNewTime()
  {
//--- в статической переменной будем помнить время 
   static datetime last_time=0;
//--- текущее время
   datetime time=TimeCurrent();

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем 
      last_time=time;
      return(false);
     }

//--- если время отличается
   if(last_time!=time)
     {
      //--- запомним время и вернем true
      last_time=time;
      return(true);
     }
//--- дошли до этого места - значит время сервера не обновилось, вернем false
   return(false);
  }
 
sergey1294:

este funciona bastante bien

Gracias, lo probaré.
 
Kino:
Gracias por el consejo, pero cuando el mercado está abierto no es correcto tratar de determinar la posibilidad de trabajar con órdenes, pero va a funcionar.

Por mi parte, mi razonamiento es el siguiente.

Si es necesario operar con el símbolo actual, una señal indirecta de que el mercado está abierto es la llegada de nuevos ticks. Por lo tanto, el evento OnTick es suficiente y la cuestión está cerrada.

Si necesitamos trabajar con símbolos distintos al actual, el hecho de abrir operaciones en el símbolo actual no garantiza que se ejecuten operaciones en algún otro símbolo. Por ejemplo, el Asesor Experto se ha ejecutado en EURUSD, la hora es 09:00 UTC, y queremos operar con acciones de Estados Unidos, cuyo mercado no abrirá hasta las 13:00 UTC. Por lo tanto, OnTick no ayudará. Tendremos que determinar si el mercado se abre por otros símbolos a través de los intentos de enviar órdenes al servidor en determinados intervalos. Enviar una orden una vez por minuto no es en absoluto un bombardeo del servidor, sino un enfoque bastante normal. ¿Qué hay de malo en eso?

 

sin garrapatas no hay comercio como me dijo una vez servicedesk sobre este problema del día de la semana,

sugirieron una solución como.

TimeDayOfWeek(TimeLocal());

aunque no es del todo correcto, porque el día de la semana puede no ser el mismo que el día de la terminal.

 
En un proyecto reciente, la tarea consistía en detectar que el comercio con un símbolo arbitrario estaba abierto y disponible.
Una condición importante era no intentar abrir pedidos, aunque había recurrido a ello muchas veces en otros proyectos. Para ser sincero, me parece que este es el método más fácil y fiable hasta ahora.

Hasta ahora he encontrado la mejor manera de hacerlo (pero todavía estoy buscando, ver más abajo):
1) Determinar si el comercio está permitido "cara a cara" - segunda forma de la función IsTradeAllowed() (fue descrita anteriormente). Si no, entonces no está permitido :)
2) Comparar la hora de la última cotización utilizando SymbolInfoInteger(<símbolo>, SYMBOL_TIME) con la hora de una de las sesiones de negociación(SymbolInfoSessionTrade()), si la hora de la cotización cae en uno de los rangos de la sesión, entonces se permite la negociación.
3) Comprobar si la hora de la cotización no está demasiado "desfasada": si hace más de xx minutos (comparar SymbolInfoInteger(<símbolo>, SYMBOL_TIME) y TimeCurrent(), entonces pensamos que la cotización está desfasada y, por tanto, no podemos operar por ella (si no me equivoco, fueron unos tres minutos)

La desventaja de este enfoque es la siguiente: puede haber condiciones en las que las operaciones en el símbolo son imposibles, mientras que los ticks pasan.
No me metí en el mecanismo; el desarrollo se hizo para un broker y durante las pruebas han activado dicho modo - los ticks van, pero el trading es imposible. Hasta ahora, no hemos conseguido superar esta variante.

Es justo decir que no me he encontrado con esto en el comercio real. Así que en condiciones "normales" la solución parece tolerable. Pero sigo buscándolo :)

P.S. Los pasos 1 y 2 pueden ser combinados (para transferir SymbolInfoInteger(<símbolo>, SYMBOL_TIME) a la función IsTradeAllowed), pero todavía no he hecho pruebas de tal variante y no lo diré.

SymbolInfoSessionTrade - Документация на MQL4
  • docs.mql4.com
SymbolInfoSessionTrade - Документация на MQL4