您现在的位置:程序化交易>> 期货公式>> 文华财经>> 文华财经公式>>正文内容

文华MQ股票池程序化的编写常见问题[文华财经公式]

三、编写常见问题

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次。
{
 Buy(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次。
   {  
SellShort(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)
 BuyToCover(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)(来源 www.cxh99.com

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) )
    {
Buy(lots);
    }
   Else If(Ref( CrossDown(Ma5,Ma10) ,1) )
    {
SellShort(lots);
    }

End

3、如何定义数组型变量(来源 www.cxh99.com
使用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<deep[i])
 k = k+1;
}
PlotNumeric("根数",k);
End

 

来源http://www.cxh99.com/2018/02/10/50054.shtml

 

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 1145508240  点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!

 


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容