ФОРТС: В помощь начинающим - страница 13

 
prostotrader:

И что?

Там не бывает пустой стакан. Но там и нет торговли, поэтому, предполагаю, могут быть нулевые, сам не проверял.

А вот проверку на нулевые bid и ask на обычных символах, тех же RTS и Si, делать приходится, ибо изредка пролетают, хоть стакан и не пустой.

 
fxsaber:

Пустой стакан в 18:51:09 сегодня?

Это клиринг.

 
JRandomTrader:

Там не бывает пустой стакан. Но там и нет торговли, поэтому, предполагаю, могут быть нулевые, сам не проверял.

А вот проверку на нулевые bid и ask на обычных символах, тех же RTS и Si, делать приходится, ибо изредка пролетают, хоть стакан и не пустой.

Откуда же Вы такие "всезнайки" выползаете?

Код (фьючерс RTS-3.21, Открывашка реал):

//+------------------------------------------------------------------+
//|                                                   Ticks_zero.mq5 |
//|                                      Copyright 2021 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window

#property indicator_plots   1
#property indicator_buffers 1

datetime start_time, end_time;
datetime time_array[];
int time_cnt;
MqlTick ticks[];

input datetime StTime = D'2019.03.15 19:05:00';    // Начало расчета фьючерса

enum IND_STAGE
{
  LOAD_TICKS = 0,
  FILL_DATA = 1
}ind_stage;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   end_time = datetime(SymbolInfoInteger(Symbol(), SYMBOL_EXPIRATION_TIME));
   start_time = StTime;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator Load ticks function                             |
//+------------------------------------------------------------------+
bool LoadTicks(const datetime &a_times[])
{
  int result = CopyTime(Symbol(), PERIOD_M1, start_time, end_time, time_array);
  if(result > 0)
  {
    time_cnt = result;
    if(time_array[result - 1] == a_times[ArraySize(a_times) - 1])
    {
      result = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, ulong(start_time) * 1000, ulong(end_time) * 1000);
      if(result > 0)
      {
        if(ticks[result-1].time >= time_array[time_cnt - 1]) 
        {
          return(true);
        } else Print(__FUNCTION__, ": Не хватает тиков ", Symbol(), "!"); 
      } else Print(__FUNCTION__, ": Не получены тики по символу ", Symbol(), "!");
    } else Print(__FUNCTION__, ": Не хватает баров по символу ", Symbol(), "!");
  } else Print(__FUNCTION__, ": Не скопировано время баров по символу ", Symbol(), "!");
  return(false);
}  
//+------------------------------------------------------------------+
//| Custom indicator Fill Data function                              |
//+------------------------------------------------------------------+
void FillData()
{
  for(int i = 0; i<ArraySize(ticks);i++)
  {
    if((ticks[i].ask == 0) && (ticks[i].bid == 0) && (ticks[i].last == 0)) 
    {
     Print("Empty book with empty Last! Time: ", ticks[i].time);
    }
    else
    if((ticks[i].ask == 0) && (ticks[i].bid == 0) && (ticks[i].last != 0)) 
    {
      Print("Empty book. Last = ", ticks[i].last, " Time: ", ticks[i].time);
    } 
  }
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,  
                 const int prev_calculated, 
                 const datetime& time[], 
                 const double& open[], 
                 const double& high[], 
                 const double& low[], 
                 const double& close[], 
                 const long& tick_volume[], 
                 const long& volume[],
                 const int& spread[] )
{  
    switch(ind_stage)
    {
      case LOAD_TICKS:
        if(LoadTicks(time) == true)
        {
          ind_stage = FILL_DATA;
        } else return(0); 
      break;
      case FILL_DATA:
        FillData();
      break;
    }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Результат:

..............................................................................
2021.03.01 21:58:20.820 Ticks_zero (RTS-3.21,M1)        Empty book with empty Last!
2021.03.01 21:58:20.820 Ticks_zero (RTS-3.21,M1)        Empty book with empty Last!
2021.03.01 21:58:20.820 Ticks_zero (RTS-3.21,M1)        Empty book with empty Last!
2021.03.01 21:58:20.820 Ticks_zero (RTS-3.21,M1)        Empty book. Last = 152910.0
2021.03.01 21:58:20.820 Ticks_zero (RTS-3.21,M1)        Empty book. Last = 152910.0
2021.03.01 21:58:20.820 Ticks_zero (RTS-3.21,M1)        Empty book with empty Last!
2021.03.01 21:58:20.820 Ticks_zero (RTS-3.21,M1)        Empty book with empty Last!
...................................................................................
 
JRandomTrader:

Это клиринг.

Не только, еще премаркет, не торговое время и еще так, как я говорил ранее

2021.03.01 22:08:11.016 Ticks_zero (RTS-3.21,M1)        Empty book. Last = 125620.0 Time: 2020.03.02 19:00:02
2021.03.01 22:08:11.016 Ticks_zero (RTS-3.21,M1)        Empty book with empty Last! Time: 2020.03.03 00:04:31
2021.03.01 22:08:11.016 Ticks_zero (RTS-3.21,M1)        Empty book. Last = 130070.0 Time: 2020.03.03 18:44:58
2021.03.01 22:08:11.016 Ticks_zero (RTS-3.21,M1)        Empty book. Last = 130070.0 Time: 2020.03.03 19:00:01
Сделка клиринга перешла в пустой стакан в торговое время.
 
prostotrader:

Откуда же Вы такие "всезнайки" выползаете?

Код (фьючерс RTS-3.21, Открывашка реал):

Результат:

Это не стакан пустой, а тик с пустыми bid и/или ask, что, как я и говорил, бывает, вероятно, в результате какого-то сбоя.

Вот на пустой стакан по актуальному RTS или Si я бы посмотрел.

 
JRandomTrader:

Это не стакан пустой, а тик с пустыми bid и/или ask, что, как я и говорил, бывает, вероятно, в результате какого-то сбоя.

Вот на пустой стакан по актуальному RTS или Si я бы посмотрел.

Уважаемый!

Вы читаете что Вам пишут?

Открывашка, реал, фьючерс RTS-3.21

2021.03.01 22:08:11.016 Ticks_zero (RTS-3.21,M1)        Empty book. Last = 130070.0 Time: 2020.03.03 19:00:01

Код есть, может быть счета реального нет?

Фьючерс RTS-3.21 "родился" 
D'2019.03.15 19:05:00

И частенько бывает стакан пустым в начале "жизни".

 
prostotrader:

Уважаемый!

Вы читаете что Вам пишут?

Открывашка, реал, фьючерс RTS-3.21

Код есть, может быть счета реального нет?

Не увидел в коде MarketBookGet()

Я говорю про актуальный - т.е., ближайший фьюч. И в нём могут пролетать тики с нулевыми ask/bid, но стакан пустым это не делает.
Документация по MQL5: Получение рыночной информации / MarketBookGet
Документация по MQL5: Получение рыночной информации / MarketBookGet
  • www.mql5.com
MarketBookGet - Получение рыночной информации - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
JRandomTrader:

Не увидел в коде MarketBookGet()

Понятно...

 
prostotrader:

И частенько бывает стакан пустым в начале "жизни".

Речь шла про сегодня.

 
fxsaber:

Речь шла про сегодня.

Посмотрите время, это может быть клиринг.

Расписание сессий

7-00 - 14-00

Промклиринг

14-05 - 18-45

основной клиринг

19-00(19-05) - 23-50

Вы - Пустой стакан в 18:51:09 сегодня?

Это Основной клиринг.

Добавлено

Торговый день может начинаться как в 19-00 так и в 19-05

Если есть экспирация фьючерса или опциона, то день начинается в 19-05

Причина обращения: