Советник исполняется только на половине приходящих тиков. Как учесть пропущенные?

 

Советник, собирающий статистику по количеству самосрабатываний:

void start()
{
  static int PrevTime = 0;
  static int CountBars = 1;
  static int ErrorBars = 0;
  static int Vol = 0, SumVolume = 0, SumVol = 0;
  string Str;
  
  if (PrevTime != Time[0])
  {
    if (NormalizeDouble(Volume[1] - Vol, 0) > 0.5)
    {
      ErrorBars++;
      SumVolume += Volume[1];
      SumVol += Vol;
      Str = TimeToStr(Time[1]) + " Volume = " + DoubleToStr(Volume[1], 0) + ", Vol = " + Vol +
            ", ErrorsBars / CountBars = " + ErrorBars + " / " + CountBars +
            " (" + DoubleToStr(100.0 * ErrorBars / CountBars, 1) + "%)" +
            ", SumVol / SumVolume = " + SumVol + " / " + SumVolume +
            " (" + DoubleToStr(100.0 * SumVol / SumVolume, 1) + "%)";
      Alert(Str);
    }
      
    PrevTime = Time[0];
    CountBars++;
    Vol = 0;
  }
  
  Vol++;
  
  return;
}

По результатам запуска на минутном таймфрэйме на ДЦ с плавающим спредом и дополнительной цифрой после запятой (Например, EURUSD = 1.57815) получилось, что советник срабатывает только на половине приходящих тиков.

Как учесть пропущенные тики? Хорошо,что из графика можно получить значения OHLC, но это только для цены Bid. А как получить те же значения для цены Ask при плавающем (десятки раз в минуту) спреде?

100% тиков можно получить через DDE, т.к. там присутствует накопительный буфер. Реализовывать такую простую по формулировке задачу (определение OHLC цены Ask) через средства DDE - мягко-говоря громоздко.

Прошу высказывать идеи решения данной проблемы.

Ну и конечно, по вышеназванной причине индикатор 'Tick_on_Chart' работает не так, как хотелось бы.

 
getch:

Советник, собирающий статистику по количеству самосрабатываний:

По результатам запуска на минутном таймфрэйме на ДЦ с плавающим спредом и дополнительной цифрой после запятой (Например, EURUSD = 1.57815) получилось, что советник срабатывает только на половине приходящих тиков.

Как учесть пропущенные тики? Хорошо,что из графика можно получить значения OHLC, но это только для цены Bid. А как получить те же значения для цены Ask при плавающем (десятки раз в минуту) спреде?

100% тиков можно получить через DDE, т.к. там присутствует накопительный буфер. Реализовывать такую простую по формулировке задачу (определение OHLC цены Ask) через средства DDE - мягко-говоря громоздко.

Прошу высказывать идеи решения данной проблемы.

Ну и конечно, по вышеназванной причине индикатор 'Tick_on_Chart' работает не так, как хотелось бы.

---

вы наверно путаете понятия! это условие может срабатывать или не срабатывать

но на каждом тике обязанн сработать - выполнится start () т е советник сработать должен! на каждом тике

а вот дальше что Вы делаете это уже от вас зависит

---

плавать может не только спред! но и уровень

MODE_STOPLEVEL 14 Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах

наблюдал не раз в "прямом эфире" как был раздвинут на 30п хотя оычно равен 2-4 бывают брокеры вообще без этого ограничения

читайте так же спред

double dSPREAD = MarketInfo( Symbol(), MODE_SPREAD );

кроме того при раздвинутом спреде допустим на 20 !!!

допустим Ask будет 1.6000

то Bid будет 1.5980

Bid при раздвинутом спреде Вам не дадут равным 1.5998

а вот STOPLEVEL могут раздвинуть до 30 пипс !!! и вы войти ПИПСАТОРОМ с короткими стопами и тейками не сможете хотя спред в порядке

имея Ask 1.6000 и Bid 1.5998 но при этом stop_level 30 а у вас тейк = 2-5 пипс!

 
YuraZ:

вы наверно путаете понятия! это условие может срабатывать или не срабатывать
но на каждом тике обязанн сработать - выполнится start () т е советник сработать должен! на каждом тике

Не обязан. Если тик приходит до того как советник закончит выполнение функции старт, советник его не увидит. Индикатор, кажется, тоже.
Простого решения проблемы топикстартера не вижу.

 

1. Тики приходят пачками. Бывает, что пачка состоит из одного тика.

