上周发帖后得到了王老师的解答,后面自己也把海龟资金管理所需的资金量进行了反推的操作,在图表上运行该策略并未出现相关的开仓资金量大于总资金量的情况,海龟资金管理的代码如下:
Params
Numeric Risk(0.1);
Vars
Series<Numeric> AvgTR;
Numeric n;
Numeric TotalEquity;
Numeric TurtleUnits;
Numeric TurtleMoney; //反推海龟资金量
Series<Bool> Money_Con;
Defs
//此处添加公式函数
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
AvgTR = XAverage(TrueRange,20);
N = AvgTR[1];
TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin(); //总资金量
TurtleUnits = (TotalEquity * Risk/100) /(N * ContractUnit()*BigPointValue());
TurtleUnits = IntPart(TurtleUnits); // 对小数取整
TurtleMoney = TurtleUnits*close*ContractUnit*MarginRatio;
Commentary(\"总资金量==\"+text(TotalEquity));
Commentary(\"海龟开仓量==\"+Text(TurtleUnits));
Commentary(\"反推海龟资金量==\"+text(TurtleMoney));
Commentary(\"图表保证金率\"+text(MarginRatio));
Money_Con = TurtleMoney > TotalEquity;
If(Money_Con == True)
{
PlotBool(\"总资金小于开仓保证金\",Money_Con);
}
}
TurtleUnits = (TotalEquity * Risk/100) /(N * ContractUnit()*BigPointValue());
这里是不是缺了保证金比例呀?
是不是应该写成:
TurtleUnits = (TotalEquity* Risk/ 100) /( N * ContractUnit()*BigPointValue() *MarginRatio() ) ;
这个问题还是没解决吗,我也遇到了同样的问题,想测试我实盘的资金额度回测情况,但是报错:交易量大于当前资金可开仓量
系统中的海龟策略测试1分钟,5分钟的时候确实会出现这样的问题,切换成日线2000万就不会有这问题了,问题是做交易的时候,我们用的是实盘的资金,海龟策略根本用不了。
图片中是老师的视频课程,也出现了交易量大于当前资金可开仓量,详见下面图片
我也是同样问题,如果换成888指数,总资产还是变化的(和盈亏没有关系的变化 ),000指数和999指数没有问题
测试时间是2018年1月1日至今
既然你知道反推了,那么现在图上要的资金是多少呢??
你好!我用系统内置的海龟交易法则,资金设置为50万,模拟测试当中出现交易量大于当前资金可开仓数量,应该如何解决呢?
截图说明问题,系统公式没有这种问题
策略单元设置看看,可能你自己改过什么默认设置了,保证金率是不是设高了
没有修改,用的都是默认的设置
但是通过在双均线策略当中引入如上的资金管理方式后,在图表当中进行测试,也未出现开仓资金量大于总资金量的情况,布尔条件定义的笑脸并未出现在图表当中;但是当加载到策略单元当中进行多品种测试之后,又出现了交易量大于可开仓数量的情况,模拟跟踪当中也出现类似的情况:
以下为双均线策略+海龟资金管理的代码以及测试图:
Params
Numeric Risk(0.1);
//均线参数
Numeric Fast(15);
Numeric Slow(60);
Vars
Series<Numeric> AvgTR;
Numeric n;
Numeric TotalEquity;
Numeric TurtleUnits;
Numeric TurtleMoney; //反推海龟资金量
Series<Bool> Money_Con;
Series<Numeric> MA1;
Series<Numeric> MA2;
Series<Bool> LongMA;
Series<Bool> ShortMA;
Defs
//此处添加公式函数
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
AvgTR = XAverage(TrueRange,20);
N = AvgTR[1];
TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin(); //总资金量
TurtleUnits = (TotalEquity * Risk/100) /(N * ContractUnit()*BigPointValue());
TurtleUnits = IntPart(TurtleUnits); // 对小数取整
TurtleMoney = TurtleUnits*close*ContractUnit*MarginRatio;
Commentary(总资金量==+text(TotalEquity));
Commentary(海龟开仓量==+Text(TurtleUnits));
Commentary(反推海龟资金量==+text(TurtleMoney));
Commentary(图表保证金率+text(MarginRatio));
Money_Con = TurtleMoney > TotalEquity;
If(Money_Con == True)
{
PlotBool(总资金小于开仓保证金,Money_Con);
}
MA1 = XAverage(Close,Fast);
MA2 = XAverage(Close,Slow);
LongMA = CrossOver(MA1[1],MA2[1]);
ShortMA = CrossUnder(MA1[1],MA2[1]);
If(MarketPosition <> 1 And LongMA)
{
Buy(TurtleUnits,Open);
}
If(MarketPosition <> -1 And ShortMA)
{
SellShort(TurtleUnits,Open);
}
}