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

 

О чем разговор-то? Я как вижу советник заточен работать 1 раз на бар.

 
Советник написан правильно. Вникните просто повнимательнее.
 
Понял
 
getch:
Советник написан правильно. Вникните просто повнимательнее.

Я имел ввиду, что условие

if (NormalizeDouble(Volume[1] - Vol, 0) > 0.5)
не выполняется во многих случаях. У вас Vol == 0 только при старте программы, далее он не бывает меньше 1. При таком условии, во-первых, не будет срабатывать на всех барах, у которых предыдущий бар имел объем =1. Во вторых, если к примеру три бара шли с объемами 1, 1, 2, то программа войдет в этот блок if() только после бара с объемом не менее 5. Вникните просто повнимательнее.

Если там вместо Vol=0; написать Vol=-1; то выглядеть будет коряво, но логика будет правильнее, т.к далнейший Vol++; всё поставит на свои места

 
petrov:
getch:
Советник написан правильно. Вникните просто повнимательнее.

Я имел ввиду, что условие

if (NormalizeDouble(Volume[1] - Vol, 0) > 0.5)
не выполняется во многих случаях. У вас Vol == 0 только при старте программы, далее он не бывает меньше 1. При таком условии, во-первых, не будет срабатывать на всех барах, у которых предыдущий бар имел объем =1. Во вторых, если к примеру три бара шли с объемами 1, 1, 2, то программа войдет в этот блок if() только после бара с объемом не менее 5. Вникните просто повнимательнее.

Значение Vol после старта программы все время не меньше 1. И это верно. Условие срабатывает только тогда, когда объем предыдущего бара (количество тиков в предыдущем баре) не равен количеству запусков советника на предыдущем баре.

 

А, ну так вы логику не объяснили

 

Если посчитать объемы по младшим таймфреймам и сравнить со старшим - тоже не будет совпадать.

 

Речь не о совпадении сумм объемов на разных таймфреймах. Проблема проста по сути, как определить OHLC цены Ask? Через советники и индикаторы этого не сделать, т.к. они запускаются не на каждом тике. Через DDE возможно отследить, но это надо еще сохранять условие запуска только одного терминала с DDE. Но ведь можно напрямую из памяти терминала получать эти данные.

На самом деле проблема очень актуальна. С недавнего времени несколько именитых брокеров стали предоставлять возможность вести торговлю через MT4. Клиенты не могут отследить цену Ask и посылают не по своей вине в службу технической поддержки часто несправедливые претензии по неисполнению limit-ордеров и TakeProfit-уровней по цене Ask. У клиентов нет инструментария в терминале отслеживать цену Ask. И далеко не каждый способен освоить DDE.

Уважаемые разработчики, приоткройте занавес в этом направлении. Это не навредит, а только устранит проблемы и клиентам с неправильными претензиями и брокерам, несущим ответы на претензии и оправдывающимя на различных форумах.

Нужен инструмент мониторинга цены Ask. Можете вы дать информацию, по которой будет возможно написать DLL для отслеживания цены Ask?

 

Попробуйте такой вариант советника:

//+------------------------------------------------------------------+
//|                                            Getch_TickCounter.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  static int PrevTime = 0;
  static int CountBars = 1;
  static int ErrorBars = 0;
  static int Ticks = 0, SumVolume = 0, SumVol = 0;
  string Str;
  bool first = true;
  
  datetime currTime=TimeCurrent();
  if (PrevTime != Time[0])
    {
    Print("New bar starting:",TimeToStr(Time[0]));
    if (NormalizeDouble(Volume[1] - Ticks, 0) > 0.5)
      {
      if (first) 
         {
         PrevTime = Time[0];
         Ticks = Volume[0];
         first=false;
         return;
         }
      ErrorBars++;
      SumVolume += Volume[1];
      SumVol += Ticks;
      Str = TimeToStr(Time[1]) + " Volume[1] = " + DoubleToStr(Volume[1], 0) + ", Ticks = " + Ticks +
            ", 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++;
    Ticks = 0;
    }
  
  Ticks++;
  
//----
  return;
   }
 
Rosh, спасибо за советник. Но вы же сами понимаете, что это одно и то же. Вопрос определения значений OHLC цены Ask так и остается открытым. Советники не вызываются на каждом тике и это обоснованно. Официально-обнародованным механизмом контроля 100% тиков является только DDE со своими ньюансами. Я написал в предыдущем посте причины необходимости определения значений OHLC цены Ask. Уважаемые разработчики, прошу вас дать информацию получения 100% тиков, либо значений OHLC цены Ask без использования DDE. С Уважением.
Причина обращения: