This is the “Thirteen” mechanical trading system for trading a diverse portfolio of COMMODITY FUTURES.
Mark Johnson 02 June 2001
Знакомимся с классикой системостроительства для портфеля фьючерсов — простейшая система Thirteen. Система всегда в рынке, то есть реверсивная — из лонга переходит в шорт и наоборот. Вход осуществляется при пересечении индикатора MACD с параметрами 13 и 130 нулевой линии. Это, по сути, то же самое что система, построенная на пересечении двух скользящих средних, что доказывает что, по крайней мере до 2001 года можно было легко зарабатывать на пересечении двух средних скользящих.
Как видим, на периоде с 1980 до 2000 года система стабильно зарабатывала. Тест на основных американских фьючерсах одним контрактом:
Но с 2001 года, когда она была опубликована, ее стало лихорадить и стабильность пропала.
А вот простейший код для Омеги, подтверждающий тезис что код робастной системы должен помещаться на спичечном коробке:
—————————————
vars: mysignal(0);
mysignal = MACD(Close, 13, 130);
if (mysignal > 0.0) then buy tomorrow at the market;
if (mysignal < 0.0) then sell tomorrow at the market;
—————————————
А это для WL4:
—————————————
{$I ‘MACDEx’}
var MPane, MEx, MHist, MPane1, MEx1, MHist1, MPane2, MEx2, MHist2, MPane3, MEx3, MHist3: integer;
var Bar, p: integer;
var bLongSAR: boolean;
MEx := MACDExSeries( #Close, 13, 130 );
MHist := SubtractSeries( MEx, EMASeries( MEx, 9 ) );
MEx1 := MACDExSeries( #Close, 13, 130 );
MHist1 := SubtractSeries( MEx1, EMASeries( MEx1, 9 ) );
MEx2 := MACDExSeries( #Close, 13, 130 );
MHist2 := SubtractSeries( MEx2, EMASeries( MEx2, 9 ) );
MEx3 := MACDExSeries( #Close, 13, 130 );
MHist3 := SubtractSeries( MEx3, EMASeries( MEx3, 9 ) );
MPane := CreatePane( 100, true, true );
PlotSeries( MEx, MPane, #Maroon, #Thick );
PlotSeries( EMASeries( MEx, 9 ), MPane, 111, #Thin );
PlotSeries( MHist, MPane, #Black, #Histogram );
DrawLabel( ‘MACDEx(13,130) and 9 period Signal Line’, MPane );
for Bar := 130 to BarCount – 1 do
begin
if LastPositionActive then
begin
p := LastPosition;
bLongSAR := PositionLong( p );
if PositionLong( p ) then
begin
if CrossUnderValue( Bar, MEx1, 0 ) then
begin
SellAtMarket( Bar + 1, p, ” );
end;
end;
if PositionShort( p ) then
begin
if CrossOverValue( Bar, MEx3, 0 ) then
begin
CoverAtMarket( Bar + 1, p, ” );
end;
end;
end;
if not bLongSAR then
begin
if CrossOverValue( Bar, MEx, 0 ) then
begin
BuyAtMarket( Bar + 1, ‘0’ );
end;
end;
if bLongSAR then
begin
if CrossUnderValue( Bar, MEx2, 0 ) then
begin
ShortAtMarket( Bar + 1, ‘4’ );
end;
end;
end;
—————————————————-