Глюк в экспертописании.

 
При разработке эксперта хочу что-бы открывались сделки только на открытии свечи.
Для этого использую следующий код:

int start(){
   if (newb()==false)  return(0);
}
//+----------------------------------------------------------------------------+
//|  Открытие только на новом баре                              |
//+----------------------------------------------------------------------------+
bool newb()  {
  static int knw;
  if (Time[0]==knw) return(false); 
  knw=Time[0]; return(true); 
}


Но как в тестере так и на демо счете, нет да нет, а проскальзовают сделки открываемые не на начальном баре.
В чем я ошибся, где слабое звено в этом коде.

 
datetime knw;
 
int start(){
   if (newb()==false)  return(0);
}
//+----------------------------------------------------------------------------+
//|  Открытие только на новом баре                              |
//+----------------------------------------------------------------------------+
bool newb()  
{
  if (Time[0]==knw) return(false); 
  knw=Time[0]; return(true); 
}
Я бы сделал бы вот так
 
solandr писал (а):
datetime knw;
 
int start(){
   if (newb()==false)  return(0);
}
//+----------------------------------------------------------------------------+
//|  Открытие только на новом баре                              |
//+----------------------------------------------------------------------------+
bool newb()  
{
  if (Time[0]==knw) return(false); 
  knw=Time[0]; return(true); 
}
Я бы сделал бы вот так

попробывал, результат не изменился.
 
HIDDEN:
При разработке эксперта хочу что-бы открывались сделки только на открытии свечи.
Для этого использую следующий код:

int start(){
   if (newb()==false)  return(0);
}
//+----------------------------------------------------------------------------+
//|  Открытие только на новом баре                              |
//+----------------------------------------------------------------------------+
bool newb()  {
  static int knw;
  if (Time[0]==knw) return(false); 
  knw=Time[0]; return(true); 
}


Но как в тестере так и на демо счете, нет да нет, а проскальзовают сделки открываемые не на начальном баре.
В чем я ошибся, где слабое звено в этом коде.



А что значит не на начальном баре? То есть пришёл тик нового бара и, по идее, вы должны на нём открыться, но в реальности (как на демо таки и в тестере) открываетесь не на первом тике нового бара? Возможно что пока вы делаете какие то расчёты то приходят новые тики и надо сделать update чтобы массивы с котировками для эксперта обновились. Но такая проблема может быть на демо но не в тестере, я думаю.
 
elritmo писал (а):
HIDDEN писал (а):
При разработке эксперта хочу что-бы открывались сделки только на открытии свечи.
Для этого использую следующий код:

int start(){
   if (newb()==false)  return(0);
}
//+----------------------------------------------------------------------------+
//|  Открытие только на новом баре                              |
//+----------------------------------------------------------------------------+
bool newb()  {
  static int knw;
  if (Time[0]==knw) return(false); 
  knw=Time[0]; return(true); 
}


Но как в тестере так и на демо счете, нет да нет, а проскальзовают сделки открываемые не на начальном баре.
В чем я ошибся, где слабое звено в этом коде.



А что значит не на начальном баре? То есть пришёл тик нового бара и, по идее, вы должны на нём открыться, но в реальности (как на демо таки и в тестере) открываетесь не на первом тике нового бара? Возможно что пока вы делаете какие то расчёты то приходят новые тики и надо сделать update чтобы массивы с котировками для эксперта обновились. Но такая проблема может быть на демо но не в тестере, я думаю.


Есть опен бара. все расчёты делаются по приходу данного тика. Посчитали и если все устраивает вошли, если нет ждем нового опен бара и делаем расчёт.
В моём случае получается иногда, что можем войти и не на опен бара, а где-то в его середине.

С приходом 2-го тика ничего пересчитываться не должно (на опен баре), так как это уже не опен бара, а 2-й тик. И сколько бы расчёт не велся это никак не должно влиять на пересчеты.
 
datetime TimeOpen;
 
bool StartProgram()
   {
   if(TimeOpen != Time[0])
      {
      TimeOpen = Time[0];
      return(true);
      }else
      return(false);
   }
 
void start()
  {   
 
if(StartProgram()) // --- код на цене открытия
      {
       Print("Новый бар");
      }
 
  }
 
