Caractéristiques du langage mql5, subtilités et techniques - page 96

 

Au fait, GetSystemTimePreciseAsFileTime était très intéressant. Une telle fonction est très absente dans MQL, ou au moins arrondie aux micro/millisecondes. Le temps en secondes est trop grossier. Dans MT même, les millisecondes sont utilisées partout. Maintenant, nous devons le faire en synthétisant le temps exact en utilisant le même GetMicrosecondCount:

long TimeLocal_mcs() 
{ 
  static long time0_mcs= 0;
  if (time0_mcs==0) { datetime t=TimeLocal();  while(TimeLocal()==t);  time0_mcs= (t+1)*1 e6 - GetMicrosecondCount(); }
  datetime time= TimeLocal();
  long time_mcs= time0_mcs + GetMicrosecondCount();
  long delta= time_mcs - time*(long)1 e6; 
  if (delta<0) { time0_mcs-=delta;  time_mcs-=delta; }  
  return time_mcs;
}
 
Alexey Navoykov:

Au fait, GetSystemTimePreciseAsFileTime était très intéressant. Nous avons vraiment besoin d'une telle fonction dans MQL, ou au moins arrondie aux micro/millisecondes. Le temps en secondes est trop grossier. Dans MT même, les millisecondes sont utilisées partout. Maintenant, nous devons le faire en synthétisant le temps exact en utilisant la même fonction GetMicrosecondCount :

créer votre propre callback avec la génération dans mcs par la fonctionnalité WinApi

 
Konstantin:

créer votre propre callback avec génération dans mcs via la fonctionnalité WinApi

A quoi sert le rappel ?

 
Alexey Navoykov:

A quoi sert le rappel ?

Eh bien, si vous voulez le fil entier, alors un anneau de fonction est suffisant, et si vous voulez travailler avec des événements, alors un callback

 
Vérifiez si votre travail (je ne sais pas pour le marché) comporte un mécanisme d'invisibilité. Vous pouvez être sérieusement "pris"...
 
Vieux sujet, mais code très simple pour comprendre le problème

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Comment vérifier qu'un ordre est exécuté après avoir appelé PositionOpen ?

fxsaber, 2018.08.09 20:35

Essayez ce script làForexTimeFXTM-Demo01 (ouFXOpen-MT5)

#include <Trade/Trade.mqh>

void OnStart()
{
  const int PrevTotal = PositionsTotal();
  
  CTrade Trade;  
  
  while (PositionsTotal() == PrevTotal)
    Trade.Buy(1);    
}

Parfois, ce sont deux nouveaux postes qui s'ouvrent, et non un seul.


Le script essaie d'ouvrir une nouvelle position, mais parfois nous en obtenons deux.

 
fxsaber:
Un vieux sujet, mais un code assez simple pour comprendre le problème

Le script essaie d'ouvrir une nouvelle position et parfois nous en obtenons deux.

C'est un peu comme s'il y avait déjà une solution en QB :

//+------------------------------------------------------------------+
//| Возвращает "неопределённое" состояние торгового окружения        |
//+------------------------------------------------------------------+
bool IsUncertainStateEnv(const string symbol_name,const ulong magic_number)
  {
   if(MQLInfoInteger(MQL_TESTER)) return false;
   int total=OrdersTotal();
   for(int i=total-1; i>WRONG_VALUE; i--)
     {
      if(OrderGetTicket(i)==0) continue;
      if(OrderGetInteger(ORDER_TYPE)>ORDER_TYPE_SELL) continue;
      if(OrderGetInteger(ORDER_MAGIC)!=magic_number) continue;
      if(!OrderGetInteger(ORDER_POSITION_ID) && OrderGetString(ORDER_SYMBOL)==symbol_name)
         return true;
     }
   return false;
  }

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Проверка нулевых цен
   if(!RefreshRates() || Point()==0) return;
//--- Заполнение списков тикетов позиций
   int positions_total=PositionsTotal();
   if(prev_total!=positions_total)
     {
      if(FillingListTickets(num_attempts))
         prev_total=positions_total;
      else return;
     }

 
fxsaber:
Vérifiez votre travail (et le marché - je ne sais pas) pour le mécanisme d'invisibilité. Vous pourriez être sérieusement "pris"...

J'ai suivi le lien, mais je n'ai pas compris le mécanisme d'invisibilité en question.

 
Alexey Navoykov:

J'ai suivi le lien, mais je n'ai pas compris le mécanisme d'invisibilité.

L'indicateur est en mode caché sur le graphique. Il supprime les conseillers experts. C'est ce que j'ai compris en regardant rapidement depuis mon portable.

 
Alexey Navoykov:

J'ai suivi le lien, mais je n'ai pas compris le mécanisme d'invisibilité.

Il ne peut être supprimé.