Посмотрите статью Построение мультивалютного индикатора с применением множества промежуточных индикаторных буферов
Спасибо за информацию. Я примерно такую штуку и пытаюсь сообразить. Но у этого индикатора наблюдаются такие же проблемы как и у моего, если увеличить количество калькулируемых баров, то происходит рассинхронизация (у MultiCurrencyIndex.mq5 по умолчанию =500). Где-то в хелпе мт5, не помню точно где, встречал текст смысл которого заключался в том, что исторические данные имеют ограничения для устранения ресурсных перегрузок.
Вопрос: можно как-то управлять этими ограничениями. И вообще о каких ограничениях истории можно говорить, когда мой МТ5 уже весит полтора гигабайта благодаря историческим данным.
Спасибо за информацию. Я примерно такую штуку и пытаюсь сообразить. Но у этого индикатора наблюдаются такие же проблемы как и у моего, если увеличить количество калькулируемых баров, то происходит рассинхронизация (у MultiCurrencyIndex.mq5 по умолчанию =500). Где-то в хелпе мт5, не помню точно где, встречал текст смысл которого заключался в том, что исторические данные имеют ограничения для устранения ресурсных перегрузок.
Вопрос: можно как-то управлять этими ограничениями. И вообще о каких ограничениях истории можно говорить, когда мой МТ5 уже весит полтора гигабайта благодаря историческим данным.
надо синхронизировать по барам времени :
1. на текущем таймфрейме берете последний бар
2. смотрите его время
3. в цикле начиная от текущего бара начинаете уменьшать время и по этому времени берете цену из таймсерии (ТС) другой валюты
4. если цены в другой ТС нет, то заполняем пробел предыдущей ценой - это и есть синхронизация
http://forum.tradelikeapro.ru/index.php?topic=4490.msg77475#msg77475
int Synchronize(const int start) { datetime currentTime = datetime(SeriesInfoInteger(_Symbol, _Period, SERIES_LASTBAR_DATE)); for (int i = 0; i < Currencies.Total(); i++) { CSymbol * s = Currencies.At(i); ArrayResize(s.SyncClose, MaxBars); ArrayResize(s.AverageFast, MaxBars); ArrayResize(s.AverageSlow, MaxBars); ArrayInitialize(s.SyncClose, 0); ArrayInitialize(s.AverageFast, 0); ArrayInitialize(s.AverageSlow, 0); int closeIndex = ArraySize(s.Close) - 1; s.SyncClose[MaxBars - 1] = s.Close[closeIndex]; // наичнаем с последнего бара, который точно существует for (int k = MaxBars - 1; k > start - 1; k--) { if (GetBarByTime(s.Name, _Period, currentTime) > 0 && closeIndex > 0) // если бар с ценой есть в другой ТС, то берем его по индексу { closeIndex--; } s.SyncClose[k] = s.Close[closeIndex]; currentTime -= PeriodSeconds(); // переходим к сл. временному бару } ExponentialMAOnBuffer(MaxBars, start, 0, InpPeriodFast, s.SyncClose, s.AverageFast); ExponentialMAOnBuffer(MaxBars, start, 0, InpPeriodSlow, s.SyncClose, s.AverageSlow); } return(1); }
Чтобы просто инициировать подгрузку истории другой валюты достаточно вызвать одну из функций CopyX() или Bars() для желаемой валюты, если они возвращают 0 или -1, то выходить из обработчика и ждать сл. тика.
- forum.tradelikeapro.ru
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Доброго времени суток.
Пытаюсь анализировать несколько валютных пар.
Использую функции типа Handle = iMA("USDJPY", timeFrame, Fast, 0, MA_Method, Price) для различных пар
затем int calculated=BarsCalculated(Handle);
Проблема:
Количество "rates_total" для графика к которому прикреплен индикатор, почти всегда отличается от аналогичного параметра дополнительных валютных пар, если на текущем графике баров меньше, чем на истории дополнительных валют, то расчет и прорисовка идет, если нет, то нет.
Вопрос: Как догрузить или засинхронизировать количество баров различных валютных пар?
Заранее благодарю.