Страница обновлена 30.06.2009г.
             
   Механическая Торговая Система 'АЛЬФА-СКАЛЬП' для авто-трейдинга на
ФОРТС на основе трендового и контр-трендового алгоритмов (!РЕКОМЕНДУЕТСЯ только в качестве УЧЕБНОЙ ТС!).

              
  В этом разделе описывается новая Механическая Торговая Система (далее МТС) 'Альфа-скальп', предназначенная для автоматической торговли с помощью описанных на этом сайте библиотеки и модуля. Эту ТС может использовать любой пользователь системы Альфа-директ, желающий попробовать внутридневную автоматическую торговлю на ФОРТС.
  Параметры ТС даются для использования c фьючерсом на СБЕРБАНК, но использовать данную ТС можно с любым другим торгуемым на ФОРТС активом (далее ЦБ). Фьючерс удобен тем, что у него низкие комиссионные издержки, что важно для активной торговли, а также важно то, что на фьючерсах можно одинаково легко занять, как лонговую, так и шортовую позицию. Немаловажно и то, что фьючерс дает возможность использовать большой размер плеча, т.е. позволяет получить более высокий доход, чем например на акциях.
  ТС основана на сочетании трендового и контр-трендового алгоритмов. Такое сочетание повышает эффективность трендового алгоритма, уменьшая его инерционность и увеличивая скорость реагирования на изменения цены. Контр-трендовые сигналы работают на барах, на которых нет других сигналов, поэтому трендовая и контр-трендовая ТС не мешают друг другу. На рисунке ниже можно увидеть разницу между сигналами, создаваемыми трендовом алгоритмом, и сигналами создаваемыми контр-трендовой ТС (символы с буквой 'а', обведены оранжевой линией):
      
AlfaScalpChart.GIF (24097 bytes)
                 
Минутки:

AlfaScalpChartMinute.GIF (59439 bytes)

  Как видно на рисунках, сигналы от контр-трендовой ТС позволяют получить более сглаженную кривую эквити и увеличить профит.
       
  Трендовая часть ТС основана на пересечении двух скользящих средних цены: скольз.средней рассчитанной с учетом волатильности цены (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'
     
AlfaScalpAntiTrendIndicator.GIF (14690 bytes)
 

и пропишите в его поле '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 Метастока со следующими строками (порядок строк важен!):

          
AlfaScalpExpertSymbols.GIF (20908 bytes)

{строка 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г             

 

Hosted by uCoz