Germany | Finland | Saint Petersburg | Drive

Скользящий стоп

Опубликовано в AmiBroker

В амиброкере имеется встроенная функция ApplyStop, которая позволяет рассчитывать скользящий стоп. Не люблю ее. Она непрозрачна, далеко не всегда применима. Да и всегда приятно видеть уровень стопа на графике. Как сэмулировать скользящий стоп без использования встроенной функции?

Несложно. Формулируем правила.

  • Используем алгоритм входа и выхода из позиции на основе пересечения ценой ее скользящей средней. Цена выше средней - входим в Лонг, ниже - выходим.
  • Для простоты работаем только в лонг
  • Скользящий стоп срабатывает, когда очередная свеча закрылась ниже уровня, определяемого максимально возможным откатом от достигнутого максимума. Обращаю внимание: закрытие происходит не в моменте, а по закрытию свечи. Реализация в моменте аналогична.

Открываем новый график. Наносим на него цену инструмента и строим скользящую среднюю. Получаем такую картинку и следующий автоматически создаваемый код:

 

_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();

_SECTION_BEGIN("MA1");
P = ParamField("Price field",-1);
Periods = Param("Periods", 15, 2, 300, 1, 10 );
Plot( MovingAverage=MA( P, Periods ), _DEFAULT_NAME(), ParamColor( "Color", colorCycle ), ParamStyle("Style") );
_SECTION_END();

Отлично. Добавляем условия входа и выхода по пересечению цены и средней. Исходя из нашего алгоритма, работаем по закрытой свече, то есть по предыдущей, а не текущей.

Buy = Ref(Cross(Close,MovingAverage),-1);
PlotShapes(IIf(Buy,shapeUpArrow,shapeNone),colorGreen);

Sell = Ref(Cross(MovingAverage,Close),-1);
PlotShapes(IIf(Sell,shapeHollowDownArrow,shapeNone),colorGreen);

Получили:

 

 

Продолжаем продолжать. Рассчитываем уровень стопа как максимально возможный откат от максимума и рисуем этот уровень:

 

Offset = Param("Trail offset",20,1,100,1);
MaxValue = HighestSince(Buy,High);
StopLevel = MaxValue - Offset;
Plot(StopLevel,"Stop",colorRed);

Если свеча закрывается ниже уровня стопа, в начале следующей свечи закрываем позицию:

SellByTrail = Ref(Close < StopLevel,-1);
Sell = Sell OR SellByTrail;

И вычищаем повторяющиеся сигналы:

Buy = ExRem(Buy,Sell);
Sell = ExRem(Sell,Buy);

Вот что получилось:

 

 И, соответственно, полный текст:

_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();

_SECTION_BEGIN("MA1");
P = ParamField("Price field",-1);
Periods = Param("Periods", 15, 2, 300, 1, 10 );
Plot( MovingAverage=MA( P, Periods ), _DEFAULT_NAME(), ParamColor( "Color", colorCycle ), ParamStyle("Style") );
_SECTION_END();

Buy = Ref(Cross(Close,MovingAverage),-1);
PlotShapes(IIf(Buy,shapeUpArrow,shapeNone),colorGreen);

Sell = Ref(Cross(MovingAverage,Close),-1);


Offset = Param("Trail offset",20,1,100,1);
MaxValue = HighestSince(Buy,High);
StopLevel = MaxValue - Offset;
Plot(StopLevel,"Stop",colorRed);


SellByTrail = Ref(Close < StopLevel,-1);
Sell = Sell OR SellByTrail;
Buy = ExRem(Buy,Sell);
Sell = ExRem(Sell,Buy);

PlotShapes(IIf(Sell,shapeHollowDownArrow,shapeNone),colorGreen);

 

Реализация стопов в моменте (то есть не по закрытию предыдущей свечи, а на текущей) осуществляется полностью аналогично.

 

Комментарии   
# AlexLan 24.06.2013 17:27
Михаил, спасибо за статью :-)
С уважением, Александр.
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий