Как узнать цены спроса и предложения перед открытием нового бара

 

Здравствуйте, верно ли я пишу код, хочу узнать цены Ask и Bid до появления нового бара, скажем на М30 и после появления нового бара, чтобы сравнить их

void OnTick()
{
  double oldAsk=0,oldBid=0,newAsk=0,newBid=0;

  oldAsk = MarketInfo(NULL, MODE_ASK);
  oldBid = MarketInfo(NULL, MODE_BID);


  if(IsNewBar())
  {
    newAsk = MarketInfo(NULL, MODE_ASK);
    newBid = MarketInfo(NULL, MODE_BID);

   // хдесь сравниваем oldAsk, oldBid, newAsk, newBid
  }

}
 
IsNewBar() для таймфрейма М30 соответственно
 
:) все Новый год отмечают, только я один на форуме
 
up
 
Aliaksandr Kryvanos:
up

Можете использовать класс, который позволит всегда иметь в своём распоряжении прошлые и текущие Ask, Bid и их время поступления:

//+------------------------------------------------------------------+
//|                                                   aTickClass.mqh |
//|              Copyright 2015, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CTick
  {
private:
   //--- Структура данных прошлого и текущего тиков
   struct DataTick
     {
      MqlTick        prev_tick;                             // Прошлый тик
      MqlTick        curr_tick;                             // Текущий тик
     };
   DataTick dataTick;   // Структура данных тика
  
   string            m_symbol;                              // Символ
public:
   //--- Инициализирует, возвращает символ
   void              SetSymbol(string symbol_name)          {m_symbol=symbol_name;}
   string            GetSymbol(void)                        {return(m_symbol);}
   //--- Заполняет структуру последнего и предпоследнего тиков по символу
   void              FillingDataTick();
   //--- Возвращает значение Ask/Bid/Time на прошлом тике
   double            GetTickPrevAsk(void)                   {return(dataTick.prev_tick.ask);}
   double            GetTickPrevBid(void)                   {return(dataTick.prev_tick.bid);}
   datetime          GetTickPrevTime(void)                  {return(dataTick.prev_tick.time);}
   //--- Возвращает значение Ask/Bid/Time текущего тика
   double            GetTickAsk(void)                       {return(dataTick.curr_tick.ask);}
   double            GetTickBid(void)                       {return(dataTick.curr_tick.bid);}
   datetime          GetTickTime(void)                      {return(dataTick.curr_tick.time);}
   //---

                     CTick();
                    ~CTick();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CTick::CTick()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CTick::~CTick()
  {
  }
//+------------------------------------------------------------------+
//| Заполняет структуру последнего и предпоследнего тиков по символу |
//+------------------------------------------------------------------+
void CTick::FillingDataTick(void) {
   if(m_symbol=="") {
      Print(__FUNCTION__," > Не инициализирован символ. Необходимо его инициализировать: SetSymbol()");
      return;
      }
   MqlTick ct;
   if(SymbolInfoTick(m_symbol,ct)) {
      if(dataTick.prev_tick.time==0) {
         dataTick.prev_tick.ask=ct.ask;
         dataTick.prev_tick.bid=ct.bid;
         dataTick.prev_tick.time=ct.time;
         return;
         }
      dataTick.prev_tick.ask=dataTick.curr_tick.ask;
      dataTick.prev_tick.bid=dataTick.curr_tick.bid;
      dataTick.prev_tick.time=dataTick.curr_tick.time;
      dataTick.curr_tick.ask=ct.ask;
      dataTick.curr_tick.bid=ct.bid;
      dataTick.curr_tick.time=ct.time;
      }
}
//+------------------------------------------------------------------+

По использованию, как самый простой вариант:

В OnInit() вызываете SetSymbol() с нужным символом.

Далее на каждом тике вызываете FillingDataTick();

Для получения данных вызываете нужные методы:

GetTickPrevAsk() - для получения прошлой цены Ask
GetTickPrevBid() - для получения прошлой цены Bid
GetTickPrevTime() - для получения времени прошлого тика
//---
GetTickAsk() - для получения текущей цены Ask
 GetTickBid() - для получения текущей цены Bid
GetTickTime() - для получения времени прихода текущего тика

Файлы:
Причина обращения: