Params
Numeric Fund(50000); //投入保证金
Vars
Series<Numeric> Lots;
Series<Bool> cond2;
Series<Numeric> day_ma;
MarginRate rate;
Series<Numeric> stop_line;
Events
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
}
onBar(ArrayRef<Integer> indexs)
{
Lots=Max(1,IntPart(Fund/(O*ContractUnit*rate.longMarginRatio)));//BigPointValue*0.1
//记录开仓后高低点
Commentary("BarsSinceEntry="+text(BarsSinceEntry));
day_ma = madd(10);
PlotNumeric("day_ma",day_ma);
//开仓条件
cond2 = CrossOver(close,day_ma);
PlotBool("cond2",cond2);
If(cond2[1])
{
Buy(lots,Open);
}
if (MarketPosition>0 )
{
stop_line = Close - 20;
if (stop_line<stop_line[1] and BarsSinceEntry>0)// and stop_line<>0
{
stop_line = stop_line[1];
}
if(L<stop_line[1] and stop_line[1]>0 and BarsSinceEntry>0)
{
Sell(0,Min(open, stop_line[1]));
}
}
//PlotNumeric("stop_line",stop_line);
}
引用的madd代码是下面的
Params
Numeric daysAgo(2); // 参数,过去daysAgo日
Vars
Series<Numeric> barCnt; // 每日bar计数器
Series<Numeric> dayClose; // 以9点为开盘价,昨日最后一个bar收盘价
Numeric i;
Numeric j;
Numeric nIndex(0); // 定位到每天最后一个bar的索引
Numeric CBIndex;
Numeric Sumclose(0);
Begin
CBIndex = CurrentBar;
// 每天9点,barCnt = 1
If(CBIndex == 0 || time==0.0900)
{
barCnt = 1;
}Else
// 然后随K线数目,barCnt自增
{
barCnt = barCnt + 1;
}
dayClose = Close;
Sumclose = 0;
// 设置daysAgo=0参数,直接返回昨日收盘价
If(daysAgo == 0)
{
return dayClose;
}Else
// 其他情况下,计算多日数据时,正常计算开始
{
For i = 1 To daysAgo
{
If( i == 1)
{
// nIndex用来定位每天最后一个bar的索引值(第一天直接等于BarCnt[j])
nIndex = BarCnt[j];
}Else {
// 第二天开始,nIndex每次递增BarCnt[j]
nIndex = nIndex + BarCnt[j];
}
// 上面一段程序完成了对nIndex的计算
If (j > CBIndex )
Return InvalidNumeric;
// Sumclose每天加入昨日的收盘价bar价格,也就是dayClose[索引nIndex定位这个bar]
Sumclose = Sumclose + dayClose[nIndex];
// 索引值j每天递增BarCnt[j]
j = j + BarCnt[j];
}
// 最终Sumclose / 过去daysAgo日,得到每日均价
Return Sumclose/daysAgo;
}
End
rate.longMarginRatio这里面放了什么?如果要获取保证金率必须先get一下,否则里面是空的,导致手数算出来无限大,肯定不能开仓
Params
Numeric Fund(50000); //投入保证金
Vars
Series<Numeric> Lots;
Series<Bool> cond2;
Series<Numeric> day_ma;
MarginRate rate;
Series<Numeric> stop_line;
Events
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
GetMarginRate(rate);
}
onBar(ArrayRef<Integer> indexs)
{
Lots=Max(1,IntPart(Fund/(O*ContractUnit*rate.longMarginRatio)));//BigPointValue*0.1
//记录开仓后高低点
PlotNumeric("Lots",Lots);
Commentary("BarsSinceEntry="+text(BarsSinceEntry));
day_ma = madd(10);
PlotNumeric("day_ma",day_ma);
//开仓条件
cond2 = CrossOver(close,day_ma);
PlotBool("cond2",cond2);
If(cond2[1])
{
Buy(lots,Open);
}
if (MarketPosition>0 )
{
stop_line = Close - 20;
if (stop_line<stop_line[1] and BarsSinceEntry>0)// and stop_line<>0
{
stop_line = stop_line[1];
}
if(L<stop_line[1] and stop_line[1]>0 and BarsSinceEntry>0)
{
Sell(0,Min(open, stop_line[1]));
}
}
PlotNumeric("stop_line",stop_line);
}
这样还是发不出信号