Страница обновлена 30.06.2009г.
Механическая Торговая Система
'АЛЬФА-СКАЛЬП' для авто-трейдинга на ФОРТС на основе трендового и контр-трендового
алгоритмов (!РЕКОМЕНДУЕТСЯ только в
качестве УЧЕБНОЙ ТС!).
В этом разделе описывается новая
Механическая Торговая Система (далее МТС)
'Альфа-скальп', предназначенная для
автоматической торговли с помощью описанных на
этом сайте библиотеки и модуля. Эту ТС может
использовать любой пользователь системы
Альфа-директ, желающий попробовать
внутридневную автоматическую торговлю на ФОРТС.
Параметры ТС даются для использования c
фьючерсом на СБЕРБАНК, но использовать данную ТС
можно с любым другим торгуемым на ФОРТС активом
(далее ЦБ). Фьючерс удобен тем, что у него
низкие комиссионные издержки, что важно для
активной торговли, а также важно то, что на
фьючерсах можно одинаково легко занять, как
лонговую, так и шортовую позицию. Немаловажно и
то, что фьючерс дает возможность использовать
большой размер плеча, т.е. позволяет получить
более высокий доход, чем например на акциях.
ТС основана на сочетании трендового и
контр-трендового алгоритмов. Такое сочетание
повышает эффективность трендового алгоритма,
уменьшая его инерционность и увеличивая
скорость реагирования на изменения цены.
Контр-трендовые сигналы работают на барах, на
которых нет других сигналов, поэтому трендовая и
контр-трендовая ТС не мешают друг другу. На
рисунке ниже можно увидеть разницу между
сигналами, создаваемыми трендовом алгоритмом, и
сигналами создаваемыми контр-трендовой ТС
(символы с буквой 'а', обведены оранжевой
линией):
Минутки:
Как видно на рисунках, сигналы от
контр-трендовой ТС позволяют получить более
сглаженную кривую эквити и увеличить профит.
Трендовая часть ТС основана на пересечении
двух скользящих средних цены: скольз.средней
рассчитанной с учетом волатильности цены
(MovingAverage c параметром VARIABLE). Другая скользящая
средняя рассчитывается как простая (MovingAverage c
параметром SIMPLE).
Контр-трендовая часть основана на моем
собственном алгоритме бинарного сигнала.
Еще одно из достоинств данной ТС,
увеличивающее её эффективность, это сочетание
работы с сигналами на незавершенных
барах, т.е. при сильных ценовых движениях ТС не
ждет завершения очередного бара, а сразу
реагирует на движение на еще незавершенном
крайнем правом баре графика.
Приведенные ниже формулы ТС в формате
Метастока являются полностью рабочими, т.е. их
можно копировать в советники в Метастоке как
есть. ТС не использует стопы, т.к. умеет быстро
разворачиваться по рынку. Можно также в
Советнике включить выход в кэш в конце дня, а
также использовать StopStart-заявки для задания
нестандартного начала торгового периода.
Тайм-фреймы для использования этой ТС можно
применять любые: от 1 до 30 минут и др.
У меня есть несколько советов для
пользователей этой ТС:
1) торговать не более 1/3 от
кол-ва денег в портфеле, делённой на величину ГО
по торгуемому контракту, т.е.:
КолКонтрактов=СумПортфель/3/ГО, или
использовать только 1 контракт.
2) вы можете применять вместо моего свой
контр-трендовый индикатор, только замените
нижеприведенный текст индикатора на свой.
3) Не рекомендуется применять
авто-торговлю в периоды боковика с низкими
объемами. Рекомендуемый период торговли с 10-30
до примерно 19-00 мск. Для прибыльности
нужно подобрать правильные параметры ТС и
торговать только на динамично меняющемся рынке. И
как только объемы торгов на рынке падают -
отключайте авто-торговлю!
4) не жадничайте! - заработала ТС какой-либо
профит фиксируйтесь и отдыхайте до следующих
торгов. Каждый день фиксировать ЛЮБОЙ
ПОЛОЖИТЕЛЬНЫЙ результат - самая
лучшая и самая прибыльная торговая стратегия!
Приведу полный текст рабочего варианта
Советника 'Альфа-скальп' для Метастока для
авто-торговли на ФОРТС.
Эта ТС включает в себя контр-трендовый
индикатор, с которым в паре работает трендовая
ТС, поэтому предварительно создайте в Indicator
Builder'e новый индикатор 'BinaryAntiTrend'
и пропишите в его поле 'Formula' следующие строки:
{BinaryAntiTrend
контр-трендовый индикатор}
FPer:=5;
{задаем период скользящей средней для
контр-трендового индикатора}
{Buy}
FCL:=C-Ref(C,-1);
FL:=L-Ref(L,-1);
FH:=H-Ref(H,-1);
FMP:=MP()-Ref(MP(),-1);
FCMP:=C-MP();
C13:=FCL > Mov(Abs(FCL),FPer,S);
L13:=FL > Mov(Abs(FL),FPer,S);
H13:=FH > Mov(Abs(FH),FPer,S);
MP13:=FMP > Mov(Abs(FMP),FPer,S);
CMP13:=FCMP > Mov(Abs(FCMP),FPer,S);
ATR13:=ATR(1) > Mov(ATR(1),FPer,S) AND C>MP();
VOL13:=VOLUME > Mov(VOLUME,FPer,S) AND C>MP();
BinaryBuyTrend:=If(C13,1,0)+If(L13,1,0)+If(H13,1,0)+If(MP13,1,0)+If(CMP13,1,0)+If(ATR13,1,0)+If(VOL13,1,0);
{Sell}
FCL:=Ref(C,-1)-C;
FL:=Ref(L,-1)-L;
FH:=Ref(H,-1)-H;
FMP:=Ref(MP(),-1)-MP();
FCMP:=MP()-C;
C13:=FCL > Mov(Abs(FCL),FPer,S);
L13:=FL > Mov(Abs(FL),FPer,S);
H13:=FH > Mov(Abs(FH),FPer,S);
MP13:=FMP > Mov(Abs(FMP),FPer,S);
CMP13:=FCMP > Mov(Abs(FCMP),FPer,S);
ATR13:=ATR(1) > Mov(ATR(1),FPer,S) AND C<MP();
VOL13:=VOLUME > Mov(VOLUME,FPer,S) AND C<MP();
BinarySellTrend:=If(C13,1,0)+If(L13,1,0)+If(H13,1,0)+If(MP13,1,0)+If(CMP13,1,0)+If(ATR13,1,0)+If(VOL13,1,0);
Далее создайте нового Советника 'AlfaScalpAutoTrading'
в списке Expert Advisor Метастока со
следующими строками (порядок строк важен!):
{строка StopStart разрешенные периоды
авто-торговли}
FLast:=LastValue(Cum(1))-Cum(1)<2;
FNull:=If( FLast, ExtFml("Borisoff.MoveFORTS", "12345-000", 0, 0, Stop,
10, Simple, 29, False, 0), False);
{начало периода запрета авто-торговли}
FNull1:=If( FLast, ExtFml("Borisoff.MoveFORTS", "12345-000", 0, 0, Start,
10, Simple, 03, False, 0), False);
{начало периода разрешения авто-торговли}
FNull2:=If( FLast, ExtFml("Borisoff.MoveFORTS", "12345-000", 0,
0, Stop, 17, Simple, 49, False, 0),
False); {начало периода запрета
авто-торговли}
FNull3:=If( FLast, ExtFml("Borisoff.MoveFORTS", "12345-000", 0,
0, Start, 18, Simple, 05, False, 0),
False); {начало периода разрешения авто-торговли}
False;
{строка CashTime вывод в кэш}
FDate:=Month()*100 + DayOfMonth();
CashHour:=20; {часы вывода в кэш}
CashMinute:=01; {минуты вывод в кэш}
FLast:=LastValue(Cum(1))-Cum(1)<2;
FCash:=If((Hour()*100 + Minute()) >= (CashHour*100 + CashMinute)
AND FDate=LastValue(FDate), True, False)
AND FLast;
FNull:=If( FCash,
ExtFml("Borisoff.MoveFORTS", "12345-000"{ваш
портфель}, 0, 0.45, Cash, CashHour, Simple, CashMinute, FCash, 0),
False);
FCash;
{строка Sell
заявки на продажу}
FLast:=LastValue(Cum(1))-Cum(1)<500;
MPVar:=Mov(MP(),1,VAR);
MPVol:=Mov(MP(),2,S);
FBuy:=(MPVol > MPVar OR (Cross(MPVol,MPVar) OR Ref(Cross(MPVol,MPVar),-1)))
AND MP() >= MPVar
AND FLast;
FSell:=(MPVol < MPVar OR (Cross(MPVar,MPVol) OR Ref(Cross(MPVar,MPVol),-1)))
AND MP() <= MPVar
AND FLast;
FSell:=FSell AND MP() > Ref(MP(),1)
AND FLast;
FBuy:=FBuy AND MP() < Ref(MP(),1)
AND FLast;
SellOrder:=FSell AND FLast;
FPos:=LastValue( If((Hour()*100 + Minute()) >= 1740, -1, -2) ); {задаем
размер позиции для торговли в 2 лота, а для
вечерней сессии =1 лот}
FSlipp:=LastValue(Abs(Ref(Typical(),1)-Typical())/LastValue(C)*100+0.01);
{задаем проскальзывание равное проценту
разности типичных цен текущего и предыдущего
баров}
FNull:=If( SellOrder,
ExtFml("Borisoff.MoveFORTS","12345-000"{ваш
портфель}, FPos, FSlipp, S, 0, Simple, 0, SellOrder, 1),
False);
SellOrder;
{строка Buy
заявки на покупку}
FLast:=LastValue(Cum(1))-Cum(1)<500;
MPVar:=Mov(MP(),1,VAR);
MPVol:=Mov(MP(),2,S);
FBuy:=(MPVol > MPVar OR (Cross(MPVol,MPVar) OR Ref(Cross(MPVol,MPVar),-1)))
AND MP() >= MPVar
AND FLast;
FSell:=(MPVol < MPVar OR (Cross(MPVar,MPVol) OR Ref(Cross(MPVar,MPVol),-1)))
AND MP() <= MPVar
AND FLast;
FSell:=FSell AND MP() > Ref(MP(),1)
AND FLast;
FBuy:=FBuy AND MP() < Ref(MP(),1)
AND FLast;
BuyOrder:=FBuy AND FLast;
FPos:=LastValue( If((Hour()*100 + Minute()) >= 1740, -1, -2) );
FSlipp:=LastValue(Abs(Ref(Typical(),1)-Typical())/LastValue(C)*100+0.01);
FNull:=If( BuyOrder,
ExtFml("Borisoff.MoveFORTS", "12345-000"{ваш
портфель}, FPos, FSlipp, B, 0, Simple, 0, BuyOrder, 1),
False);
BuyOrder;
{строка SellAntiTrend
контр-трендовой заявки на продажу}
FLast:=LastValue(Cum(1))-Cum(1)<500;
MPVar:=Mov(MP(),1,VAR);
MPVol:=Mov(MP(),2,S);
FBuy:=(MPVol > MPVar OR (Cross(MPVol,MPVar) OR Ref(Cross(MPVol,MPVar),-1)))
AND MP() >= MPVar
AND FLast;
FSell:=(MPVol < MPVar OR (Cross(MPVar,MPVol) OR Ref(Cross(MPVar,MPVol),-1)))
AND MP() <= MPVar
AND FLast;
Buy0:=FBuy
AND VOLUME > Ref(VOLUME,-1)
AND (MPVar) < (MPVol)
AND (Ref(MPVol,-1)) < (MPVol)
AND Ref(H,-1)<H
AND FLast;
Sell0:=FSell
AND VOLUME > Ref(VOLUME,-1)
AND (MPVar) > (MPVol)
AND (Ref(MPVol,-1)) > (MPVol)
AND Ref(L,-1)>L
AND FLast;
FSell:=FSell AND MP() > Ref(MP(),1)
AND FLast;
FBuy:=FBuy AND MP() < Ref(MP(),1)
AND FLast;
Sell:=(FmlVar("BinaryAntiTrend","BinaryBuyTrend")
- FmlVar("BinaryAntiTrend","BinarySellTrend"))
> 0
AND FBuy=False AND FSell=False
AND Ref(Buy0,1)=False AND Ref(Sell0,1)=False
AND FLast;
FPos:=LastValue( If((Hour()*100 + Minute()) >= 1740, -1, -2) );
FSlipp:=LastValue( Abs(Ref(Typical(),1)-Typical()) /LastValue(C)*100+0.01 );
FNull:=If(Sell,
ExtFml("Borisoff.MoveFORTS", "12345-000"{ваш портфель},
FPos, FSlipp, S, 0, Simple, 0, Sell, 1), False);
Sell;
{строка BuyAntiTrend
контр-трендовой заявки на покупку}
FLast:=LastValue(Cum(1))-Cum(1)<500;
MPVar:=Mov(MP(),1,VAR);
MPVol:=Mov(MP(),2,S);
FBuy:=(MPVol > MPVar OR (Cross(MPVol,MPVar) OR Ref(Cross(MPVol,MPVar),-1)))
AND MP() >= MPVar
AND FLast;
FSell:=(MPVol < MPVar OR (Cross(MPVar,MPVol) OR Ref(Cross(MPVar,MPVol),-1)))
AND MP() <= MPVar
AND FLast;
Buy0:=FBuy
AND VOLUME > Ref(VOLUME,-1)
AND (MPVar) < (MPVol)
AND (Ref(MPVol,-1)) < (MPVol)
AND Ref(H,-1)<H
AND FLast;
Sell0:=FSell
AND VOLUME > Ref(VOLUME,-1)
AND (MPVar) > (MPVol)
AND (Ref(MPVol,-1)) > (MPVol)
AND Ref(L,-1)>L
AND FLast;
FSell:= FSell AND MP() > Ref(MP(),1)
AND FLast;
FBuy:= FBuy AND MP() < Ref(MP(),1)
AND FLast;
Buy:=(FmlVar("BinaryAntiTrend","BinarySellTrend")
- FmlVar("BinaryAntiTrend","BinaryBuyTrend"))
> 0
AND FBuy=False AND FSell=False
AND Ref(Buy0,1)=False AND Ref(Sell0,1)=False
AND FLast;
FPos:=LastValue( If((Hour()*100 + Minute()) >= 1740, -1, -2) );
FSlipp:=LastValue( Abs(Ref(Typical(),1)-Typical()) /LastValue(C)*100+0.01 );
FNull:=If( Buy,
ExtFml("Borisoff.MoveFORTS", "12345-000"{ваш портфель},
FPos, FSlipp, B, 0, Simple, 0, Buy, 1), False);
Buy;
{строка Sell0
заявки быстрого реагирования на продажу на
нулевом формирующемся баре}
FLast:=LastValue(Cum(1))-Cum(1)<500;
MPVar:=Mov(MP(),1,VAR);
MPVol:=Mov(MP(),2,S);
FBuy:=(MPVol > MPVar OR (Cross(MPVol,MPVar) OR Ref(Cross(MPVol,MPVar),-1)))
AND MP() >= MPVar
AND FLast;
FSell:=(MPVol < MPVar OR (Cross(MPVar,MPVol) OR Ref(Cross(MPVar,MPVol),-1)))
AND MP() <= MPVar
AND FLast;
Sell0:= FSell
AND VOLUME > Ref(VOLUME,-1)
AND Int(MPVar) > Int(MPVol)
AND Int(Ref(MPVol,-1)) > Int(MPVol)
AND Ref(L,-1)>L
AND FLast;
FPos:=LastValue( If((Hour()*100 + Minute()) >= 1740, -1, -2) );
FSlipp:=LastValue( Abs(Ref(Typical(),1)-Typical()) /LastValue(C)*100+0.01 );
FNull:=If( Sell0,
ExtFml("Borisoff.MoveFORTS", "12345-000"{ваш портфель},
FPos, FSlipp, S, 0, Simple, 0, Sell0, 0), False);
Sell0;
{строка Buy0
заявки быстрого реагирования на покупку на
нулевом формирующемся баре}
FLast:=LastValue(Cum(1))-Cum(1)<500;
MPVar:=Mov(MP(),1,VAR);
MPVol:=Mov(MP(),2,S);
FBuy:=(MPVol > MPVar OR (Cross(MPVol,MPVar) OR Ref(Cross(MPVol,MPVar),-1)))
AND MP() >= MPVar
AND FLast;
FSell:=(MPVol < MPVar OR (Cross(MPVar,MPVol) OR Ref(Cross(MPVar,MPVol),-1)))
AND MP() <= MPVar
AND FLast;
Buy0:= FBuy
AND VOLUME > Ref(VOLUME,-1)
AND Int(MPVar) < Int(MPVol)
AND Int(Ref(MPVol,-1)) < Int(MPVol)
AND Ref(H,-1)<H
AND FLast;
FPos:=LastValue( If((Hour()*100 + Minute()) >= 1740, -1, -2) );
FSlipp:=LastValue( Abs(Ref(Typical(),1)-Typical()) /LastValue(C)*100+0.01 );
FNull:=If( Buy0,
ExtFml("Borisoff.MoveFORTS", "4586-000"{ваш портфель},
FPos, FSlipp, B, 0, Simple, 0, Buy0, 0), False);
Buy0;
И, наконец, на вкладке 'Graphic' в этих приказах
нужно выбрать свои графические изображения Buy и
Sell сигналов, которые будут рисоваться на графике
ЦБ. После прикрепления (кнопкой 'Attach') этого
советника к графику инструмента, выбранного для
автоматической торговли, на этом графике
появятся Buy и Sell сигналы.
Для лучших результатов торговли также может
быть важным сочетание тайм-фрейма графика,
величины проскальзывания и длительности
времени контроля исполнения заявок,
задваемое в MoveOrder.cfg файле. Можно также в
течении дня переходить с одного тайм-фрейма на
другой не меняя параметров в формулах ТС.
Успехов!
(с) Дмитрий Борисов. 30.06.2009г