龙哥量化:通达信文华技术指标-双均线跟踪止盈的期货量化策略思路居然会偷价第一篇(动态止盈静态止盈浮动止盈)

如果您需要代写技术指标公式, 请联系我。

龙哥QQ:591438821

龙哥微信:Long622889

也可以把您的通达信,文华技术指标改成TB交易开拓者、金字塔、文华8的自动交易量化策略

开始分享一些细致化的思路和写法我用的是TB交易开拓者。对量化感兴趣的朋友可以多交流

这篇介绍重点介绍跟踪止盈的写法,用双均线举例

先看一下代码,可以复制运行的

基本每行代码都用汉字解释了,代码的末尾重点说一下为啥还要用min,max

仔细看过前面两篇介绍固定止盈止损的代码的朋友,可能注意到了, 止盈止损的模块写在了前面, 而这篇的代码, 写在了后面,

是因为,在历史的静态K线上运行代码, 从K线的左边往右,每个K线只执行一次代码(从上往下)

而盘中,K线闪动一次就执行一次代码(从上往下)。

朋友, 你先复制一下代码,运行一下吧,

然鹅,此代码模块不能直接用哦,会偷价的

Params
Numeric qty(1); //手数
Numeric ma1_n(20); //短均线参数
Numeric ma2_n(60); //长均线参数
Numeric zhiying_tiao(30); // 跟踪止盈x跳
Vars
Series<bool> BK_xinhao; //开多-信号
Series<bool> SK_xinhao; //开空-信号
Series<bool> SP_xinhao; //平多-信号
Series<bool> BP_xinhao; //平空-信号
Series<Numeric> ma1; //均线ma1
Series<Numeric> ma2; //均线ma2
Numeric yitiao; //一跳,比如豆油一跳2个点
global Numeric didian; //记录开空之后的最低点
global Numeric gaodian; //记录开多之后的最高点
Events
OnInit()
{
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
}
onBar(ArrayRef<Integer> indexs)
{
yitiao=MinMove*PriceScale; //一跳
ma1 = Averagefc(close,ma1_n); //短均线ma1
ma2 = Averagefc(close,ma2_n); //长均线ma2
PlotNumeric("ma1",ma1,ma1,red); //在图上画出ma1,红色,主图副图,是在公式属性设置, 属性-->显示方式-->主图
PlotNumeric("ma2",ma2,ma2,green); //在图上画出ma2,绿色
//多信号-------------------------------------------------------------
BK_xinhao = CrossOver(ma1,ma2); //金叉开多
SP_xinhao = Crossunder(ma1,ma2); //死叉平多
//空信号-------------------------------------------------------------
SK_xinhao = Crossunder(ma1,ma2); //死叉开空
BP_xinhao = CrossOver(ma1,ma2); //金叉平空
//开仓-----------------------------------------------------------------------
if (MarketPosition==0 and BK_xinhao[1]) //这里重点说明,当根K线走完,确定金叉了, 在下一个K线的开盘价开仓
{
Buy(qty, open);
}
if (MarketPosition==0 and SK_xinhao[1])
{
SellShort(qty, open);
}
if (MarketPosition>0 and SP_xinhao[1])
{
Sell(0, open);
}
if (MarketPosition<0 and BP_xinhao[1])
{
BuyToCover(0, open);
}
//跟踪止盈------------------------------------------------------
if(MarketPosition == 1) // 有多仓的情况,博客末尾详细说明
{
gaodian=NthHigher(high, BarsSinceEntry+1,1); //用全局变量记录开仓以来的最高价,NthHigher函数和通达信的HHV函数一样
Commentary("高点: "+Text(gaodian)); //展示一下最高价,用来核对
if(low<=gaodian-zhiying_tiao*yitiao) //从最高价回落多少点数,平仓,注意,这里说的是跟踪止盈, 平仓的时候不一定是盈利
{
Sell(0, min(open, gaodian-zhiying_tiao*yitiao)); //比较一下用较小值,open和计算的平仓价
}
}
else if(MarketPosition == -1) // 有空仓的情况
{
didian=Nthlower(low, BarsSinceEntry+1,1);
Commentary("低点: "+Text(didian));
if(high>=didian+zhiying_tiao*yitiao)
{
BuyToCover(0, max(open, didian+zhiying_tiao*yitiao));
}
}
}

 

以多单为例,说一下跟踪止盈,金叉了, 要等K线收盘确定了,在下一个K线的开盘价开多,7470开多,

gaodian=NthHigher(high, BarsSinceEntry+1,1);  //用全局变量gaodian记录开仓以来的最高价,NthHigher函数和通达信的HHV函数作用一样

高点:HHV( HIGH,  N);

开多仓的当根K线是最高价,然后就一路下跌,跟踪止盈的点数是30跳,60点,gaodian记录的最高价是7478,   7478减60点,跟踪止盈价是7418,

核对图上的信号,也没问题

 

在上面这个例子中, 我把跟踪止盈模块放前面,开仓模块放后面,来看一下图上的信号

先看代码的执行顺序

1号K线,先执行跟踪止盈模块,没有持仓,不记录高点,再执行开仓模块, 开仓,开仓价是7470

2号K线,先执行跟踪止盈模块,有持仓,记录高点,2号K线最高价是7452,执行开仓模块,有持仓不执行

3号,4号,5号,6号,都是先执行跟踪止盈模块,有持仓,但是最高点没有比7452更高,所以高点还是7452,执行开仓模块,有持仓不执行

7号K线, 先执行跟踪止盈模块,有持仓,计算高点和最低点的差,高点7452  最低价7392,跟踪止盈60点, 7452-7392=60点, 符合if条件, 执行跟踪止盈

 

这里和上面的代码对比,静态对比中多亏一些,但是盘中又是一样的。

哎呀, 我暂时没想到完美的解决的办法,把跟踪止盈模块,前面放一个,后面也放一个,虽然可行,但是啰嗦了点

而且,跟踪止盈还会偷价, 我遇到的哦, 后面一篇再说

 

这里用空单说一下,为什么要用max比较一下,7414开空,然后最低点是7366,跟踪止盈点数60点, 跟踪止盈价7366+60=7426,但是,开盘向上跳空,开盘价是7430,已经大于计算的跟踪止盈价,所以要用max比较一下,max(open,计算的跟踪止盈价)这里实际的止盈价是7430

 

posted @   龙哥量化  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版
点击右上角即可分享
微信分享提示