Про слонов, часть 2

14 июля 2022, 17:21
Maxim Kuznetsov
0
33

Продолжение "предложения неслыханной щедрости" вызванное обновлением версии и некоторые детали причин. Напоминаю - тут раздаётся на "покатать" полезный тулз - инфопанелька, облегчающая жизнь

во первых про обновления :

Из видимых обновлений

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

- добавлены POI (Point Of Interest) - метки на экране, где цена делала что-то интересное. Это не зигзаг, не технический индикатор - просто подписаны визуально выдающиеся места. 

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

- исправлены некоторые баги и конечно-же внесены новые :-)

Шрифт везде КРУПНЫЙ. По двум причинам - основная это не хочу напрягать зрение во время отладки, и техническая - из всех шрифтов нормально рендерится на любом фоне только Courier от 10pt. 
Может есть и иной подходящий стандартный шрифт или хитрые приёмы рендинга шрифта, не знаю. Пока не нашёл

Художественное отступление номер раз, про GUI советников.

В реально торгующих советниках GUI должен быть убог :-) Не то чтобы совсем никакой, но минимальный до предела. Почти никакого интерактива.
Отображение только критически важной информации, без которой вообще совсем никак.

Немного иллюстрирую.

Скажем советник, просто печатает когда получает OnChartEvent:

int OnInit()
{
   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
void OnTick()
{
}

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   PrintFormat("OnChartEvent id=%d (%s), lparam=%d ,dparam=%f, sparam=%s",
      id,EnumToString((ENUM_CHART_EVENT)id),lparam,dparam,sparam);
}

И отдельно индикатор, который включит опции типичные для GUI:

input bool     MOUSE_MOVE=true;
input bool     MOUSE_WHEEL=true;
input bool     OBJECT_CREATE=true;
input bool     OBJECT_DELETE=true;
input int      CUSTOM_EVENT_EVERY=1;
int OnInit()
{
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,MOUSE_MOVE);
   ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,MOUSE_WHEEL);
   ChartSetInteger(0,CHART_EVENT_OBJECT_CREATE,OBJECT_CREATE);
   ChartSetInteger(0,CHART_EVENT_OBJECT_DELETE,OBJECT_DELETE);
   if (CUSTOM_EVENT_EVERY) {
      EventSetTimer(CUSTOM_EVENT_EVERY);
   }
   return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return(rates_total);
}
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
}

void OnTimer()
{
   EventChartCustom(0,0,0,0,"test");
}

Запускаем мега-советник и прикрепляем к его чарту супер-индикатор :

всё вот это вот дерьмо получает и вынужден обрабатывать советник. В свой OnChartEvent(). А в GUI ведь ещё и объекты, которые генерят OBJECT_CLICK, OBJECT_MODIFIED. К слову, если каждый тик выводится Bid,Ask то каждый тик генерятся дополнительные события OBJECT_MODIFIED

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

ВЫХОД : В торгующем советнике не должно быть OnChartEvent() вообще. 

То есть если советнику надо проверить состояние например своей кнопки, он проверит через ObjectGetInteger() когда сочтёт подходящим. Кстати ObjectGetInteger синхронная операция, то есть имеет непредсказуемое время работы (пока не будут обработаны все запросы к чарту. Не только от советника, а вообще все). Нельзя использовать синхронные операции между OrderSendAsync() и OnTradeTransaction(). И когда пошла "жара" - идёт активная торговля, тики летают как сумасшедшие, то тоже нельзя. 

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

Это конечно ещё не всё, это вообще только вершина айсберга, но остальное в следующих частях.

Приложена очередная версия индикатор-панельки,  для демок без ограничений, для реала - 2 месяца 


Файлы:
ChartMan.ex5  211 kb
Поделитесь с друзьями: