网站建设需要会什么软件/许昌seo公司
模型根据从上至下,从左至右的顺序进行计算;编写中每一行计算,都能引用本次计算上面各行的计算结果
一、股票模型的机制:股票分为T+1模型和T+0模型
股票模型默认为T+1模型,T+0模型需要写入StockT0_Plus:True;启用T+0交易模式
(一)T+1模型:
通过低买高卖获得盈利,遵循股票T+1交易规则。
交易指令:BK买入;SP卖出
T+1交易即:当日买入股票,要到下一个交易日才能卖出。
如果没有老仓,日线周期上,在某一根k线上买入后,之后这根K线上的卖出信号会自动被过滤掉;分钟周期k线上,如果当时买入后,一日内后续K线上卖出信号会自动被过滤掉。
如果有老仓,一天之内既可以出现买入信号,也可以出现卖出信号
1、日线模型的编写:
(1)精密模式:写入PanZhong_Min函数
写入PanZhong_Min:N;语句的模型,一根日k线上可以出多个信号。可以先卖出股票后这根k线上再买回来;可以一根k线上实现加仓。
N参数的意义:出信号等N分钟后确认一下信号再下单,推荐参数用0;
模型采用逐分钟计算,模型一分钟计算一次,每一根日K线要计算240次,所以比一般的指标公式计算要慢的多。
例:编写模型最新价上穿5日均线买入,如果5日均线上穿10日均线再买入一次,10个点止盈,5个点止损。当根止损或止盈后如果满足满足条件还可以重新买入
Setting
AddTimes:2;//可以连续买入2次
PanZhong_Min:0;//出信号立即下单
Vars
NumericSeries MA1;
NumericSeries MA2;
begin
MA1=Ma(Close,5);
MA2=Ma(Close,10);
if(CrossUp(Close,MA1))
BK;
if(CrossUp(MA1,MA2))
BK;
if(Close>BKPrice+10*MinPrice || Close
SP;
PlotLine("MA1",MA1,White);
End
(2)精简模式:
默认一根K线只执行第一个信号;信号执行方式为出信号立即下单。
一根日k线计算一次,公式计算快,但是可能会有信号消失的情况
避免信号消失的编写要点:
K线走完确认信号下单,使用REF判断信号条件
K线盘中执行,使用High/Low判断信号条件
例:编写模型阳线买入,盈利10个点的时候,卖出一半持仓;阴线全部卖出
Begin
If(High>Open)//当根K线盘中为阳线时,买入开仓
BK(600);
If(Low>BKPrice+10*MinPrice)//当根K线盈利10个点的时候,卖出一半持仓
SP(300);
If(Low
SP(BKVol);
End
2、分钟周期模型的编写
一根K线只执行第一个信号;信号执行方式为出信号立即下单。
可能会出现信号消失。
分钟周期模型,可以实现一天内的多次加仓。
避免信号消失的编写要点:
(1)K线走完确认信号下单,使用REF判断信号条件
(2)K线盘中执行,使用High/Low判断信号条件
例子:编写模型阳线买入,阴线卖出
①
Setting
AddTimes:3;//可以连续卖出3次
Begin
If(Ref(IsUp,1)) //前一根K线确认为阳线,买入
BK(100);
If(Ref(IsDown,1))//前一根K线确认为阴线,卖出
SP;
End
②
Setting
StockT0_Plus:True;
Begin
If(Low
SK(600);
If(Low
BP(300);
If(High>Open)//当根K线盘中为阳线时,买入
BP;
End
(二)T+0模型:
若账户中有足够的历史持仓(底仓额度),可以通过日内“高点卖出》低点买入”的反复操作获得日内盈利,从而变相实现股票的T+0交易
交易指令:BK\SK\BP\SP\BPK\SPK
1)支持先卖出后买入:
SK/SPK信号为卖出股票,即减少底仓限额,对应信号是BP/BPK,BP代表买入股票,补足底仓;BPK代表买入股票,补足底仓(相当于BP)后在底仓可用额度范围内继续买入(相当于BK)之后再卖出。
2)支持先买入后卖出:
BK/BPK信号为买入股票,当模型中写入的手数大于底仓额度,按照底仓额度计算;当模型写入手数小于底仓额度,按照实际手数计算,对应信号可以是SP、SPK,SP代表卖出股票,减少底仓额度;SPK代表卖出股票,减少底仓额度(相当于SP)后在底仓可用额度范围内继续卖出(相当于SK)之后再买入。
编写要点:
模型写入StockT0_Plus:True;启用T+0交易模式
股票模型不支持信号消失的处理,模型编写中请避免信号消失
1、日线模型的编写:
写入PanZhong_Min:n;一根K线上的每个信号都执行;出信号N分钟下单,不复核;模型逐分钟回测、运行。
例:编写当根K线最新价下穿5日均线卖出,如果5日均线下穿10日均线再卖出一次,盈利10个点或亏损5个点就买入回补仓位
Setting
AddTimes:2;//可以连续卖出2次
StockT0_Plus:True;
PanZhong_Min:3;//根据逐分钟回测的方式执行出信号3分钟后下单,不进行复核
Vars
NumericSeries MA1;
NumericSeries MA2;
begin
MA1=Ma(Close,5);
MA2=Ma(Close,10);
if(CrossDown(Close,MA1))
SK;
if(CrossDown(MA1,MA2))
SK;
if(CloseSKPrice+5*MinPrice)//当根K线满足止盈、止损之后买入回补
BP;
PlotLine("MA1",MA1,White);
End
2、分钟周期模型的编写
一根K线只执行第一个信号;信号执行方式为出信号立即下单,信号消失不处理
避免信号消失的编写要点:
(1)K线走完确认信号下单,使用REF判断信号条件
(2)K线盘中执行,使用High/Low判断信号条件
例子:编写模型阳线买入,阴线卖出
①
Setting
AddTimes:3;//可以连续卖出3次
StockT0_Plus:True;
Begin
If(Ref(IsUp,1))//前一根K线确认为阳线,买入100股
BK(100);
If(Ref(IsDown,1)) //前一根K线确认为阴线,卖出
SP;
End
②
Setting
StockT0_Plus:True;
Begin
If(Low
SK;
If(High>Open)//当根K线盘中为阳线时,买入
SP;
End
二、期货模型的机制
模型默认信号执行方式为指令价(出信号立即下单),也支持编写多样的信号执行方式
模型默认为一根K线一个信号的模型,也支持编写一根K线多个信号的模型
模型默认为一次建仓模型,也支持编写连续建仓模型
(一)信号执行方式
1、默认信号执行方式
一根K线的第一个信号有效;
出信号立即下单,下单后到k线走完的的后续信号不再执行,K线走完后复核信号。
回测不考虑信号消失成本。
避免信号消失的编写要点:
(1)K线走完确认信号下单,使用REF判断信号条件
(2)K线盘中执行,使用High/Low判断信号条件
例子:编写模型阳线买入开仓,阴线卖出平仓
①
Begin
If(Ref(IsUp,1)) //前一根K线确认为阳线,买入开仓
BK;
If(Ref(IsDown,1))//前一根K线确认为阴线,卖出平仓
SP;
End
②
Begin
If(High>Open)//当根K线盘中为阳线时,买入开仓
BK;
If(Low
SP;
End
2、通过环境设置函数设定多样化的信号执行方式
(1)设置一根k线多信号的指令价方式
写入MultSig/MultSig_Min
出信号N秒下单,不进行信号复核;
可以设置一根K线多个信号;
回测方式为逐笔或逐分钟回测,不存在信号消失,回测与实盘运行结果一致
例:
Setting
MultSig:0,0,2,0;//出信号立即下单,不进行复核,一根K线最多可以出现2个信号
Vars
NumericSeries MA1;
NumericSeries MA2;
begin
MA1=Ma(Close,5);
MA2=Ma(Close,10);
if(CrossUp(Close,MA1))
BK;
if(Close>BKPrice+10*MinPrice || Close
SP;
PlotLine("MA1",MA1,White);
PlotLine("MA2",MA2,Yellow);
End
(2)SignalNoTrading 设置模型信号是否执行
如果软件自带的信号执行方式还不能满足您的需求,您可以通过自编信号执行方式实现。
不支持回测
(二)模型类型
1、一次建仓模型
默认为一次建仓模型,不允许连续出开仓信号,可以连续出平仓信号。
只有在持仓为0时才能开新仓,一次交易只能建一次仓,有多个开仓信号都满足条件的时候,取第一个信号作为有效信号,后面的K线上的同样信号将被过滤掉
编写要点:
(1)一开一平模型:开仓手数与平仓手数一致
(2)减仓模型:平仓手数小于开仓手数
例子:
①开平仓手数一致
Vars
NumericSeries MA1;
NumericSeries MA2;
begin
MA1=Ma(Close,5);
MA2=Ma(Close,10);
if(CrossUp(Close,MA1))
BK;
if(CrossUp(MA1,MA2))
BK;
if(Close>BKPrice+10*MinPrice || Close
SP;
PlotLine("MA1",MA1,White);
PlotLine("MA2",MA2,Yellow);
End
②平仓手数小于开仓手数
Vars
NumericSeries MA1;
NumericSeries MA2;
begin
MA1=Ma(Close,5);
MA2=Ma(Close,10);
if(CrossUp(Close,MA1))
BK(2);
if(CrossUp(MA1,MA2))
BK(1);
if(Close>BKPrice+10*MinPrice || Close
SP(1);
PlotLine("MA1",MA1,White);
PlotLine("MA2",MA2,Yellow);
End
2、连续建仓模型
模型通过写入AddTimes控制一次交易过程中的最大建仓次数,允许连续出开仓信号和平仓信号;
达到最大连续建仓次数后,平掉连续建仓的首次建仓,才能另开新仓。
例:
Setting
AddTimes:3;
Vars
NumericSeries MA1;
NumericSeries MA2;
begin
MA1=Ma(Close,5);
MA2=Ma(Close,10);
if(CrossUp(Close,MA1))
BK(2);
if(CrossUp(MA1,MA2))
BK(1);
if(Close>BKPrice+10*MinPrice || Close
SP(1);
PlotLine("MA1",MA1,White);
PlotLine("MA2",MA2,Yellow);
End
三、编写常见问题
1、如何定义策略中使用的全局变量
(1)K线图公式/TICK图公式
①NumericSeries、StringSeries定义序列型变量
盘中运行:记录下每根K线的运算结果,用于下根K线的计算
回测:支持回测
注:TICK周期上每笔TICK一根K线,定义序列型变量,当根K线计算模型时使用上根K线的运算结果,相当于全局变量的用法
例子:通过序列变量控制一天之内总的开仓次数(开多+开空)
Setting
AddTimes:5;
Params
Numeric Length(3); // 周期
Vars
NumericSeries BarN; //当日K线根数
NumericSeries myflag; // 交易次数
Begin
// ------------------- 取当日K线根数及交易次数 -----------------
If(date!=date[1])
{
BarN= 1 ;
myflag =0;
}
else BarN= BarN[1]+1;
// ----------------------- 多头开仓--------------------
If (MarketPosition!=-1 And Vol > 0 )
{
If(Every(IsUp,Length) And BarN>=Length And CloseMinute>=5 And myflag<= 5)
//连续三根收阳,则开多单,最多连续开5次。
{
BPK(0, Active_Order);
myflag = myflag+1;
}
}
// ------------------------ 空头开仓-----------------
If (MarketPosition!=1 And Vol > 0 )
{
If(Every(IsDown,Length) And BarN>=Length And CloseMinute>=5 And myflag<= 5)
//连续三根收阴,则开空单,最多连续开5次。
{
SPK(0,Active_Order);
myflag = myflag+1;
}
}
If(CloseMinute<=5 And BarsSinceEntry > 0 And Vol > 0)
{
// ------------------------- 尾盘多头平仓----------------
If(MarketPosition == 1 )
Sell(0, Active_Order);
// ---------------------- 尾盘空头平仓-------------
If(MarketPosition == -1)
BP(0, Active_Order);
}
End
②GetGlobalVar(Index)、SetGlobalVar(Index,Val);GetGlobalVar2(Str)、SetGlobalVar2(Str,Val)
盘中运行:记录下每笔TICK的运算结果,用于之后的计算
回测:不支持回测
(2)算法交易公式
Global_Numeric、Global_NumericArray、Global_String、Global_StringArray定义全局变量或使用GetGlobalVar(Index)、SetGlobalVar(Index,Val);GetGlobalVar2(Str)、SetGlobalVar2(Str,Val)
盘中运行:记录下每笔TICK的运算结果,用于之后的计算
回测:支持算法交易回测
例子:通过全局变量,控制交易重复执行
(1)
Data
data0:"m1801";
Vars
Global_Numeric type;
Begin
If(data0.A_BuyProfitLoss()>5000&&type == 0) //如果该合约多头盈亏大于5000,加仓1手
{
data0.A_SendOrder(Enum_Buy,Enum_Entry,1,data0.price("Ask1"));
type = 1; //加仓后type重新赋值,避免重复执行
}
End
(2)
Data
data0:"m1801";
Begin
If(data0.A_BuyProfitLoss()>5000 && GetGlobalVar(0) == 0) //如果该合约多头盈亏大于5000,加仓1手
{
data0.A_SendOrder(Enum_Buy,Enum_Entry,1,data0.price("Ask1"));
SetGlobalVar(0,1); //加仓后全局变量第一个位置重新赋值,避免重复执行
}
End
2、如何定义布尔型变量
使用Numeric、NumericSeries定义数值型变量代替
变量返回值:1代表True;0代表Flse
例子:通过设置决定是否启用按资金比例下单
Vars
NumericSeries Ma5; //5周期均线
NumericSeries Ma10; //10周期均线
Numeric Buytype(0);//是否启用按资金比例下单
Numeric lots;//下单手数
Begin
If(Buytype ==0 )
{
lots = 5;//固定5手开仓
}
Else If(Buytype == 1 )
{
lots = MoneyTot*0.2/(Close*ContractUnit*MarginRatio);//按资金的百分之20开仓
}
Ma5 = Ma(Close,5);
Ma10 = Ma(Close,10);
If(Ref( CrossUp(Ma5,Ma10) ,1) )
{
BPK(lots);
}
Else If(Ref( CrossDown(Ma5,Ma10) ,1) )
{
SPK(lots);
}
End
3、如何定义数组型变量
使用NumericArray、StringArray、Global_StringArray定义不同类型的数组变量
例子:取得最近10根K线内最高价小于当前K线,最低价大于当前K线的K线数量
Vars
NumericArray deep;
Numeric i;
Numeric j;
Numeric k;
Begin
For i =0 To 9
{
If( High>High[i])
{
deep[j]=Low[i];
j = j+1;//装入最近的10根K线内小于当根最高价的K线的最低价
}
}
For i =0 To j-1
{
If( Low
k = k+1;
}
PlotNumeric("根数",k);
End