Сегодня речь пойдет о том, как использовать при программировании стратегий в Wealth Lab таких важных инструментов, как шкала сжатия времени (таймфрейм) а также как программно можно получать доступ к дате, времени, текущей шкале и интервалу времени. Интуитивно все это понятно, но для того, чтобы объяснить это компьютеру при построении кода на языке WealthScript нужно со всем этим предметно разобраться.
Свойство Bars.Scale возвращает значение временного масштаба для активного инструмента. Текущий временной масштаб (таймфрейм) Вы можете временно изменить, применив для этого одну из функций языка WealthScript (смотри раздел мультитаймфреймовый анализ). Значениями временной шкалы (возможными таймфреймами) могут быть тики, секунды, минуты, дни, недели, месяцы, кварталы или годы. Для внутридневного масштаба свойство BarInterval возвращает целое числовое значение минут, секунд или тиков.
Как: программно узнать текущий таймфрейм или интервал
По возможности всегда старайтесь написать код торговой системы таким образом, чтобы торговую стратегию можно было протестировать на различных временных масштабах и интервалах без дополнительного редактирования кода.
Пример (как выполнить пример приведенного кода)...
Приведенный пример сначала проверяет, является ли текущая шкала (Bars.Scale) минутной (BarScale.Minute). Если это действительно так, то используя свойство Bars.BarInterval определяется время для выхода из текущей позиции в конце дня (на открытии последнего бара окончания сессии).
protected override void Execute() { if (Bars.Scale != BarScale.Minute) { //Если выбран не минутный таймфрейм, то появляется следующее предупреждение: DrawLabel(PricePane, "Пожалуйста, выберите минутный масштаб для графика", Color.Red); return; } /* Предположим для простоты, что выбран 60 минутный интервал (или меньше) определяем время выхода при условии, что сессия заканчивается в 16:00 (если заканчивается в 18:40, то нужно писать 1800 + 40) */ int exitTime = 1500 + 60 - Bars.BarInterval; /* Находим период, эквивалентный двум последним дням (сколько свечей нужного интервала составляют 2 дня) при условии, что день длится 6,5 часов (или 780 минут) 6,5 часов (длится сессия) переводим в минуты, затем в дни после чего в зависимости от интервала подсчитываем количество свечей */ int Period = (int) (6.5 * 60 * 2) / Bars.BarInterval; DataSeries breakoutHigh = Highest.Series(High, Period); PlotStops(); for(int bar = Period; bar < Bars.Count; bar++) { if (IsLastPositionActive) { Position p = LastPosition; int currentTime = Date[bar].Hour * 100 + Date[bar].Minute; if (currentTime >= exitTime) SellAtMarket(bar + 1, p, "Market Close"); else SellAtLimit(bar + 1, p, p.EntryPrice * 1.02, "Profit Target"); } else { // Войти в позицию при прорыве уровня, но не входить на первом баре дня if (!Bars.IsLastBarOfDay(bar)) BuyAtStop(bar + 1, breakoutHigh[bar]); } } }
Как видите, вне зависимости от того, какой интервал времени (таймфрейм) Вы используете - 5 минут, 10 минут, 30 или даже 60 минут - позиция закрывается точно на последнем баре текущего дня.
Как: получить доступ к дате и времени
Свойство Date объекта Bars (Bars.Date) предоставляет возможность доступа к объекту DateTime.
Пример (как выполнить пример приведенного кода)...
Предыдущий пример продемонстрировал, как получить доступ отдельно к часу и отдельно к минуте, которые соответствуют конкретному бару. Этот же пример демонстрирует как отобразить на экране точные дату и время, соответствующие цене закрытия бара в кратком формате.
protected override void Execute() { ClearDebug(); for(int bar = 20; bar < Bars.Count; bar++) { PrintDebug(String.Format( "{0:yyyyMMdd HHmm }", Date[bar] ) + Close[bar]); } }
В результате выполнения данного кода Вы получите текстовую таблицу, состоящую из 3-х столбцов в первом из которых будет отображена дата в указанном формате (год, месяц, число), а затем время (Часы и минуты).
Вы, конечно же сможете выбрать любой формат отображения даты и времени.
На сегодня всё. В следующий раз будем изучать как можно получить доступ к свойствам торгуемого финансового инструмента, т.е. более подробно разберем SymbolInfo.
[...] [...]
[...] [...]
Подскажите. Почему некоторые примеры (не все) при компиляции показывают ошибку? Копирую в WLD 6.3.14.0.
Сергей, все примеры, которые есть здесь я лично опробовал на WLD той же версии, что и у Вас. У меня все работало без сбоев. Можешь показать – при выполнении какого примера появляется ошибка?
Кстати, вот здесь можно посмотреть как выполнять примеры. Иногда в тексте дан лишь кусок примера. На это нужно обратить внимание.
//int Period = ( (6.5 * 60 * 2) / Bars.BarInterval);
Вот в этой строчке кода косяк, нявное преобразование типов не может быть выполнено-поэтому и код не компиллируется.
Да, эту строчку нужно было заменить на
int Period = (int)(6.5 * 60 * 2) / Bars.BarInterval;
Тогда все будет нормально.
В коде внес изменение.
[...] [...]
При копировании кода примера в WLD текст окрашивается в разные цвета. Что они означают?