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

 
fxsaber #:

Костыль с задержкой понятен. Ищу подтягивание очереди.

Если ChartRedraw не сработает сразу, можно попробовать сначала выполнить для кастом-чарта ChartSetSymbolPeriod(реальный символ), а только потом ChartRedraw и ChartClose.

 
Stanislav Korotky #:

Если ChartRedraw не сработает сразу, можно попробовать сначала выполнить для кастом-чарта ChartSetSymbolPeriod(реальный символ), а только потом ChartRedraw и ChartClose.

Пробовал - не выходит. Код лаконичный, так что можете поэкспериментировать.

 

Только осваиваю кастомные символы, возможно, чего-то не понимаю, подскажите, плз.

Делаю вручную:

1. Создаю кастомный символ cMIX-3.23 из MIX-3.23, отличие - только название, описание, путь

2. Экспортирую тики из MIX-3.23 в файл

3. Импортирую из этого файла тики в cMIX-3.23

4. Экспортирую тики из сMIX-3.23 в файл

5. Сравниваю файлы

MIX-3.23_cMIX-3.23.diff

6c6
< 2022.04.18    10:36:53.445    0       0       0       0.00000000      0
---
> 2022.04.18    10:36:53.445    237350  305400                  6
234,235c234,235
< 2022.04.18    18:44:30.247    0       0       0       0.00000000      0
< 2022.04.18    18:52:52.412    0       0       0       0.00000000      0
---
> 2022.04.18    18:44:30.247    224825  284500                  6
> 2022.04.18    18:52:52.412    224825  284500                  6
...
3134c3134
< 2022.04.26    16:20:27.842    0       0       0       0.00000000      0
---
> 2022.04.26    16:20:27.842    222200  249300  225900  1.00000000      30
3148c3148
< 2022.04.26    16:23:21.820    0       0       0       0.00000000      0
---
> 2022.04.26    16:23:21.820    222525  249275  225900  1.00000000      30
...

Вижу, что "нулевые" тики из первого файла где-то получили только bid и ask и флаги 6, а где-то - bid, ask, last, volume и флаги 30.

Не могу понять, по какому критерию выбирается то или иное поведение.

 
На всякий случай продублирую 2 сообщения о багах в кастомных символах и тут.

https://www.mql5.com/ru/forum/455977/page36#comment_51240939 этот приводит к зависанию всего терминала.

https://www.mql5.com/ru/forum/455977/page36#comment_51241056 этот приводит к зависанию советника на удалении кастомного символа.
 

Кастом-символы по-прежнему невозможно нормально использовать из-за багов. Уже давно отсылал тест-кейс - осталось без внимания. Сейчас очередная попытка оптимизировать генерацию ренко вылилась в безрезультатные пляски с бубном.

Генерирую символ с тиками (чтобы можно было использовать режим по реальным тикам). Судя по получаемой истории - бары и тики формируются, но тестер упорно не хочет тики замечать - пишет в лог "no real ticks, every tick generation used". Специально проверял количество тиков, в частности, генерировал 4 тика за бар и ставил именно такой тиковый объем в бар, т.к. была идея, что из-за их случайного несоответствия могли тики игнорироваться, но нет - при соответствии не видит реальных тиков. Эпизодически получаю в тестере "history cache build error" - как воспроизвести - без понятия, и доп. диагностики - никакой.

Диалог просмотра истории работает через пень колоду. Например, в скриншоте 1 показано обычное бесконечное ожидание запроса тиков, то есть если не нажать кнопку Stop результат никогда не получите. Обращаю также внимание, что в полосе прогресса пишутся какие-то космические отрицательные проценты! На скриншоте 2 показаны тики, к которым 2 вопроса. 1) Почему они не отсортированы по хронологии (обычно более свежие вверху, более старые внизу, а здесь все даты вперемешку)? 2) Каким образом при запросе тиков с 30-го января в результаты попали тики за более ранние даты?

Могу прислать тест-кейс в MQ.

Файлы:
noticks.png  22 kb
badticks.png  55 kb
 
Stanislav Korotky #:

Генерирую символ с тиками (чтобы можно было использовать режим по реальным тикам).

Кастомные символы для Тестера так готовлю.

  1. С нуля создаю символ.
  2. Один раз CustomTicksReplace.
  3. Один раз CustomRatesReplace.
После этого все идеально в Тестере. Другие варианты не пробовал.
 

Не логичное поведение терминала при создании пользовательского символа.


Казалось бы создать копию реального символа должно быть просто.

1. Создаём пользовательский символ.

2. Копируем тики реального символа.

3. Добавляем скопированные тики в пользовательский символ.

Но нет. Бары строит нормально, а объёмы считает не правильно. И если в онлайне хоть как то получается заставить считать объёмы правильно, то на истории вообще никак.

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

А вот и нет, не будет красиво, так как при каждом обновлении бара CustomRatesUpdate(), у вас пересчитываются все индикаторы и моргает график.

Комментарии разрабов насчёт пересчёта индикаторов при каждом CustomRatesUpdate() я где то читал уже, сказали так надо и менять не будут.

А без CustomRatesUpdate() график строится с левыми объёмами. 

Тики есть, флаги тиков есть, а график строится положив *ер на эти флаги.  Ну как так то??? 

Создадим две копии любого символа. 

void OnStart()
  {
   datetime from = iTime(_Symbol, PERIOD_D1, 1);
   datetime to = TimeCurrent();

   MqlRates rates[];
   int sizeR = CopyRates(_Symbol, PERIOD_M1, from, to, rates);

   MqlTick tick[];
   int sizeT = CopyTicksRange(_Symbol, tick, COPY_TICKS_ALL, from * 1000);

//создаём пользовательский символ из тиков
   string c_Symbol = _Symbol + " 1";
   CustomSymbolCreate(c_Symbol, "\\" + c_Symbol, _Symbol);
// не зависимо от того, что использовать CustomTicksAdd или CustomTicksReplace, результат одинаков
   CustomTicksReplace(c_Symbol, tick[0].time_msc, tick[sizeT - 1].time_msc, tick);
   SymbolSelect(c_Symbol, true);
   ChartOpen(c_Symbol, PERIOD_M1);

//создаём пользовательский символ из тиков и из баров
   c_Symbol = _Symbol + " 2";
   CustomSymbolCreate(c_Symbol, "\\" + c_Symbol, _Symbol);
   CustomTicksReplace(c_Symbol, tick[0].time_msc, tick[sizeT - 1].time_msc, tick);
   CustomRatesReplace(c_Symbol, rates[0].time, rates[sizeR - 1].time, rates);

   SymbolSelect(c_Symbol, true);
   ChartOpen(c_Symbol, PERIOD_M1);
  }

Возьмём любой произвольный бар и запросим историю тиков.

Она будет абсолютно одинакова.

Но при запросе этого бара объёмы будут  разные.

Построенный только по тикам.

Построенный по тикам и барам.


Почему???

 

Чтоб в онлайне считало тиковые объёмы правильно использую такой код.

Найден методом научного тыка, хз почему, но работает.

 for(int i = 0; i < sizeT; i++)
     {
      if((tick[i].flags & TICK_FLAG_BID) != TICK_FLAG_BID)
         tick[i].bid = 0;
      if((tick[i].flags & TICK_FLAG_ASK) != TICK_FLAG_ASK)
         tick[i].ask = 0;
      if((tick[i].flags & TICK_FLAG_LAST) != TICK_FLAG_LAST)
         tick[i].last = 0;
      if((tick[i].flags & TICK_FLAG_VOLUME) != TICK_FLAG_VOLUME)
        {
         tick[i].volume = 0;
         tick[i].volume_real = 0;
        }
     }
 

Бред какой то.

Пол часа назад этот код правил тиковые объёмы только в онлайне. 

Сейчас если его добавить в скрипт графики строятся правильно и на истории.

Похоже я утомился слишком и где то ошибаюсь.

Господа программисты, у кого есть минутка свободного времени, проверь пожалуйста  этот код.

void OnStart()
  {
   datetime from = iTime(_Symbol, PERIOD_D1, 1);
   datetime to = TimeCurrent();

   MqlRates rates[];
   int sizeR = CopyRates(_Symbol, PERIOD_M1, from, to, rates);

   MqlTick tick[];
   int sizeT = CopyTicksRange(_Symbol, tick, COPY_TICKS_ALL, from * 1000);

   for(int i = 0; i < sizeT; i++)
     {
      if((tick[i].flags & TICK_FLAG_BID) != TICK_FLAG_BID)
         tick[i].bid = 0;
      if((tick[i].flags & TICK_FLAG_ASK) != TICK_FLAG_ASK)
         tick[i].ask = 0;
      if((tick[i].flags & TICK_FLAG_LAST) != TICK_FLAG_LAST)
         tick[i].last = 0;
      if((tick[i].flags & TICK_FLAG_VOLUME) != TICK_FLAG_VOLUME)
        {
         tick[i].volume = 0;
         tick[i].volume_real = 0;
        }
     }

//создаём пользовательский символ из тиков
   string c_Symbol = _Symbol + " 1";
   CustomSymbolCreate(c_Symbol, "\\" + c_Symbol, _Symbol);
// не зависимо от того, что использовать CustomTicksAdd или CustomTicksReplace, результат одинаков
   CustomTicksReplace(c_Symbol, tick[0].time_msc, tick[sizeT - 1].time_msc, tick);
   SymbolSelect(c_Symbol, true);
   ChartOpen(c_Symbol, PERIOD_M1);

//создаём пользовательский символ из тиков и из баров
   c_Symbol = _Symbol + " 2";
   CustomSymbolCreate(c_Symbol, "\\" + c_Symbol, _Symbol);
   CustomTicksReplace(c_Symbol, tick[0].time_msc, tick[sizeT - 1].time_msc, tick);
   CustomRatesReplace(c_Symbol, rates[0].time, rates[sizeR - 1].time, rates);

   SymbolSelect(c_Symbol, true);
   ChartOpen(c_Symbol, PERIOD_M1);
  }
//+------------------------------------------------------------------+

Как у вас он считает тиковые объёмы, правильно или нет?


P.S. В одном терминале  с котировками от Ф работает, а в другом, с метаквотовскими котировками не работает. 

Не понимаю.

 

И снова, Здравствуйте)))

Подскажите как ренко график должен отображать вот такую дырявую свечу?

У меня получилось как получилось, но мнится мне, что это не правильно.

Вроде нужно, чтоб рисовались кирпичи, даже если свеча дырявая. 

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