Рассмотрим процесс отладки скриптов на примере простой стратегии, основанной на экспоненциальных скользящих средних. Принцип ее действия будет состоять в следующем: если цена поднялась выше скользящей, то покупаем; если цена опустилась ниже скользящей, то продаем.
Для иллюстрации создадим следующие функции: EMA_Buy - показывает, присутствует ли сигнал на покупку, генерируемый экспоненциальной скользящей средней; EMA_Sell - показывает, присутствует ли сигнал на продажу, генерируемый экспоненциальной скользящей средней.
Функция EMA_Buy
Inputs: Price(NumericSeries), Length(Numeric); Variables: ShowPrice(0), CurrentEMA(0);
ShowPrice = Price; CurrentEMA = XAverage(Price, Length);
If ShowPrice > CurrentEMA Then EMA_Buy = True Else EMA_Buy = False;
Функция EMA_Sell
Inputs: Price(NumericSeries), Length(Numeric); Variables: ShowPrice(0), CurrentEMA(0);
ShowPrice = Price; CurrentEMA = XAverage(Price, Length);
If ShowPrice < CurrentEMA Then EMA_Sell = True;
Входными параметрами для обеих этих функций будут являться Price (цена, используемая для расчета скользящей средней) и Length (период, используемый для расчета скользящей средней).
Далее создадим сигнал DebugSignal, который будет осуществлять покупку и продажу на основе значений функций EMA_Buy и EMA_Sell:
Inputs: Price(Close), Length(13); Variables: EMA_Buy_Value(False), EMA_Sell_Value(False);
EMA_Buy_Value = EMA_Buy(Price, Length); EMA_Sell_Value = EMA_Sell(Price, Length);
If EMA_Buy_Value Then Buy Next Bar At Market; If EMA_Sell_Value Then Sell Next Bar At Market;
Данный сигнал действует следующим образом: если функция EMA_Buy вернула логическое значение True, значит, имеет место сигнал к покупке, и открывается соответствующая сделка; если функция EMA_Sell вернула логическое значение True, значит, имеет место сигнал к продаже, и открывается соответствующая сделка.
Далее создадим стратегию DebugStrategy, куда добавим созданный нами сигнал.
Применим стратегию DebugStrategy к графику и получим следующий результат:
Очевидно, что имеет место какая-то ошибка, из-за которой все сделки мгновенно закрываются. Чтобы разобраться в проблеме применим созданную стратегию к графику, отметив пункт «Отладка», чтобы запустить отладчик скриптов.
Откроется окно отладчика скриптов.
В целях изучения работы алгоритма стратегии удобно перемещаться по строчкам кода с помощью кнопки «Войти в функцию». Это позволяет входить во все встроенные функции и наблюдать за вычисляемыми значениями.
По нажатию кнопки «Войти в функцию» мы попадаем в код функции EMA_Buy. На первом баре значения цены закрытия (переменная ShowPrice) и скользящей средней (переменная CurrentEMA) совпадают.
Следовательно, функция EMA_Buy получает значение False. Функция EMA_Sell также получит значение False. Следовательно, на первом баре в сигнале DebugSignal переменные EMA_Buy_Value и EMA_Sell_Value имеют значения False.
На втором баре цена закрытия (переменная ShowPrice) опускается ниже скользящей средней (переменная CurrentEMA).
Тогда функция EMA_Buy получает значение False. Функция EMA_Sell получит значение True. Имеем, что на втором баре в сигнале DebugSignal переменная EMA_Buy_Value имеет значение False, а переменная EMA_Sell_Value имеет значения True. И на следующем баре открывается сделка на продажу.
На третьем баре цена закрытия (переменная ShowPrice) поднимается выше скользящей средней (переменная CurrentEMA).
Тогда функция EMA_Buy получает значение True. Переменная EMA_Buy_Value также получает значение True. Функция EMA_Sell получает значение False. Но по завершении работы этой функции мы видим, что параметр EMA_Sell_Value продолжает равняться True.
Тогда происходит следующая ситуация: поскольку переменная EMA_Buy_Value имеет значение True, то на следующем баре открывается сделка на покупку. Но поскольку переменная EMA_Sell_Value также имеет значение True, то на следующем баре открывается сделка на продажу. И мы получим ряд постоянно открывающихся и закрывающихся сделок.
Очевидно, что проблема состоит в присвоении переменным EMA_Buy_Value и EMA_Sell_Value значений False, если проверка условий в функциях EMA_Buy и EMA_Sell соответственно не прошла.
Для устранения данной ошибки, изменим код функций EMA_Buy и EMA_Sell следующим образом (жирным выделены изменения):
Функция EMA_Buy
Inputs: Price(NumericSeries), Length(Numeric); Variables: ShowPrice(0), CurrentEMA(0);
ShowPrice = Price; CurrentEMA = XAverage(Price, Length);
If ShowPrice > CurrentEMA Then EMA_Buy = True Else EMA_Buy = False;
Функция EMA_Sell
Inputs: Price(NumericSeries), Length(Numeric); Variables: ShowPrice(0), CurrentEMA(0);
ShowPrice = Price; CurrentEMA = XAverage(Price, Length);
If ShowPrice < CurrentEMA Then EMA_Sell = True Else EMA_Sell = False;
После изменения и перекомпилирования данных функций функций возвратимся в отладчик. Нажимая на кнопку «Перешагнуть» или «Войти в функцию», переместимся к третьему бару.
Видим, что теперь переменная EMA_Buy_Value получила значение True, а значение переменной EMA_Sell_Value изменилось на False. Таким образом, произойдет логичное закрытие короткой позиции.
Применив стратегию Debug_Strategy к графику в обычном режиме, можно видеть сделки на графике, а также просмотреть отчет о доходности данной стратегии.
Примечание. Рассмотренная стратегия показана исключительно в учебных целях и не рекомендуется к использованию в реальной торговле. |