Как сделать, чтобы советник работал с частотой поступления 4-х разрядных котировок, когда на входе его 5-разрядные котировки.

 

Может это для кого-то боян, но мне только сегодня вдруг пришла мысль, как уменьшить нагрузку на компьютер, а для меня это актуально, когда я работаю на ноутбуке со слабым процессором и многие советники работают по тикам. Сегодня во время новостей терминал вообще завис, вот я и задумался, что можно сделать, как оградить советник от этой лавины котировок.  А вообще это актуально для тех, кому не нужны эти десятые доли пункта, нужны они возможно только тем, кто пипсует.

Чтобы обеспечить этот режим в начале функции  OnTick() вставляем такой код:

double PrevBid = 0;
void OnTick()
 {
//---
 if(MathAbs(Bid-PrevBid)>=10*Point)
   { 
    PrevBid=Bid;
   }
 else {return;} 
// далее код советника ...
// .......................
 }
 

Запомниться может промежуточная котировка, т.е. к примеру 1,23222 и будет вычитаться 1,23228 (а это уже 1,2322 и 1,2323 )

Лучше PrevBid=NormalizeDouble(Bid,4);

Предполагаю, не факт.

 
new-rena:

Запомниться может промежуточная котировка, т.е. к примеру 1,23222 и будет вычитаться 1,23228 (а это уже 1,2322 и 1,2323 )

Лучше PrevBid=NormalizeDouble(Bid,4);

Предполагаю, не факт.

Если вы хотите использовать эту фичу, значит вы согласны иметь котировки с точностью на порядок меньше. Но в таком случае для чего нам округление, которое меняет результат на эти десятые доли пункта. Но в принципе можно и так, кашу маслом не испортишь. Хотя лишняя функция, опять же лишняя нагрузка на процессор.)
 
khorosh:
Если вы хотите использовать эту фичу, значит вы согласны иметь котировки с точностью на порядок меньше. Но в таком случае для чего нам округление, которое меняет результат на эти десятые доли пункта. Но в принципе можно и так, кашу маслом не испортишь. Хотя лишняя функция, опять же лишняя нагрузка на процессор.)

То нужно две функции  =)

OnTick() // пункт с огрызками 

OnPips() // пункт 

 
А чем по таймеру плохо работать? Настройте в секундах или миллисекундах и регулируйте нагрузку.
 
khorosh:
Если вы хотите использовать эту фичу, значит вы согласны иметь котировки с точностью на порядок меньше. Но в таком случае для чего нам округление, которое меняет результат на эти десятые доли пункта. Но в принципе можно и так, кашу маслом не испортишь. Хотя лишняя функция, опять же лишняя нагрузка на процессор.)
Если откинуть десятые доли пункта (Ваш первый пост), то получится 4-х знак. Соответственно только его и берем в работу.
 
khorosh:
Если вы хотите использовать эту фичу, значит вы согласны иметь котировки с точностью на порядок меньше. Но в таком случае для чего нам округление, которое меняет результат на эти десятые доли пункта. Но в принципе можно и так, кашу маслом не испортишь. Хотя лишняя функция, опять же лишняя нагрузка на процессор.)

Тогда уж еще проще, только одно умножение:

static int px=0; 

int x=(int)(Bid*10000);

if(x==px)return;

px=x; 
 

Тогда уж надо учесть изменения не только Bid-котировок, но и Ask:

//+------------------------------------------------------------------+
//| Global variables
//+------------------------------------------------------------------+
   double nDelta;
// ...

//+------------------------------------------------------------------+
//| Expert initialization function
//+------------------------------------------------------------------+
int OnInit()
  {
   nDelta=MarketInfo(_Symbol, MODE_TICKSIZE)*10;
// ...
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function
//+------------------------------------------------------------------+
void OnTick()
  {
   static double nBid=0;
   static double nAsk=0;

// Выход, если котировки Bid/Ask изменились незначительно...
   if (MathAbs(Bid-nBid)<nDelta && MathAbs(Ask-nAsk)<nDelta) return; 

   nBid=Bid; nAsk=Ask;

// ...
  
  }

 
Dmitry Fedoseev:

Тогда уж еще проще, только одно умножение:

Чувствуется рука мастера.)
 
Eugene Myzrov:

Тогда уж надо учесть изменения не только Bid-котировок, но и Ask:

Согласен, логично.
 
Vladimir Zubov:
А чем по таймеру плохо работать? Настройте в секундах или миллисекундах и регулируйте нагрузку.
За один и тот же интервал времени изменение котировок может быть очень разным.
Причина обращения: