只做专业交易软件
一个完整系统的成分
市场——买卖什么
头寸规模——买卖多少
入市——何时买卖
止损——何时退出亏损头寸
离市——何时退出赢利头寸
策略——如何买卖
一、市场
多样性、成交量大、活跃的、有可能出现趋势的合约,一旦排除做某个合约,将不再去做这个合约。
二、头寸规模
这六个条件中,我理解头寸规模是这六个规则中最重要的,在原版海龟交易法则中也是篇幅最长的一段,破产风险是一个正期望值交易系统能否正常运行下去的关键,法则中用账户总资金的1%下单:
头寸规模单位=账户总资金的1%÷市场的绝对波动幅度
市场的绝对波动幅度=ATR×合约每一点数所代表的人民币
这里的ATR是以20日计算的,在软件超级图表中输入可以直接显示出来。
▲ATR
例如100万人民币账户,此时螺纹钢1805合约价格是3705,日线级别此时ATR为98.43 ,螺纹钢一点变动为10rmb。
头寸规模单位=1000000×0.01÷(98.43×10)=10.15(手)
约等于10手螺纹钢;
如果是10万人民币账户,就是1手螺纹钢。
三、入市策略
◆系统1:以20日突破为基础的短期系统
◆系统2:以55日突破为基础的长期系统
海龟们可以自由决定如何在这两个系统之间分配资金。
◆系统1:突破20日高点或低点,以此时价格建立一个头寸规模单位,但是,如果上一次突破为赢利性突破,那么系统1的当前信号将被忽略;
◆系统2:突破55日高点或低点,此时建立一个头寸规模单位,无论前一次是否赢利;
逐步建仓:首先是建立1个头寸规模单位,然后价格同方向波动1/2个ATR值则再建立一个头寸规模单位。
四、止损
海龟们任何一笔交易风险程度都不得超过2%,也就是在建立一个头寸规模单位(账户总资金的1%)后,反方向波动2个ATR止损,这个止损值是随着增加建立头寸规模单位变化,以做多为例,再建立一个头寸单位后,止损值则增加0.5个ATR。
五、离市
赢利的情况下
◆系统1:反向突破10日退出法则
◆系统2:方向突破10日退出法则
六、在tradeblazer交易开拓者实现海龟交易法则
TurtleTrader代码
建议微信“设置”→“通用”开启“横屏模式”阅读:
Params
Numeric RiskRatio(1); // % Risk Per N ( 0 - 100)
Numeric ATRLength(20); // 平均波动周期 ATR Length
Numeric boLength(20); // 短周期 BreakOut Length
Numeric fsLength(55); // 长周期 FailSafe Length
Numeric teLength(10); // 离市周期 Trailing Exit Length
Bool LastProfitableTradeFilter(True); // 使用入市过滤条件
Vars
Numeric MinPoint; // 最小变动单位
NumericSeries AvgTR; // ATR
Numeric N; // N 值
Numeric TotalEquity; // 按最新收盘价计算出的总资产
Numeric TurtleUnits; // 交易单位
NumericSeries DonchianHi; // 唐奇安通道上轨,延后1个Bar
NumericSeries DonchianLo; // 唐奇安通道下轨,延后1个Bar
NumericSeries fsDonchianHi; // 唐奇安通道上轨,延后1个Bar,长周期
NumericSeries fsDonchianLo; // 唐奇安通道下轨,延后1个Bar,长周期
Numeric ExitHighestPrice; // 离市时判断需要的N周期最高价
Numeric ExitLowestPrice; // 离市时判断需要的N周期最低价
Numeric myEntryPrice; // 开仓价格
Numeric myExitPrice; // 平仓价格
Bool SendOrderThisBar(False); // 当前Bar有过交易
NumericSeries preEntryPrice(0); // 前一次开仓的价格
BoolSeries PreBreakoutFailure(false); // 前一次突破是否失败
Begin
// 集合竞价过滤
If(!CallAuctionFilter()) Return;
If(BarStatus == 0)
{
preEntryPrice = InvalidNumeric;
PreBreakoutFailure = false;
}
MinPoint = MinMove*PriceScale;
AvgTR = XAverage(TrueRange,ATRLength);
N = AvgTR[1];
TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin();
TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue());
TurtleUnits = IntPart(TurtleUnits); // 对小数取整
DonchianHi = HighestFC(High[1],boLength);
DonchianLo = LowestFC(Low[1],boLength);
fsDonchianHi = HighestFC(High[1],fsLength);
fsDonchianLo = LowestFC(Low[1],fsLength);
ExitLowestPrice = LowestFC(Low[1],teLength);
ExitHighestPrice = HighestFC(High[1],teLength);
Commentary("N="+Text(N));
Commentary("preEntryPrice="+Text(preEntryPrice));
Commentary("PreBreakoutFailure="+IIFString(PreBreakoutFailure,"True","False"));
// 当不使用过滤条件,或者使用过滤条件并且条件为PreBreakoutFailure为True进行后续操作
If(MarketPosition == 0 && ((!LastProfitableTradeFilter) Or (PreBreakoutFailure)))
{
// 突破开仓
If(High > DonchianHi && TurtleUnits >= 1)
{
// 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
myEntryPrice = min(high,DonchianHi + MinPoint);
myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
}
If(Low < DonchianLo && TurtleUnits >= 1)
{
// 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
myEntryPrice = max(low,DonchianLo - MinPoint);
myEntryPrice = IIF(myEntryPrice > Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
preEntryPrice = myEntryPrice;
SendOrderThisBar = True;
SellShort(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
}
}
// 长周期突破开仓 Failsafe Breakout point
If(MarketPosition == 0)
{
Commentary("fsDonchianHi="+Text(fsDonchianHi));
If(High > fsDonchianHi && TurtleUnits >= 1)
{
// 开仓价格取突破上轨+一个价位和最高价之间的较小值,这样能更接近真实情况,并能尽量保证成交
myEntryPrice = min(high,fsDonchianHi + MinPoint);
myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
}
Commentary("fsDonchianLo="+Text(fsDonchianLo));
If(Low < fsDonchianLo && TurtleUnits >= 1)
{
// 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交
myEntryPrice = max(low,fsDonchianLo - MinPoint);
myEntryPrice = IIF(myEntryPrice > Open, Open,myEntryPrice); // 大跳空的时候用开盘价代替
preEntryPrice = myEntryPrice;
SellShort(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
}
}
If(MarketPosition == 1) // 有多仓的情况
{
Commentary("ExitLowestPrice="+Text(ExitLowestPrice));
If(Low < ExitLowestPrice)
{
myExitPrice = max(Low,ExitLowestPrice - MinPoint);
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
}Else
{
If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
{
If(Open >= preEntryPrice + 0.5*N) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
{
myEntryPrice = Open;
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
}
while(High >= preEntryPrice + 0.5*N) // 以最高价为标准,判断能进行几次增仓
{
myEntryPrice = preEntryPrice + 0.5 * N;
preEntryPrice = myEntryPrice;
Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
}
}
// 止损指令
If(Low <= preEntryPrice - 2 * N && SendOrderThisBar == false) // 加仓Bar不止损
{
myExitPrice = preEntryPrice - 2 * N;
myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
Sell(0,myExitPrice); // 数量用0的情况下将全部平仓
PreBreakoutFailure = True;
}
}
}Else If(MarketPosition ==-1) // 有空仓的情况
{
// 求出持空仓时离市的条件比较值
Commentary("ExitHighestPrice="+Text(ExitHighestPrice));
If(High > ExitHighestPrice)
{
myExitPrice = Min(High,ExitHighestPrice + MinPoint);
myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
BuyToCover(0,myExitPrice); // 数量用0的情况下将全部平仓
}Else
{
If(preEntryPrice!=InvalidNumeric && TurtleUnits >= 1)
{
If(Open <= preEntryPrice - 0.5*N) // 如果开盘就超过设定的1/2N,则直接用开盘价增仓。
{
myEntryPrice = Open;
preEntryPrice = myEntryPrice;
SellShort(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
}
while(Low <= preEntryPrice - 0.5*N) // 以最低价为标准,判断能进行几次增仓
{
myEntryPrice = preEntryPrice - 0.5 * N;
preEntryPrice = myEntryPrice;
SellShort(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
}
}
// 止损指令
If(High >= preEntryPrice + 2 * N &&SendOrderThisBar==false) // 加仓Bar不止损
{
myExitPrice = preEntryPrice + 2 * N;
myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice); // 大跳空的时候用开盘价代替
BuyToCover(0,myExitPrice); // 数量用0的情况下将全部平仓
PreBreakoutFailure = True;
}
}
}
End
这段代码在TB交易开拓者里是系统自带的模型。
做了10个品种的测试,时间是从2009年1月5号至今,K线级别为日线,样品为各商品指数,每个商品100万rmb,股指实际测试的时候要在500万以上——rb螺纹钢、i铁矿石、cu铜、j焦炭、ru橡胶、PTA、au黄金、sr白糖、m豆粕、IF股指:
▲多图表组合测试报告
▲多图表投资组合测试报告(交易汇总)
▲多图表投资组合测试报告(交易汇总)
▲多图表投资组合测试报告(交易盈亏曲线)
在第一批培训中,丹尼斯他们从报名的1000多人里筛选出来10个人,又另加3人,总计13人,他们有一个共同的特征是非常聪明,但是海龟们并没有全部都取得成功,大概是不到一半的海龟有稳定盈利的能力,我理解海龟交易法则核心在于信心、连续性和纪律,反映出人性的弱点;大多数人是坚持不了的,成功的海龟必定心怀信仰。
▲
— END —
开拓者金融网
知识
专业
能力
深度
↓程序化免费培训课程 点击“阅读原文”抢先报名!

