Marché fermé - page 5

 

Chers développeurs !

JE VOUS DEMANDE de lire attentivement ce message.

Je crois que j'ai trouvé la raison pour laquelle le décalage horaire apparaît ! !!

Aujourd'hui :

Terminal

23:49:58.148    Trades  'xxxxx': buy limit 2.00 UCHF-3.18 at 0.9310
23:49:58.154    Trades  'xxxxx': accepted buy limit 2.00 UCHF-3.18 at 0.9310
23:49:58.156    Trades  'xxxxx': buy limit 2.00 UCHF-3.18 at 0.9310 placed for execution in 8.040 ms

Expert

2017.09.21 23:49:58.182 trader (UCHF-3.18,H1)     StopTrading: Время сервера = 23:50:00; Статус ордера = BUY_ORDER; Билет = 77833993  Buy ордер отклонён.
2017.09.21 23:49:58.182 trader (UCHF-3.18,H1)     Alert: Эксперт остановлен. Инструмент UCHF-3.18
2017.09.21 23:49:58.182 trader (UCHF-3.18,H1)     OnTradeTransaction: Buy ордер отклонён брокером(биржей). Билет = 77833993 Причина: 0 0

Mécanisme de contrôle du temps.

Lorsque la profondeur de marché change pour un symbole(je travaille uniquement avec la profondeur de marché).

//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent(const string &symbol)
{
  if(symbol == Symbol()))
  {
    if(CheckMarketTime(symbol)
    {
      //Выставление ордеров и т.д.
    }
  }     
}

La fonctionCheckMarketTime est appelée

//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
bool CheckMarketTime(const string a_symbol)
{
  if(SymbolInfoTick(a_symbol, cur_tick))
  {
    sv_time.year = 0;
    TimeToStruct(cur_tick.time, sv_time);
    if(sv_time.year > 0)
    {
      if((sv_time.day_of_week == int(FirstDay)) ||
         (sv_time.day_of_week == int(SecondDay))) return(false);
      tts_time.year = 0;
      TimeTradeServer(tts_time);
      if(tts_time.year > 0)
      {   
        if((tts_time.day_of_week == sv_time.day_of_week) &&
           (tts_time.hour == sv_time.hour) &&
           (tts_time.min == sv_time.min))
        {
          ulong cur_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec;
          if(((cur_time >= time_st_mon) && (cur_time < 50370)) ||
             ((cur_time >= time_st_day) && (cur_time < 67470)) ||
             ((cur_time >= time_st_evn) && (cur_time < 85770)))
          {
            return(true);
          }
        }
      }
    }
  }
  return(false);
}

Après avoir obtenu les données sur le dernier tick pour le symbole

if(SymbolInfoTick(a_symbol, cur_tick))

Je vérifie le délai, mais(TRÈS IMPORTANT) ! !!!.

MqlTick (IMMEDIATEMENT) ne contient pas la dernière période de temps, si

dans la profondeur de marché a changé UNIQUEMENT le volume du même prix.

Je fais cette supposition parce qu'il n'y a pas...

Drapeaux TICK_FLAG_ASK_VOLUMEet TICK_FLAG_BID_VOLUME

La fonction OnBookEvent a fonctionné (le volume de tel ou tel prix a changé), mais

MqlTick n'a pas enregistré le moment de ce changement.

Veuillez ajouter ces drapeaux à MqlTick, respectivement avec le temps mis à jour.

Ajouté

Pour une raison quelconque, je ne peux pas faire un enregistrement dans le CD

 
prostotrader:

MqlTick (DROIT ICI) n'enregistre pas le dernier temps si

dans la coupe de prix SEULEMENT le volume du même prix a changé.

Tout à fait exact. Et c'est un comportement correct. MqlTick prend les données de la même source que celle à partir de laquelle l'historique des tics est rempli. Il ne devrait pas y avoir de doublons dans l'historique des ticks, car l'historique des ticks dans MT5 ne stocke pas le volume, même sur les bestbands.

Il a été soulevé depuis longtemps qu'il n'y a pas de moyen direct de connaître le temps auquel correspond l'historique des tics. Découvrez-le d'une autre manière.

 
fxsaber:

Tout à fait exact. Et c'est le comportement correct. MqlTick prend les données de la même source que celle à partir de laquelle l'historique des tics est rempli. Il ne devrait pas y avoir de doublons dans l'historique des ticks, car l'historique des ticks dans MT5 ne stocke pas le volume, même sur les bestbands.

Il a été soulevé depuis longtemps qu'il n'y a pas de moyen direct de connaître le temps auquel correspond l'historique des tics. Découvrez-le d'une autre manière.


Auriez-vous l'amabilité de suggérer lequel ?

Ajouté

Si je recevais une notification indiquant que quelque chose avait changé dans le takan, alors

pourquoi ne pas ajouter un champ pour plus de commodité ("petit sang")

datetime book_change ; ?

Ou encore plus simple, ajoutez le champ suivant à MqlBookInfo

datetime book_change ;

D'autant que ce temps se traduit par un échange.

 
prostotrader:

Auriez-vous l'amabilité de me dire lequel ?

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

// Текущее время на торговом сервере без учета пинга
long GetCurrenTime( void )
{
  static ulong StartTime = GetMicrosecondCount();
  static long PrevTime = 0;
  
  const long TmpTime = GetMarketWatchTime();
  
  if (TmpTime > PrevTime)
  {
    PrevTime = TmpTime;
    
    StartTime = GetMicrosecondCount();
  }
  
  return(PrevTime + (long)((GetMicrosecondCount() - StartTime) / 1000));
}

void OnInit()
{
  MarketBookAdd(_Symbol);
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol);
}

string TimeToString( const long Value )
{
  return((string)(datetime)(Value / 1000) + "." + (string)IntegerToString(Value % 1000, 3, '0'));
}

void OnBookEvent( const string& )
{
  Comment(TimeToString(GetCurrenTime()));
}
 
fxsaber:

Ne sois pas ridicule... :)

 
prostotrader:

Si j'ai été informé que quelque chose a changé dans takan, alors

pourquoi ne pas ajouter un champ pour la commodité ("peu d'argent")

datetime book_change ; ?

Ou simplement, ajoutez la structure MqlBookInfo avec l'option

datetime book_change ;

Surtout, que ce temps est traduit par l'échangeur.

Seulement pas en date, mais en millisecondes. Et

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

Marché fermé

fxsaber, 2017.09.22 09:17

Laquestion est soulevée depuis longtemps qu'il n'y a pas de moyen direct de connaître le moment auquel correspond la fenêtre de pari.

Avec des suggestions similaires.

 

Peut-être après le déclenchement du OnBookEvent.

demander des CopyTicks sur ce personnage ?

Je vais essayer...

 
prostotrader:

Peut-être après le déclenchement du OnBookEvent.

demander des CopyTicks sur ce personnage ?

Ça n'aiderait pas, bien sûr. La seule option maintenant est de trouver le timing de la led du tumbler.

 
fxsaber:

Ça ne servira à rien, bien sûr. La seule option maintenant est de trouver le moment où le verre a été conduit.


C'est intéressant :)

#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
MqlTick a_ticks[], b_ticks;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!MarketBookAdd(Symbol()))
   {
     Print("Book not added!");
     return(INIT_FAILED);
   }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
    MarketBookRelease(Symbol());   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(symbol == Symbol())
    {
      int res = CopyTicks(symbol, a_ticks, COPY_TICKS_ALL, 0, 1);
      if(res > 0)
      {
        if(SymbolInfoTick(symbol, b_ticks))
        {
          Print("CopyTicks time = ", TimeToString(a_ticks[0].time, TIME_SECONDS), "; SymbolInfoTick = ", TimeToString(b_ticks.time, TIME_SECONDS));
        }
      }
    }
  }

Résultat

2017.09.22 11:18:36.029 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:35
2017.09.22 11:18:36.933 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:35
2017.09.22 11:18:37.577 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:37
2017.09.22 11:18:38.257 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:27; SymbolInfoTick = 11:18:37
2017.09.22 11:18:38.317 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38
2017.09.22 11:18:38.511 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38
2017.09.22 11:18:38.871 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38
2017.09.22 11:18:39.071 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38
2017.09.22 11:18:39.545 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:38
2017.09.22 11:18:39.655 Test_time (RTS-12.17,M1)        CopyTicks time = 11:18:38; SymbolInfoTick = 11:18:39

? ??????

Je ne sais même pas quoi dire. ....

 
prostotrader:

Je ne sais même pas quoi dire. ....

void OnInit()
{
  MarketBookAdd(_Symbol);
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol);
}

string GetTickFlag( uint tickflag )
{
  string flag = "";

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
     
  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc % 1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

void OnBookEvent( const string &Symb )
{
  if (Symb == _Symbol)
  {
    MqlTick Tick1, Tick2[];
    
    if (SymbolInfoTick(_Symbol, Tick1) && (CopyTicks(_Symbol, Tick2, COPY_TICKS_ALL, 0, 1) > 0))
      Print("\nMqlTick: " + TickToString(Tick1) + "\nCopyTick: " + TickToString(Tick2[0]));
  }
}

vous verrez que le timing ne sera différent que dans ces situations

Test3 (RTS-12.17,M1)    MqlTick:  time = 2017.09.22 11:21:50.668 bid = 112000.0 ask = 112010.0 last = 112000.0 volume = 5 FLAG_UNKNOWN (0)
Test3 (RTS-12.17,M1)    CopyTick:  time = 2017.09.22 11:21:50.572 bid = 112000.0 ask = 112010.0 last = 112000.0 volume = 5 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL


Il a été discuté à plusieurs reprises que MqlTick ne retourne pas un tick tel quel. Qu'il existe deux flux de ticks : la cotation et la transaction. Et que dans CopyTicks ils sont fusionnés parfois rétroactivement, parce que les flux ne sont pas synchronisés. Et que les moments de MqlTick et CopyTicks peuvent ne pas coïncider.

Raison: