虚拟货币期货微交易源码
我一直也在用均线的交易系统,可关于四均线交易系统,还真没想过这个,一般都只用两根的比较。这可以借鉴一下思路,好不好,就看个人喜好了。
策略说明:
基于4均线系统进行判断交易
系统要素:
(5和20周期均线),(3和10周期均线)构成的两组不同周期的均线组合
入场条件:
当2组均线均成多头排列时且当前价高于上根BAR最高价入场
出场条件:
1. 小周期多头均线组合成空头排列
2. 两组空头均线分别空头排列且低于上根BAR最低价出场
均线嘛,也不涉及什么新函数了,就是一个求均值函数Average,这个解读过,下边复制一下,让大家重温看下,不做解读,代码如下:
Params
NumericSeries Price(1);
Numeric Length(10);
Vars
Numeric AvgValue;
Begin
AvgValue = Summation(Price, Length) / Length;
Return AvgValue;
End
接下来直接看这四均线交易系统的做多代码及相应解读了,如下:
Params
Numeric LEFast(5); //声明数值参数LEFast,初值5,即多头入场短均线周期参数。//
Numeric LESlow(20); //声明数值参数LESlow,初值20,即多头入场长均线周期参数。//
Numeric LXFast(3); //声明数值参数LXFast,初值3,即多头出场短均线周期参数。//
Numeric LXSlow(10); //声明数值参数LXSlow,初值10,即多头出场长均线周期参数。//
Numeric SEFast(5); //声明数值参数SEFast,初值5,即空头入场短均线周期参数。//
Numeric SESlow(20); //声明数值参数SESlow,初值20,即空头入场长均线周期参数。//
Numeric SXFast(3); //声明数值参数SXFast,初值3,即空头出场短均线周期参数。//
Numeric SXSlow(10); //声明数值参数SXSlow,初值10,即空头出场长均线周期参数。//
Vars
NumericSeries MALEFast;//声明数值序列变量MALEFast,即多头入场短均线。//
NumericSeries MALESlow;//声明数值序列变量MALSlow,即多头入场长均线。//
NumericSeries MALXFast;//声明数值序列变量MALXFast,即多头出场短均线。//
NumericSeries MALXSlow;//声明数值序列变量MALXSlow,即多头出场长均线。//
NumericSeries MASEFast;//声明数值序列变量MASEFast,即空头入场短均线。//
NumericSeries MASESlow;//声明数值序列变量MASEFSlow,即空头入场长均线。//
NumericSeries MASXFast;//声明数值序列变量MASXFast,即空头出场短均线。//
NumericSeries MASXSlow;//声明数值序列变量MASXSlow,即空头出场长均线。//
Begin
If(!CallAuctionFilter()) Return;// 集合竞价和小节休息过滤。//
//下来这些都是关于均线的算法,即代入相应收盘价与周期返回求值就行。//
MALEFast=Average(Close,LEFast);//多头入场短均线。//
MALESlow=Average(Close,LESlow);//多头入场长均线。//
MALXFast=Average(Close,LXFast);//多头出场短均线。//
MALXSlow=Average(Close,LXSlow);//多头出场长均线。//
MASEFast=Average(Close,SEFast);//空头入场短均线。//
MASESlow=Average(Close,SESlow);//空头入场长均线。//
MASXFast=Average(Close,SXFast);//空头出场短均线。//
MASXSlow=Average(Close,SXSlow);//空头出场长均线。//
//系统入场的条件设置。//
If(Marketposition <> 1 and Currentbar >= 100) //假如当前没有持多单,并且当前k线索引值大于等于100的。//
{
If(MALEFast[1] > MALESlow[1] and MALXFast[1] > MALXSlow[1] and High >= High[1] And Vol > 0)//就是拿快慢两均线对比了,形成两组均线均成多头排列时且当前价高于上根k线的最高价入场。//
{
Buy(0,Max(Open,High[1]));//开多,价格为前一k线最高价与开盘价的比较取大值。//
}
}
//系统出场条件设置。//
If(marketposition == 1 and BarsSinceEntry > 0 And Vol > 0)//假如当前持有多单,并且开仓的k线数位大于0,并且成交量大于0.//
{
If(MALXFast[1] < MALXSlow[1] ) //两均线对比,形成小周期多头均线组合成空头排列出场。//
{
Sell(0,Open);//以开盘价平仓了。//
}
Else If( MASEFast[1] < MASESlow[1] and MASXFast[1] < MASXSlow[1] and Low <= Low[1]) //两组均线分别空头排列且低于上根k线最低价出场。//
{
Sell(0,Min(Open,Low[1]));//开空,价格为前一k线最低价与开盘价的比较取小值。//
}
}
End
解读完源代码,我觉得还好,但可能不符合我的操作理念,它这里边设置的参数太多了,看着我都头晕,而且这盈亏比一般,成功率也不高,当然这些参数都可以依据个人喜好而修改的。我更喜欢的是用一根200-360的周期确定多空方向,再根据个人喜好选定两条均线参数。好了,也不废话了,直接看做空的四均线源代码及结果如下:
Params
Numeric LEFast(5);
Numeric LESlow(20);
Numeric LXFast(3);
Numeric LXSlow(10);
Numeric SEFast(5);
Numeric SESlow(20);
Numeric SXFast(3);
Numeric SXSlow(10);
Vars
NumericSeries MALEFast;
NumericSeries MALESlow;
NumericSeries MALXFast;
NumericSeries MALXSlow;
NumericSeries MASEFast;
NumericSeries MASESlow;
NumericSeries MASXFast;
NumericSeries MASXSlow;
Begin
If(!CallAuctionFilter()) Return;
MALEFast=Average(Close,LEFast);
MALESlow=Average(Close,LESlow);
MALXFast=Average(Close,LXFast);
MALXSlow=Average(Close,LXSlow);
MASEFast=Average(Close,SEFast);
MASESlow=Average(Close,SESlow);
MASXFast=Average(Close,SXFast);
MASXSlow=Average(Close,SXSlow);
If(Marketposition <> -1 and Currentbar >= 100)
{
If(MASEFast[1] < MASESlow[1] and MASXFast[1] < MASXSlow[1] and Low <= Low[1] And Vol > 0)
{
SellShort(0,Min(Open,Low[1]));
}
}
If(MarketPosition == -1 and BarsSinceEntry > 0 And Vol > 0)
{
If(MASXFast[1] > MASXSlow[1])
{
BuyToCover(0,Open);
}
Else if( MALEFast[1] > MALESlow[1] and MALXFast[1] > MALXSlow[1] and High >= High[1] )
{
BuyToCover(0,Max(Open,High[1]));
}
}
End
看着结果总感觉别扭,既然写到这了,我就按照我上面的意愿修改一下,看结果如何的。修改的代码及结果如下:
Params
Numeric LEFast(20);
Numeric LESlow(50);
Numeric LXFast(300);
Vars
NumericSeries MALEFast;
NumericSeries MALESlow;
NumericSeries MALXFast;
Begin
If(!CallAuctionFilter()) Return;
MALEFast=Average(Close,LEFast);
MALESlow=Average(Close,LESlow);
MALXFast=Average(Close,LXFast);
If(Marketposition <> 1 and Currentbar >= 100)
{
If(MALEFast[1] > MALESlow[1] and Close[1] > MALXFast[1] and High >= High[1] And Vol > 0)
{
Buy(0,Max(Open,High[1]));
}
}
If(marketposition == 1 and BarsSinceEntry > 0 And Vol > 0)
{
If( MALEFast[1] < MALESlow[1] and Low <= Low[1])
{
Sell(0,Min(Open,Low[1]));
}
}
If(Marketposition <> -1 and Currentbar >= 100)
{
If(MALEFast[1] < MALESlow[1] and Close[1] < MALXFast[1] and Low <= Low[1] And Vol > 0)
{
SellShort(0,Min(Open,Low[1]));
}
}
If(MarketPosition == -1 and BarsSinceEntry > 0 And Vol > 0)
{
if( MALEFast[1] > MALESlow[1] and High >= High[1] )
{
BuyToCover(0,Max(Open,High[1]));
}
}
End
看这结果相对好多的吧,所以一个程序化交易系统,在你理解基础上,按照你个人经验修改好,比单纯的复制粘贴,不理解具体意思,只是粗略看结果,这没什么进步的。你借鉴别人的买卖规则,再加入自己的理解,一个好的程序基本是可以做出来的。