2. Советник, состоящий из только пустой функции start() выполнится только на первом тике каждой пачки. Остальные тики проигнорируются.

3. При плавающем спреде цена Bid может не меняться, при этом цена Ask гуляет. И каждый тик - либо изменение цены Ask, либо изменение цены Bid.

4. У некоторых солидных ДЦ спред плавающий, т.е. спред меняется десятки раз в минуту. И это нормально.

5. Советник, код которого приведен выше, выполняется на выделенном сервере с великолепной связью не нескольких ДЦ. При это в разное время суток количество срабатываний происходит от 30% до 90% тиков. В среднем около 60%.

Мне нужны значения OHLC цены Ask. Как их получить без использования DDE еще не придумал. Может, кто подскажет.

 
komposter:
YuraZ:

вы наверно путаете понятия! это условие может срабатывать или не срабатывать
но на каждом тике обязанн сработать - выполнится start () т е советник сработать должен! на каждом тике

Не обязан. Если тик приходит до того как советник закончит выполнение функции старт, советник его не увидит. Индикатор, кажется, тоже.
Простого решения проблемы топикстартера не вижу.

это я знаю

если указатель кода находится в функции старт то конечно тик проигнорируется

( я просто не написал ПОДРОБНО )

---

если же эксперт не выполняется ! т е ждет и приходит ТИК то старт выполнится - за исключением проблемы "ЗАМОРОЖЕННЫХ ГРАФИКОВ"

 

2. Советник, состоящий из только пустой функции start() выполнится только на первом тике каждой пачки. Остальные тики проигнорируются.

 
getch:

Советник, собирающий статистику по количеству самосрабатываний:

По результатам запуска на минутном таймфрэйме на ДЦ с плавающим спредом и дополнительной цифрой после запятой (Например, EURUSD = 1.57815) получилось, что советник срабатывает только на половине приходящих тиков.

Как учесть пропущенные тики? Хорошо,что из графика можно получить значения OHLC, но это только для цены Bid. А как получить те же значения для цены Ask при плавающем (десятки раз в минуту) спреде?

100% тиков можно получить через DDE, т.к. там присутствует накопительный буфер. Реализовывать такую простую по формулировке задачу (определение OHLC цены Ask) через средства DDE - мягко-говоря громоздко.

Прошу высказывать идеи решения данной проблемы.

Ну и конечно, по вышеназванной причине индикатор 'Tick_on_Chart' работает не так, как хотелось бы.

getch:

2. Советник, состоящий из только пустой функции start() выполнится только на первом тике каждой пачки. Остальные тики проигнорируются.


Вы какие тики хотите учесть ?

1-ВСЕ ПРИХОДЯЩИЕ

( видимо нет раз ловите ТОЛЬКО первый тик в начало бара игнорируя другие )

2-ТОЛЬКО ПЕРВЫЙ тик в новый бар

согласно Вашего кода

  if (PrevTime != Time[0])

вы попадете в начало новой свечи

но не ФАКТ что именно на пером тике! вы можете попасть в него и на втором и третьем и т д

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

потому ловить начало бара конечно разумней времени

просто не факт что это будет первый тик в бар

 

Советник

void start()
{
  return;
}
не будет выполняться на каждом тике. Это и логично.
 
getch:

Советник

void start()
{
  return;
}
не будет выполняться на каждом тике. Это и логично.

ну да... во время новостей, в основном

а зачем ловить КАЖДЫЙ тик?

все равно не поймать КАЖДЫЙ!

 

5. Советник, код которого приведен выше, выполняется на выделенном сервере с великолепной связью на нескольких ДЦ. При это в разное время суток количество срабатываний происходит от 30% до 90% тиков. В среднем около 60%.

Нужен способ вычисления значений OHLC цены Ask. Например, вы хотите увидеть бары построенные по цене Ask, а не по Bid. Возможно, есть способ вычислить значения OHLC цены Ask не контролируя все тики. Может, кто подскажет.

 
getch:

5. Советник, код которого приведен выше, выполняется на выделенном сервере с великолепной связью на нескольких ДЦ. При это в разное время суток количество срабатываний происходит от 30% до 90% тиков. В среднем около 60%.

Нужен способ вычисления значений OHLC цены Ask. Например, вы хотите увидеть бары построенные по цене Ask, а не по Bid. Возможно, есть способ вычислить значения OHLC цены Ask не контролируя все тики. Может, кто подскажет.

Добавьте return после Vol = 0; и многое изменится.

Причина обращения: