Некорректная работа кода

 

Здравствуйте. Есть есть код:

double ask1;

//+------------------------------------------------------------------+
void OnTick()
  {
double Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
if(ask1==0) ask1=Ask;

if(Ask>=ask1+5*_Point) {Alert(Ask+" "+ask1); ask1=Ask;}

  
  }


Смыл кода в том, что, если текущий аск больше(либо равен) предыдущего значения аск+5 пунктов, то Алерт. 

Почему разница между старой и новой Ценами Аск(судя по алертам) может превышать заданные 5 пунктов больше, чем на 3 пункта? Есть, даже, разница в 15 пунктов. 
Может ли  это происходить из-за режима тестирования "Каждый тик на основе реальных тиков"?

 

Используйте лучше статическую переменную для хранения предыдущего значения ask^

   static prev_ask=0;
   double current_ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   if(current_ask>=prev_ask+5*Point())
     {
      Alert(current_ask+" "+prev_ask);
     }
   prev_ask=current_ask;


Добавлено: этот код полностью разместить в OnTick(). 

Добавлено: и ещё - Ваше условие (в коде) читается так: (если текущая цена) больше или равна (предыдущая цена плюс 5 пунктов). То есть если текущая цена может быть и на 5 и на 10 и на более пунктов больше предыдущей - например на открытии часа произошёл геп.

 
Vladimir Karputov:

Используйте лучше статическую переменную для хранения предыдущего значения ask^

   static prev_ask=0;
   double current_ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   if(current_ask>=prev_ask+5*Point())
     {
      Alert(current_ask+" "+prev_ask);
     }
   prev_ask=current_ask;


Добавлено: этот код полностью разместить в OnTick(). 

Спасибо. И, все-таки, разница в несколько пунктов(поверх указанных пяти) это нормально?
 
Igor Knyazkov:
Спасибо. И, все-таки, разница в несколько пунктов(поверх указанных пяти) это нормально?
Добавлено: и ещё - Ваше условие (в коде) читается так: (если текущая цена) больше или равна (предыдущая цена плюс 5 пунктов). То есть если текущая цена может быть и на 5 и на 10 и на более пунктов больше предыдущей - например на открытии часа произошёл геп.
 
Vladimir Karputov:
Добавлено: и ещё - Ваше условие (в коде) читается так: (если текущая цена) больше или равна (предыдущая цена плюс 5 пунктов). То есть если текущая цена может быть и на 5 и на 10 и на более пунктов больше предыдущей - например на открытии часа произошёл геп.
Да, я понимаю, что условие именно такое, но, ведь прежде чем цена станет выше предыдущей на 15 пунктов, она будет выше предыдущей на 1-2-3-4-5-... пунктов И, по логике, когда цена сравнивается или больше на 1 пункт, должен отработать Алерт.
 
Igor Knyazkov:
Да, я понимаю, что условие именно такое, но, ведь прежде чем цена станет выше предыдущей на 15 пунктов, она будет выше предыдущей на 1-2-3-4-5-... пунктов И, по логике, когда цена сравнивается или больше на 1 пункт, должен отработать Алерт.
Нет. Цена может быть: 1.00356, 1.00356, а потом раз и 1.00369!
 
Igor Knyazkov:

Здравствуйте. Есть есть код:

double ask1;

//+------------------------------------------------------------------+
void OnTick()
  {
double Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
if(ask1==0) ask1=Ask;

if(Ask>=ask1+5*_Point) {Alert(Ask+" "+ask1); ask1=Ask;}

  
  }


Смыл кода в том, что, если текущий аск больше(либо равен) предыдущего значения аск+5 пунктов, то Алерт. 

Почему разница между старой и новой Ценами Аск(судя по алертам) может превышать заданные 5 пунктов больше, чем на 3 пункта? Есть, даже, разница в 15 пунктов. 
Может ли  это происходить из-за режима тестирования "Каждый тик на основе реальных тиков"?

Вот написал по-скорому класс вам для удобной работы с тиками

//+------------------------------------------------------------------+
//|                                                   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;
      }
}
//+------------------------------------------------------------------+
 
Vladimir Karputov:
Нет. Цена может быть: 1.00356, 1.00356, а потом раз и 1.00369!
Это я и хотел услышать :) У меня тоже были такие мысли. 
 
Artyom Trishkin:

Вот написал по-скорому класс вам для удобной работы с тиками

//+------------------------------------------------------------------+
//|                                                   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;
      }
}
//+------------------------------------------------------------------+
Спасибо.
 
Igor Knyazkov:
Спасибо.
Не за что. Если не понятно - спрашивайте - ответим-покажем.