MqlTick.flags выводит другие флаги (отличаются от TICK_FLAG_*)

 

Здравствуйте.

Пишу код где мне надо по тикам BID что-то посчитать. Беру данные с функциями CopyTicksRange() и SymbolInfoTick(), но оба возвращают данные MqlTick с флагами не подходящими TICK_FLAG_*. В документации есть флаги:

  • TICK_FLAG_BID –  tick has changed a Bid price
  • TICK_FLAG_ASK  – a tick has changed an Ask price
  • TICK_FLAG_LAST – a tick has changed the last deal price
  • TICK_FLAG_VOLUME – a tick has changed a volume
  • TICK_FLAG_BUY – a tick is a result of a buy deal
  • TICK_FLAG_SELL – a tick is a result of a sell deal

А терминал возвращает вот такое значение:

2024.08.22 15:38:25.257 Test (EURUSD,M1)        Latest price data for the 'EURUSD' symbol:
2024.08.22 15:38:25.257 Test (EURUSD,M1)                         [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2024.08.22 15:38:25.257 Test (EURUSD,M1)        [0] 2024.08.22 13:38:20 1.11438 1.11442 0.0000        0 1724333900863    1030       0.00000
2024.08.22 15:38:28.389 Test (EURUSD,M1)        =====================
2024.08.22 15:38:28.389 Test (EURUSD,M1)        Latest price data for the 'EURUSD' symbol:
2024.08.22 15:38:28.389 Test (EURUSD,M1)                         [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2024.08.22 15:38:28.389 Test (EURUSD,M1)        [0] 2024.08.22 13:38:22 1.11441 1.11446 0.0000        0 1724333902968    1030       0.00000
2024.08.22 15:40:22.968 Test (GBPUSD,H1)        =====================
2024.08.22 15:40:22.968 Test (GBPUSD,H1)        Latest price data for the 'GBPUSD' symbol:
2024.08.22 15:40:22.968 Test (GBPUSD,H1)                         [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2024.08.22 15:40:22.968 Test (GBPUSD,H1)        [0] 2024.08.22 13:40:20 1.31204 1.31212 0.0000        0 1724334020306    1030       0.00000
2024.08.22 15:40:30.317 Test (GBPUSD,H1)        =====================
2024.08.22 15:40:30.317 Test (GBPUSD,H1)        Latest price data for the 'GBPUSD' symbol:
2024.08.22 15:40:30.317 Test (GBPUSD,H1)                         [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2024.08.22 15:40:30.317 Test (GBPUSD,H1)        [0] 2024.08.22 13:40:27 1.31207 1.31214 0.0000        0 1724334027716    1030       0.00000

То есть,  TICK_FLAG_* это 2, 4, 8, 16, 32, 64, А сейчас Tick.flags возвращает 1026, 1028, 1030 и т.д.

Как теперь это проверять, и где можно про это прочитать (посмотреть)?

 

Какое-то лишнее значение 1024 содержится в значении флагов:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   PrintFormat("FLAGS:\nTICK_FLAG_BID=%d\nTICK_FLAG_ASK=%d\nTICK_FLAG_LAST=%d\nTICK_FLAG_VOLUME=%d\nTICK_FLAG_BUY=%d\nTICK_FLAG_SELL=%d\n\nTICK:",
               TICK_FLAG_BID,TICK_FLAG_ASK,TICK_FLAG_LAST,TICK_FLAG_VOLUME,TICK_FLAG_BUY,TICK_FLAG_SELL);
   MqlTick array[1]={};
   if(SymbolInfoTick(_Symbol,array[0]))
     {
      ArrayPrint(array);
      MqlTick tick=array[0];
      int summ=0;
      Print("Flags in tick:");
      if((tick.flags & TICK_FLAG_BID)==TICK_FLAG_BID)
        {
         Print("TICK_FLAG_BID");
         summ+=TICK_FLAG_BID;
        }
      if((tick.flags & TICK_FLAG_ASK)==TICK_FLAG_ASK)
        {
         Print("TICK_FLAG_ASK");
         summ+=TICK_FLAG_ASK;
        }
      if((tick.flags & TICK_FLAG_LAST)==TICK_FLAG_LAST)
        {
         Print("TICK_FLAG_LAST");
         summ+=TICK_FLAG_LAST;
        }
      if((tick.flags & TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME)
        {
         Print("TICK_FLAG_VOLUME");
         summ+=TICK_FLAG_VOLUME;
        }
      if((tick.flags & TICK_FLAG_BUY)==TICK_FLAG_BUY)
        {
         Print("TICK_FLAG_BUY");
         summ+=TICK_FLAG_BUY;
        }
      if((tick.flags & TICK_FLAG_SELL)==TICK_FLAG_SELL)
        {
         Print("TICK_FLAG_SELL");
         summ+=TICK_FLAG_SELL;
        }
         
      PrintFormat("summ=%d, tick.flags-summ=%d",summ, tick.flags-summ);
     }
  }
   /*
   Результат:
   Test (EURUSD,M1)     FLAGS:
   Test (EURUSD,M1)     TICK_FLAG_BID=2
   Test (EURUSD,M1)     TICK_FLAG_ASK=4
   Test (EURUSD,M1)     TICK_FLAG_LAST=8
   Test (EURUSD,M1)     TICK_FLAG_VOLUME=16
   Test (EURUSD,M1)     TICK_FLAG_BUY=32
   Test (EURUSD,M1)     TICK_FLAG_SELL=64
   Test (EURUSD,M1)     
   Test (EURUSD,M1)     TICK:
   Test (EURUSD,M1)                      [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
   Test (EURUSD,M1)     [0] 2024.08.22 16:43:40 1.11285 1.11289 0.0000        0 1724345020602    1030       0.00000
   Test (EURUSD,M1)     Flags in tick:
   Test (EURUSD,M1)     TICK_FLAG_BID
   Test (EURUSD,M1)     TICK_FLAG_ASK
   Test (EURUSD,M1)     summ=6, tick.flags-summ=1024
   */
//+------------------------------------------------------------------+

А флаги проверять как в скрипте выше.

 
DiamondSystems:

Здравствуйте.

Пишу код где мне надо по тикам BID что-то посчитать. Беру данные с функциями CopyTicksRange() и SymbolInfoTick(), но оба возвращают данные MqlTick с флагами не подходящими TICK_FLAG_*. В документации есть флаги:

  • TICK_FLAG_BID –  tick has changed a Bid price
  • TICK_FLAG_ASK  – a tick has changed an Ask price
  • TICK_FLAG_LAST – a tick has changed the last deal price
  • TICK_FLAG_VOLUME – a tick has changed a volume
  • TICK_FLAG_BUY – a tick is a result of a buy deal
  • TICK_FLAG_SELL – a tick is a result of a sell deal

А терминал возвращает вот такое значение:

То есть,  TICK_FLAG_* это 2, 4, 8, 16, 32, 64, А сейчас Tick.flags возвращает 1026, 1028, 1030 и т.д.

Как теперь это проверять, и где можно про это прочитать (посмотреть)?

Все прочие биты являются внутренними (проставляются платформой для себя в различных ситуациях) и не документированы, потому что могут меняться. На форуме представители MQ рассказывали про некоторые такие доп.флаги - можно поискать контекстно (лучше гуглом). Они никак не мешают работать с публичными флагами.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2024.06.26 09:14

Билды торговых серверов позже 12.06.2024 (например, b4410) заполняют второй байт MqlTick.flags тиков (SymbolInfoTick и CopyTicks*).


void OnStart()
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2024.06.01' * 1000);
  
  Print(AccountInfoString(ACCOUNT_SERVER)); // MetaQuotes-Demo
  
  for (int i = 0; i < Amount; i++ )
    if ((bool)(Ticks[i].flags >> 8))
    {
      //  time = 2024.06.12 15:52:50.286 bid = 1.08241 ask = 1.08241 last = 0.00000 volume = 0 
      Print(Ticks[i].time);

      // 1158 TICK_FLAG_BID TICK_FLAG_ASK FLAG_UNKNOWN (1152)
      Print(Ticks[i].flags);

      break;
    }
}
 

Например, про бит 128:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

Slava, 2018.12.04 11:09

Alain Verleyen:
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 1 галочка: 2018.12.03 00: 52: 27.671 1.13338 / 1.13354 / 0.00000 0 флаги: 230
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 2 tick: 2018.12.03 00: 52: 27.743 1.13335 / 1.13348 / 0.00000 0 флаги: 230
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 3 tick: 2018.12.03 00: 52: 27.821 1.13327 / 1.13343 / 0.00000 0 флаги: 230
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 4 tick: 2018.12.03 00: 52: 27.888 1.13326 / 1.13343 / 0.00000 0 флаги: 226
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 5 tick: 2018.12.03 00: 52: 27.965 1.13327 / 1.13345 / 0.00000 0 флаги: 230
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 6 tick: 2018.12.03 00: 52: 28.194 1.13328 / 1.13346 / 0.00000 0 флаги: 230
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 7 tick: 2018.12.03 00: 52: 28.265 1.13328 / 1.13346 / 0.00000 0 флаги: 96
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 8 tick: 2018.12.03 00: 52: 28.327 1.13326 / 1.13344 / 0.00000 0 флаги: 230
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 9 tick: 2018.12.03 00: 52: 28.405 1.13326 / 1.13344 / 0.00000 0 флаги: 96
2018.12.03 09: 58: 06.899 TicksInfo (EURUSD, M5) EURUSD: 10 tick: 2018.12.03 00: 52: 28.809 1.13326 / 1.13344 / 0.00000 0 флаги: 96
2018.12.03 09: 58: 06.899 TicksInfo (EURUSD, M5) EURUSD: 11 tick: 2018.12.03 00: 52: 29.289 1.13326 / 1.13344 / 0.00000 0 флаги: 96
Очевидно, что флаг бит на бит 7 (значение 128, недокументированный ), возможно ли знать значение?

Это - служебный флаг, который выставляет датафид, если у тика по какой-либо причине не был выставлен флаг TICK_FLAG_BID, при том что тик должен быть применён к бару.


 
Artyom Trishkin #:

Какое-то лишнее значение 1024 содержится в значении флагов:

А флаги проверять как в скрипте выше.

Понятно, спасибо!