| 
 Рассмотрим процесс отладки скриптов на примере простой стратегии, основанной на экспоненциальных скользящих средних. Принцип ее действия будет состоять в следующем: если цена поднялась выше скользящей, то покупаем; если цена опустилась ниже скользящей, то продаем. 
 Для иллюстрации создадим следующие функции: 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 к графику в обычном режиме, можно видеть сделки на графике, а также просмотреть отчет о доходности данной стратегии. 
 
 
 
 
 
 
 Примечание. Рассмотренная стратегия показана исключительно в учебных целях и не рекомендуется к использованию в реальной торговле.  |