Скрипты: ThirdPartyTicks - страница 6

 

Доброго времени суток.

Перепиливал скрипты для теста на бирже обычной (не форекс). Помимо перепиливания некоторых вещей под себя натолкнулся на то, что в файле ticks.mqh функция  StringToDouble, которая используется для переводы цены, не учитывает случай, что цена может быть без точки вообще. Для себя я выправил. Но возможно Вам это будет интересно знать и тоже для себя подправить.

 
traveller00:

Доброго времени суток.

Перепиливал скрипты для теста на бирже обычной (не форекс). Помимо перепиливания некоторых вещей под себя натолкнулся на то, что в файле ticks.mqh функция  StringToDouble, которая используется для переводы цены, не учитывает случай, что цена может быть без точки вообще. Для себя я выправил. Но возможно Вам это будет интересно знать и тоже для себя подправить.

Удивили, что разбирались в коде. Спасибо за сообщение о баге, поправил так.

  return(point ? Res / TenPow[Pos - point] : Res);
 

Да, я для себя поправил почти так же.

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

1. В функции CreateAllSymbols вызывается ThirdPartyTicks[i].ToCustomSymbol(Sync, ...). Это приведёт к тому, что в каждом символе будет дёргаться  this.FilesOffline.Refresh(); что может быть небыстро, особенно если файлов тысячи и общий размер на десятки гигабайт. В идеале бы проверять, что с онлайна ничего нового не пришло, и тогда не обновлять на каждом символе.

2. В функции string ToCustomSymbol не видно проверок, что символ уже существует. Честно говоря, не проверял, что будет, в детали не вникал. Но для себя проверку подкостылил, чтобы при продолжении он для старых уже существующих символов снова все файлы не парсил.

P.S. Хочу выразить отдельное спасибо как за статью, так и за множество выложенных инструментов, весьма полезно.

 
traveller00:

Вы уверены, что взяли скрипт не из ZIP-файла? Там не актуальная версия совсем. Из-за этой проблемы часто возникают казусы, что какой-нибудь баг поправлен, но это остается незамеченным.

 
fxsaber:

Вы уверены, что взяли скрипт не из ZIP-файла?

На этот косяк я уже давно изначально налетел :) Потом заметил, что что-то не то, и перекачал все файлы руками по одному. Про ZIP тоже хотел отписать, но забыл. Так что по идее должен был работать с последней версией.

 
traveller00:

1. В функции CreateAllSymbols вызывается ThirdPartyTicks[i].ToCustomSymbol(Sync, ...). Это приведёт к тому, что в каждом символе будет дёргаться  this.FilesOffline.Refresh(); что может быть небыстро, особенно если файлов тысячи и общий размер на десятки гигабайт. В идеале бы проверять, что с онлайна ничего нового не пришло, и тогда не обновлять на каждом символе.

Задержки заметил когда-то давно с этим связанные, поэтому специально реализовывал обход проблемы. С тех пор торомозов нет.


Сейчас у меня 18 Гб архив и зипов > 35 000 штук. Все пашет быстро, без задеркек.


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

 
traveller00:

2. В функции string ToCustomSymbol не видно проверок, что символ уже существует. Честно говоря, не проверял, что будет, в детали не вникал. Но для себя проверку подкостылил, чтобы при продолжении он для старых уже существующих символов снова все файлы не парсил.

Специально так сделано. Архив ежесуточно дополняется новыми данными, поэтому даже если символ существует, его нужно дозаполнять.

К сожалению, пока не доходят руки сделать заполнение не с нуля. Еще не решил, как правильно, т.к. в скрипт встроены еще фильтры и т.д.


Но данное обстоятельство особых проблем не вносит, поэтому по приоритету решение этой задачи где-то в хвосте.

 
fxsaber:

специально реализовывал обход проблемы. С тех пор торомозов нет.

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

fxsaber:

Специально так сделано. Архив ежесуточно дополняется новыми данными, поэтому даже если символ существует, его нужно дозаполнять.

Подозревал, что дело в этом. Я Вас понял, ок.

 
traveller00:

Не заметил, почему может не парсить директорию на каждом символе заново.

В скрипте массовый запуск происходит через задание

sinput string symbol = "AllSymbols"; // Symbol (NULL - current, "AllSymbols" - All)


Возможно, у себя сделали иначе, поэтому на каждом символе шла проверка.

 
Да, всё верно, заполняется AllSymbols. Дёргается функция CreateAllSymbols(false, iMinPips); Внутри неё дёргается ThirdPartyTicks[i].ToCustomSymbol(Sync, где Sync задаётся true из параметров скрипта. И в функции Update будет по сути для каждого символа вызываться this.FilesOffline.Refresh(); который пойдёт парсить всю папку.
Причина обращения: