График синтетического инструмента

 

Уважаемые программисты! Помогите пожайлуста доделать скрипт для построения синтетического инструмента.   

    Недавно увлекся торговлей товарных календарных и интерконтрактных спредов на фьючерсном рынке. В связи с этим появилась необходимость в графиках синтетических иструментов. Смысл в том, что надо построить свечной график, рассчитаный по разнице цен OHLC например между бензином (XRB) и мазутом (HO). Я попытался решить эту задачу своими силами, так как формула расчета довольно проста - надо найти всего лишь разницу между ценами инструментов и записать полученные значения в файл истории, и далее уже в автономном режиме их использовать, применяя к ним всевозможные индикаторы. Благо, существует несколько готовых скриптов записывающих синтетические графики, например PeriodConverter. Решил начать с простого. Скопировал из PeriodConverter часть кода, который записывает файл истории. Написал простую функцию, которая вычитает из цен одного инструмента, цены другого инструмента по соответствующим барам (с одним и тем же временем открытия). Чтобы пока не возиться с написанием кода для синхронизации баров двух инструментов по времени открытия, ввел параметр, который выделяет для рассчета только последние, скажем 50 баров, так как в большинстве случаев эти последние бары нет необходимости синхронизировать как по времени открытия, так и по индексации, они и так синхронизированы. Заведомо скомбинировал инструменты таким образом, чтобы при вычислениях не получалось отрицательных значений цен, так как насколько я знаю, терминал не выводит их на график. И получился скрипт синтетического инструмента.

Однако при открытии синтетического графика в автономном режиме, на него не выводяться более половины рассчитаных баров! Но при замене в скрипте операций вычитания цен на операцию сложения, на график выводятся все рассчитаные бары. Чем же так отличается операция вычитания от операции сложения?  То же самое получается и с операциями умножения и деления - при умножении соответствующих цен, бары синтетического графика выводиться нормально, а при делении опять выводиться меньше половины баров! Вы можете сказать, что при делении возможно в знаменатель вкрался ноль. Но я проверял рассчитанные массивы функцией Comment, и она выводила каждый раз корректные значения, т.е. операции деления на ноль в моих тестах не было. Позже заметил, что первоначально в файл записываются все рассчитанные бары. Но после открытия этого графика размер файла уменьшался более чем в два раза. Из этого я понял, что терминал МТ4 по каким то неведомым причинам удаляет неугодные ему бары. 

Если Вам не сложно уважаемы профессионалы, подскажите в чем зарыта собака! Выкладываю во вложениии свое творчество. Посмотрите пожайлуста код, что там надо добавить или изменить, чтобы скрипт заработал нормально. Мне хотя бы получить автономные графики, не обязательно чтобы он обновлялся в реальном времени, так как торговля спредами обычно подразумевается на среднесрочных масштабах, в расчете от нескольких дней до нескольких недель, поэтому скорость построения графиков не критична. Или возможно данная идея создания подобных графиков вообще не выполнима? 

Файлы:
spred_1.mq4  6 kb
 

Корректно такой график строить только по ценам закрытия - нельзя ведь предполагать, что в момент, когда на одном инструменте образуется High, на другом тоже образуется High (или Low, на обратно-коррелируемых). К тому же, у Вас нет контроля правильности построения свечи (хай выше лоу). Из-за этого, в журнале терминала идут ошибки: 2012.12.24 16:08:00 HistoryBase: 10 errors in 'EURUSD10'. Ну и последняя рекомендация - сохраняйте график под нестандартным таймфреймом (2 мин, 3 мин...).

 
Спасибо большое! Хоть зацепку мне дали. Похоже, еще надо долго набираться опыта в программировании. Буду смотреть и пытаться угомонить бунтующий терминал! (здесь хотел смайлик вставить, но не нашел).
 
Смотри-ка, точно! Алертом вывел то, что считают формулы. И действительно многие свечи не правильно строятся (вроде того, что хай ниже лоу). Потому и выкидываются свечки из графика. Буду думать, как перехитрить терминал.
 
Fanat2012:
Смотри-ка, точно! Алертом вывел то, что считают формулы. И действительно многие свечи не правильно строятся (вроде того, что хай ниже лоу). Потому и выкидываются свечки из графика. Буду думать, как перехитрить терминал.

Дыры заполняйте последним известным значением до дыры.
 
Fanat2012:
Смотри-ка, точно! Алертом вывел то, что считают формулы. И действительно многие свечи не правильно строятся (вроде того, что хай ниже лоу). Потому и выкидываются свечки из графика. Буду думать, как перехитрить терминал.

Перехитрить - элементарно. High  = Max(Open, Close, High, Low), Low = Min(Open, Close, High, Low)
 
только все-таки лучше построить график только Close цен(Open = Close, High = Close, Low = Close). Практически все индикаторы будут работать на таких графиках.
 
Большое спасибо всем! Обязательно учту ваши советы. Теперь дело задвигалось. Буду дорабатывать скрипт, уже кое-что получается, почти полноценный график. Лучше конечно по тикам собирать бары для максимальной точности.
 

Вот, пока на этом остановился. В прошлых данных максимумы и минимумы уже особой важности не имеют и главное значение остается за ценами закрытия для построения индикаторов. Что не скажешь о ценах, которые вблизи к правому краю графика. Думаю поступить так - последние бары собирать из минуток или даже из тиков. Для этого надо будет сделать скрипт с обновлением по тикам. Сейчас пока попробую доработать синхронизацию баров по времени. 

 

Файлы:
spred_1.zip  2 kb
 
Fanat2012:

Вот, пока на этом остановился. В прошлых данных максимумы и минимумы уже особой важности не имеют и главное значение остается за ценами закрытия для построения индикаторов. Что не скажешь о ценах, которые вблизи к правому краю графика. Думаю поступить так - последние бары собирать из минуток или даже из тиков. Для этого надо будет сделать скрипт с обновлением по тикам. Сейчас пока попробую доработать синхронизацию баров по времени. 

 

Успехов, может поможет избежать ошибок : HistoryBase: 6 errors in ...
 
BoraBo:
Успехов, может поможет избежать ошибок : HistoryBase: 6 errors in ...


Благодарю, все сгодится! Над скриптом еще надо будет много поработать.
Причина обращения: