Учёба. Классы. Нужна помощь. - страница 35

 
lynxntech #:

это версия для нубов, как и использования newbar функцию

иначе говоря подходит нубам и инвесторам,

У меня скальпер не знает, что такое бары, свечи и сверхэффективные MACD и волшебные полосы Болинджера. Но интересно, что вы используете вместо newbar?

 
Denis Kirichenko #:


А что подразумевает тут индекс?

Индекс символа за которым будем следить)

Наверное понятнее всего будет, показать  код.

int OnInit()
  {
   string symbol[3] = {"SBER", "VTBR", "BSPB"};
   for(int i = 0; i < 3; i++)
      iCustom(symbol[i], PERIOD_W1, "Spy", ChartID(), i, SpyVar);

Запустили три шпиона, у каждого символа теперь  есть  свой индекс.

В индикаторе создаётся событие и отправляется в нужный чарт

EventChartCustom(Chart, 0, Index, 0, NULL);

Потом получаем событие OnChartEvent

void OnChartEvent(const int id, const long & lparam, const double &, const string &)
  {
   if(id == CHARTEVENT_CUSTOM)
      // обрабатываем полученный новый тик/новый бар
      Tick((int)lparam);
  }

lparam-индекс символа

Кто то писал о проблеме сбросе событий при переполнении очереди в  OnChartEvent. Соответственно предполагаются потери тиков.

На деле проблема прямо противоположная. Очередь слишком большая и встаёт вопрос о принудительном её сбросе.

Это тоже уже решено.

//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double &, const string &)
  {
   static bool Unlock = true;

   if(tester)
     {
      if(id == CHARTEVENT_CUSTOM && Unlock)
        {
         Unlock = false;
         //  обрабатываем полученный новый тик/новый бар
         Tick((int)lparam);
         if(!EventChartCustom(0, 10, 0, 0, ""))
            Unlock = true;
        }
      if(id == CHARTEVENT_CUSTOM + 10)
         Unlock = true;
     }
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

lparam-индекс символа

Дополню, что нужен для производительности.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Virtual

fxsaber, 2023.12.10 13:33

Выглядит, как самойбийство такая конструкция на каждом тике в мультивалютном советнике.

for (uint i = OrdersTotal(); (bool)i--;)
  if (OrderSelect(i, SELECT_BY_POS) &&
      (OrderType() == Type) &&
      (OrderMagicNumber() == Magic) &&
      (OrderSymbol() == Symbols[Num]))
  {
    OrderModify(...);
  }

Такой MT4-style подход можно было оправдать в MT4-тестере, т.к. тот моновалютный. Но в MT5-тестере - ужас писать подобное.


Целесообразно так.

for (uint i = OrdersTotal(); (bool)i--;)
  if (OrderSelect(i, SELECT_BY_POS) &&
      (OrderType() == Type) &&
      (OrderMagicNumber() == Magic) &&
      (OrderSymbolID() == Num))
  {
    OrderModify(...);
  }
 
Aleksandr Slavskii #:

Индекс символа за которым будем следить)

Наверное понятнее всего будет, показать  код.

Запустили три шпиона, у каждого символа теперь  есть  свой индекс.

В индикаторе создаётся событие и отправляется в нужный чарт

Потом получаем событие OnChartEvent

lparam-индекс символа

Кто то писал о проблеме сбросе событий при переполнении очереди в  OnChartEvent. Соответственно предполагаются потери тиков.

На деле проблема прямо противоположная. Очередь слишком большая и встаёт вопрос о принудительном её сбросе.

Это тоже уже решено.

Александр, спасибо! Всё ясно. Насколько понимаю, в Вашей версии не обрабатывается ситуация, когда есть обрыв связи, и пропустили несколько баров, о чём, по идее, должна сообщить программа. Об это писал коллега Груздев в своей христоматийной статье.

Обработчик события "новый бар"
Обработчик события "новый бар"
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 
Denis Kirichenko #:

Александр, спасибо! Всё ясно. Насколько понимаю, в Вашей версии не обрабатывается ситуация, когда есть обрыв связи, и пропустили несколько баров, о чём, по идее, должна сообщить программа. Об это писал коллега Груздев в своей христоматийной статье.

"должна сообщить программа"

Кому должна? Почему должна?  Шутка)

Я думаю, что обработать ситуацию обрыв связи, пропущенные бары и прочее это скорее к наследованию, тема то у нас про ООП )))

Здесь пример узкоспециализированного кода, только для тестера и только новый бар/новый тик при мульти символьной торговле.


ЗЫ. Не сразу дошло "обрыв связи", этот код только для тестера. В тестере даёт приличный прирост в скорости.

В онлайн торговле к сожалению результат прямо противоположный.

Событие OnChartEvent, может тормозить до нескольких секунд, что совершенно не приемлемо в работе советника.

Поэтому в онлайне приходится переходить на таймер и соответственно другие методы определения нового бара.

 
Aleksandr Slavskii #:

Кому должна? Почему должна?  Шутка)

Я думаю, что обработать ситуацию обрыв связи, пропущенные бары и прочее это скорее к наследованию, тема то у нас про ООП )))

Здесь пример узкоспециализированного кода, только для тестера и только новый бар/новый тик при мульти символьной торговле.


ЗЫ. Не сразу дошло "обрыв связи", этот код только для тестера. В тестере даёт приличный прирост в скорости.

В онлайн торговле к сожалению результат прямо противоположный.

Событие OnChartEvent, может тормозить до нескольких секунд, что совершенно не приемлемо в работе советника.

Поэтому в онлайне приходится переходить на таймер и соответственно другие методы определения нового бара.

Ясно. Спасибо, что поделились опытом ))

 
Denis Kirichenko #:

не обрабатывается ситуация, когда есть обрыв связи

На реале - CopyTicks, на данных которых торгует своя ТС в виртуальном торговом окружении. А дальше просто синхронизируем реальное окружение к виртуальному.

 
Alexey Volchanskiy #:

У меня скальпер не знает, что такое бары, свечи и сверхэффективные MACD и волшебные полосы Болинджера. Но интересно, что вы используете вместо newbar?

https://vkvideo.ru/video360579093_456247765

Жаль, что нам так и не удалось услышать начальника транспортного цеха.Весёлые, потому что умные, идейно опьянённые, с гениальным
Жаль, что нам так и не удалось услышать начальника транспортного цеха.Весёлые, потому что умные, идейно опьянённые, с гениальным
  • vkvideo.ru
Что нам мешает, то нам не поможет. Нашлись люди, нашлись. Весёлые, потому что умные, идейно опьянённые, с гениальным лидером. Театр царского абсурда превратили в могучую Державу - СССР.
 
Alexey Volchanskiy #:
У меня скальпер не знает, что такое бары, свечи и сверхэффективные MACD и волшебные полосы Болинджера. Но интересно, что вы используете вместо newbar?

вообще не использую newbar,

на М1 стоит шпион, он смотрит приход тиков с нужных символов

для чего новый бар? смотреть данные с закрытого?, он и так увидит на новой минуте новый бар и будет смотреть сигнал по символу,

только в отличие от жесткого newbar, который если лажанет с реквотой или спредом и еще ряд событий есть, то отправит робота ждать новой минуты и сигнала

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

add

иcпользовал Newbar, думал в тестере выиграю на лишних проходах, наверное там есть выигрыш, но надо что-то делать с неотработкой сигнала, и что делать с сопровождением позиций?

как только нормально стал использовать шпиона вместо холостых прокручиваний символов в цикле, то это чудо просто, робот спит если нет тика, и спит на выходных, а не в таймере по выходным время прокручивает на работу рынка)

да есть какой-то момент что проскальзывает в OnChartEvent где-то событие спотыкается, но это редкое явление, и оно по сравнению с OnTick и Таймером которые в цикле крутят, небольшая разница,

в OnTick мы получаем с самого быстрого символа когда он наступит крутим это колесо, а если тик на важный символ раньше был, а он как раз в конце рабочего списка находится и ждет пока до него очередь дойдет, тоже самое с таймером

в шпиона то конкретно приходит с нужного символа и нет прокрутика массива, нет тика с нужного инструмента, инструмент спит, рынок закрыт - спит весь робот

 

сам индикатор шпион

#property indicator_chart_window
#property indicator_plots 0

int OnCalculate(const int rates_total,     // размер массива price[]
                const int prev_calculated, // обработано баров на предыдущем вызове
                const int begin,           // откуда начинаются значимые данные
                const double& price[]      // массив для расчета
               )
  {
      EventChartCustom(0,0,0,0.0,NULL); // посылает событие new tick
//---
   return(rates_total);
  }