Comment savoir si le marché est fermé ? (mql4) - page 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 час  |
       }

C'est à peu près comme ça que j'ai résolu le problème, par des pauses et des boucles, mais c'est un vieux code, avant que la version du terminal ne soit mise à jour. Il existe aujourd'hui des moyens plus simples, il suffit de lire un peu la littérature.
Merci bien sûr, mais c'est comme on dit, grimper par l'œil d'un endroit) Je peux aussi mettre une pause sur l'euro à 5.0 le serveur me laisse faire et ensuite à chaque cycle de minuterie essayer de changer la pause, si l'erreur 132 alors le marché est fermé, si normal alors le commerce est là, mais au moment du commerce ce serveur est inondé, je veux résoudre le problème humainement, pas par des "boucles", mais c'est à MK développeurs.
 

IsTradeAllowed

Renvoie des informations sur la possibilité de négocier avec des conseillers experts.

boolIsTradeAllowed() ;

La deuxième forme de cet appel renvoie des informations sur la capacité de négocier pour un symbole donné à un moment donné.

boolIsTradeAllowed(
const string symbol// symbole
datetimetested_time// heure
) ;

Paramètres

symbole

[dans] le symbole.

test_time

[en] Temps.

Valeur retournée

Retourne vrai si l'EA est autorisé à commercer et que le fil est libre, sinon retourne faux.

 
si(SymbolInfoInteger(NULL,SYMBOL_TIME)>60) return(0) ;
 
Kino:
Merci bien sûr, mais c'est comme ils disent pour entrer par l'œil d'un endroit) Je peux également mettre une pause sur l'euro à 5,0 serveur le permettra, puis avec chaque cycle de minuterie essayer de changer la pause, si l'erreur 132 alors le marché est fermé, si normal alors le commerce est, mais au moment du commerce ce serveur est inondé, je voudrais résoudre le problème humainement, pas à travers "boucles", mais c'est le développeur MK.
Demande d'autorisation d'échange nécessaire. Je n'ai pas cette demande dans mon exemple parce qu'il y a un décalage de trois heures entre la fermeture du marché et 3 heures avant la fermeture du marché, il est essentiellement plat. C'est pourquoi je l'ai fait différemment là-bas, avec des pauses également, mais avec un intervalle beaucoup plus petit.
 
offfline:

IsTradeAllowed

Renvoie des informations sur la possibilité de négocier avec des conseillers experts.

boolIsTradeAllowed() ;

La deuxième forme de cet appel renvoie des informations sur la capacité de négocier pour un symbole donné à un moment donné.

boolIsTradeAllowed(
const string symbol// symbole
datetimetested_time// heure
) ;

Paramètres

symbole

[dans] le symbole.

test_time

[en] Temps.

Valeur retournée

Renvoie true si l'EA est autorisé à effectuer des transactions et que le thread pour effectuer les transactions est libre, sinon renvoie false.

Alexander, vous avez tort)


//+------------------------------------------------------------------+
//|                                                         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());
      }
   }

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

celui-ci fonctionne très 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:

celui-ci fonctionne très bien

Merci, je vais essayer.
 
Kino:
Merci pour le conseil, mais lorsque le marché est ouvert, il n'est pas correct d'essayer de déterminer la possibilité de travailler avec des ordres, mais cela fonctionnera.

Pour ma part, mon raisonnement est le suivant.

S'il est nécessaire de négocier sur le symbole actuel, un signe indirect que le marché est ouvert est l'arrivée de nouveaux ticks. Ainsi, l'événement OnTick est suffisant et le problème est clos.

Si nous devons travailler avec des symboles autres que le symbole actuel, le fait d'ouvrir des transactions sur le symbole actuel ne garantit pas que les transactions soient exécutées sur un autre symbole. Par exemple, le conseiller expert a été exécuté sur l'EURUSD, l'heure est 09:00 UTC, et nous voulons négocier des actions américaines, dont le marché n'ouvrira qu'à 13:00 UTC. Donc, OnTick ne sera pas utile. Nous devrons déterminer si le marché s'ouvre par d'autres symboles en tentant d'envoyer des ordres au serveur à certains intervalles. Envoyer un ordre une fois par minute n'est en aucun cas un bombardement de serveurs, mais une approche tout à fait normale. Qu'est-ce qu'il y a de mal à ça ?

 

Pas de ticks, pas de commerce, comme me l'a dit un jour le service clientèle à propos de ce problème de jour de la semaine,

ils ont suggéré une solution comme.

TimeDayOfWeek(TimeLocal());

bien que ce ne soit pas tout à fait correct, car le jour de la semaine peut ne pas être le même que le jour de la borne.

 
Dans l'un des projets récents, nous avions pour tâche de détecter le fait que la négociation d'un symbole arbitraire était ouverte et disponible.
Une condition importante était de ne pas essayer d'ouvrir des commandes, bien que j'y aie eu recours à plusieurs reprises dans d'autres projets. Pour être honnête, il me semble que c'est la méthode la plus simple et la plus fiable jusqu'à présent.

Jusqu'à présent, j'ai trouvé la meilleure façon de le faire (mais je cherche encore, voir ci-dessous) :
1) Déterminer si la négociation est autorisée "en face à face" - deuxième forme de la fonction IsTradeAllowed() (je l'ai mentionnée ci-dessus). Si ce n'est pas le cas, alors il n'est pas autorisé :)
2) Comparez l'heure de la dernière cotation en utilisant SymbolInfoInteger(<symbol>, SYMBOL_TIME) avec l'heure d'une des sessions de négociation(SymbolInfoSessionTrade()), si l'heure de la cotation tombe dans une des plages de session, alors la négociation est autorisée.
3) Vérifier si l'heure de la cotation n'est pas trop "périmée" : si elle date de plus de xx minutes (comparer SymbolInfoInteger(<symbol>, SYMBOL_TIME) et TimeCurrent(), alors nous pensons que la cotation est périmée et, par conséquent, nous ne pouvons pas trader avec elle (si j'ai raison, c'était environ trois minutes)

L'inconvénient de cette approche est le suivant : il peut y avoir des conditions où les transactions sur le symbole sont impossibles, alors que les ticks passent.
Je ne suis pas entré dans le mécanisme ; le développement a été fait pour un courtier et pendant les tests ils ont activé un tel régime - les ticks vont, mais le trading est impossible. Jusqu'à présent, nous n'avons pas réussi à surmonter cette variante.

Il est juste de dire que je n'ai pas rencontré cela dans le cadre de transactions réelles. Ainsi, dans des conditions "normales", la solution semble tolérable. Mais je le cherche encore :)

P.S. Les étapes 1 et 2 peuvent être combinées (pour transférer SymbolInfoInteger(<symbol>, SYMBOL_TIME) dans la fonction IsTradeAllowed), mais je n'ai pas encore fait de tests de cette variante et je ne le dirai pas.

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