HIDDEN:
В моём случае получается иногда, что можем войти и не на опен бара, а где-то в его середине.
Как ты определяешь, что это не первый тик бара?
Никто же не давал гарантий, что бар откроется в 00 секунд? ;)
 
HIDDEN:
elritmo:
HIDDEN:
При разработке эксперта хочу что-бы открывались сделки только на открытии свечи.
Для этого использую следующий код:

int start(){
   if (newb()==false)  return(0);
}
//+----------------------------------------------------------------------------+
//|  Открытие только на новом баре                              |
//+----------------------------------------------------------------------------+
bool newb()  {
  static int knw;
  if (Time[0]==knw) return(false); 
  knw=Time[0]; return(true); 
}


Но как в тестере так и на демо счете, нет да нет, а проскальзовают сделки открываемые не на начальном баре.
В чем я ошибся, где слабое звено в этом коде.



А что значит не на начальном баре? То есть пришёл тик нового бара и, по идее, вы должны на нём открыться, но в реальности (как на демо таки и в тестере) открываетесь не на первом тике нового бара? Возможно что пока вы делаете какие то расчёты то приходят новые тики и надо сделать update чтобы массивы с котировками для эксперта обновились. Но такая проблема может быть на демо но не в тестере, я думаю.


Есть опен бара. все расчёты делаются по приходу данного тика. Посчитали и если все устраивает вошли, если нет ждем нового опен бара и делаем расчёт.
В моём случае получается иногда, что можем войти и не на опен бара, а где-то в его середине.

С приходом 2-го тика ничего пересчитываться не должно (на опен баре), так как это уже не опен бара, а 2-й тик. И сколько бы расчёт не велся это никак не должно влиять на пересчеты.
нет я имею ввиду что вы вошли в функцию start делаете там какие то проверки и если новый тик нового бара то даже какие то вычисления и сравнения и за это время уже может прийти новый тик или даже несколько и значение Bid будет уже не актуальным. Для этого перед окрытием новой позиции рекомендуется сделать UpdateRates или как там эта функция называется. А когда вы открываете позицию до у вас есть видимо допустимое отклонение от запрашиваемой цены и если вы в него укладываетесь то открытья можете уже не на пришедшем тике а на каком то новом значение цены которого отличается от цены на первом тике бара на допустимую величину. Но это думаю не актуально для тестера. А у вас и там тоже проблемы наблюдаются
 
komposter писал (а):
HIDDEN писал (а):
В моём случае получается иногда, что можем войти и не на опен бара, а где-то в его середине.
Как ты определяешь, что это не первый тик бара?
Никто же не давал гарантий, что бар откроется в 00 секунд? ;)

Так Time[0] как раз возвращает время открытия бара, а когда уж от нтам открылся не суть вожна в моём случае. просто если есть новое время отличное от старого, то делаем расчет.
Если расчет даёт сигнал к открытию ордера, то делаем расчеты тейка и стопа и входим по рынку.
 
HIDDEN:
Так Time[0] как раз возвращает время открытия бара, а когда уж от нтам открылся не суть вожна в моём случае. просто если есть новое время отличное от старого, то делаем расчет.
Если расчет даёт сигнал к открытию ордера, то делаем расчеты тейка и стопа и входим по рынку.
Стоп. Проблема в чем - позиция открывается не на первом тике бара, или открывается 2 позиции на одном баре?
Если первое, то смотри предыдущий пост - как проверяется, что тик не первый?

А если второе, то не верю =) Только если knv обнуляется где-то посреди start-а.
 
komposter писал (а):
HIDDEN писал (а):
Так Time[0] как раз возвращает время открытия бара, а когда уж от нтам открылся не суть вожна в моём случае. просто если есть новое время отличное от старого, то делаем расчет.
Если расчет даёт сигнал к открытию ордера, то делаем расчеты тейка и стопа и входим по рынку.
Стоп. Проблема в чем - позиция открывается не на первом тике бара, или открывается 2 позиции на одном баре?
Если первое, то смотри предыдущий пост - как проверяется, что тик не первый?

А если второе, то не верю =) Только если knv обнуляется где-то посреди start-а.

Вечерком порою в коде, или для примера напишу приметивный советник который показывает данную ситуацию.
Причина обращения: