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

 
Eugene Myzrov:

Тогда уж надо учесть изменения не только 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 && TimeCurrent()!=Time[0]) return; 

   nBid=Bid; nAsk=Ask;

// ...
  
  }
А если в советнике какие-то операции выполняются по ценам открытия, то надо добавить  выделенное красным цветом, чтобы не пропустить момент.
 

у вас не такой ноутбук?

 

 
khorosh:
А если в советнике какие-то операции выполняются по ценам открытия, то надо добавить  выделенное красным цветом, чтобы не пропустить момент.
А есть смысл бид и аск отдельно считать? в тестере все равно не сработает
 
Maxim Dmitrievsky:
А есть смысл бид и аск отдельно считать? в тестере все равно не сработает
А вы свои эксперты только для тестера делаете?
 
Maxim Dmitrievsky:

у вас не такой ноутбук?

 

Toshiba модель SATELLITE A200-29L. Когда на одном инструменте нормально, а я на 6 работаю.

 
Maxim DmitrievskyА есть смысл бид и аск отдельно считать? в тестере все равно не сработает
Как так не сработает?! В тестере также как и в реале доступны для обработки обе цены и Bid и Ask.
 
khorosh: А если в советнике какие-то операции выполняются по ценам открытия, то надо добавить  выделенное красным цветом, чтобы не пропустить момент.

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

 && TimeCurrent()!=Time[0]

ненадежно отлавливает начало нового бара.


Тогда уж так (изменения выделены красным цветом):

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

// ...

//+------------------------------------------------------------------+
//| Определить появление нового бара на текущем графике
//+------------------------------------------------------------------+
bool IsNewBar()
{  bool ok=false; 
   static datetime dLastTime=0; // последнее известное время открытия текущего бара
   datetime dNewTime=Time[0];   // время открытия текущего бара
   if      (dNewTime>dLastTime) {dLastTime=dNewTime; ok=true;}
   return(ok);
}
 
Eugene Myzrov:
Как так не сработает?! В тестере также как и в реале доступны для обработки обе цены и Bid и Ask.
спред все равно фиксированный
 
khorosh:
А вы свои эксперты только для тестера делаете?
а какие есть еще способы сделать бэктест? Мне сложно в уме представить будет написанный код зарабатывать или нет (хотя бы в тестере)
 
Eugene Myzrov:

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

ненадежно отлавливает начало нового бара.


Тогда уж так (изменения выделены красным цветом):

Eugene Myzrov:

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

ненадежно отлавливает начало нового бара.



Тогда уж так (изменения выделены красным цветом):

Можно и так, только лишняя пользовательская функция добавляется. А может для надёжности моего дополнения сделать так? 

&& NormalizeDouble(TimeCurrent()/10,0)!=NormalizeDouble(Time[0]/10,0)
Причина обращения: