2013-01-03

Russell Day Trade System от George Pruitt

В одном из журналов FuturesTruth за позапрошлый год George Pruitt опубликовал для подписчиков интересную внутридневную систему для фьючерса на индекс Russell 2000, которую впоследствии пытались доработать читатели, в результате чего получилась окончательная версия. Для торговли применяются пятиминутки фьючерса. Код для TradeStation находится во вложении.

Суть системы простая.
Если вчерашнее закрытие больше или равно позавчерашнему и диапазон торговли относительно небольшой, значит сегодня день покупок.
Если вчерашнее закрытие меньше позавчерашнего закрытия и диапазон торговли небольшой, значит сегодня день продаж.
В день покупок открываем длинную позицию величиной в два контракта по стоп ордеру по цене открытия сессии плюс приращение.
В день продаж открываем короткую позицию величиной в два контракта по стоп ордеру по цене открытия сессии минус приращение.
Если после открытия длинной позиции цена прошла определенное расстояние в направлении позиции, устанавливаем трейл-стоп на 1 контракт по цене хай дня минус определенное количество пунктов.
Если после открытия короткой позиции цена прошла определенное расстояние в направлении позиции, устанавливаем трейл-стоп на 1 контракт по цене лоу дня плюс определенное количество пунктов.
Если в позиции остался один контракт, то на второй выставляем стоп в безубыток.
Также изначально при открытии позиции устанавливается стоп-лосс по цене открытия позиции плюс/минус определенное количество пунктов.
Закрываем все что есть на закрытии сессии.


Вот как выглядят сделки


А это эквити со стандартными параметрами с 2000 года до апреля 2011 года, так как у меня есть только такие данные пятиминуток. У кого есть возможность, можете проверить на более свежих данных.
Но если попробовать прооптимизировать, можно добиться более плавной кривой. Для начала попробуем оптимизацию за последние три года в качестве in sample. А потом проверим как это будет работать на более раннем участке с 2000- го года. Получаем вот что:



Теперь смотрим in sample + out of sample за 12 лет


Надо учесть что это все проделывалось без учета комиссии и проскальзывания.
Можно, конечно, перенести логику системы и на другие инструменты, в том числе и на всеми любимый фьючерс РТС. Но при этом надо понимать что система не универсальна так как в ней применяются пункты, и и они характеризуют свойства именно фьючерса на индекс Russell. То что является, например 5 пунктов для Russell, это для фьючерса на РТС вообще ничто. Поэтому, неплохо было бы перевести с пунктов на универсальный язык, то есть на единицы волатильности, тогда систему можно применить для любого инструмента, независимо от величины его пунктов. В том смысле что если например, стоп 10 пунктов это для для Russell эквивалентно, например 2*ATR на пятиминутках. Значит и меняем все что связано с пунктами на соответствующую величину ATR.


Ну и сам код системы для TradeStation

inputs: atrLen(10),stopAmtPoints(10.00),offSetAmt(.2),profitObj1(5),endTradeTime(1530);
vars: atrAmt(0),smallRange(false),canBuy(true),canSell(true),stb(0),sts(0),tkpS(0),tkpL(0),yesTrueRange(0);
vars: buysToday(0),sellsToday(0),j(0),longLossPt(0),shortLossPt(0);

{Plot on 5 minute day session - programmed by George Pruitt}
{I used the OpenD(),HighD(),LowD(),CloseD() functions to get
the prior day’s highs and lows and closes }

value1 = 0;

for j = 1 to atrLen
begin
value1 = value1 + maxList(closeD(j+1),highD(j)) - minList(closeD(j+1),lowD(j));
end;

atrAmt = value1/atrLen;
yesTrueRange = maxList(closeD(2),highD(1)) - minList(closeD(2),lowD(1));
smallRange = yesTrueRange < atrAmt;

if(date<>date[1]) then // first bar of the day
begin
canBuy = false;
canSell = false;
buysToday = 0;
sellsToday = 0;
end;

if marketPosition = 1 then buysToday = 1; // if we already bot then no more buys
if marketPosition =-1 then sellsToday = 1;

stb = openD(0) + offSetAmt * atrAmt;
sts = openD(0) - offSetAmt * atrAmt;

if(closeD(1)>=closeD(2) and smallRange) then canBuy = true;
if(closeD(1)

if(canBuy and buysToday = 0 and time < endTradeTime) then buy("SFOBuy") 2 contracts next bar stb stop;
if(canSell and sellsToday = 0 and time < endTradeTime ) then sellShort("SFOSell") 2 contracts next bar sts stop;

if currentContracts = 2 and marketPosition = 1 and highD(0) > entryPrice + profitObj1 then sell("LongProf1") 1 contract next bar at highD(0) - 5 stop;
if currentContracts = 2 and marketPosition =-1 and lowD(0) < entryPrice - profitObj1 then buyToCover("ShrtProf1") 1 contract next bar at lowD(0) + 5 stop;

if currentContracts = 1 then sell("L-BreakEven") next bar at entryPrice stop;
if currentContracts = 1 then buyToCover("S-BreakEven") next bar at entryPrice stop;

if marketPosition = 1 then sell("MM-L-Out") next bar at entryPrice - stopAmtPoints stop;
if marketPosition =-1 then buyToCover("MM-S-Out") next bar at entryPrice + stopAmtPoints stop;
setExitOnClose;

Комментариев нет:

Отправка комментария