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; ---------------------------------------- ------------