//---------------------------------------------
Params
Numeric lookBackDays(26); // 布林通道均线周期
Numeric bolBandTrig(1); // 布林通道参数,用于计算上下轨的倍数
Numeric Lots(0); // 交易手数
Numeric Longswitch(1); //多头开关 0关闭 1开启
Numeric Shortswitch(1); //空头开关 0关闭 1开启
Vars
Series<Numeric> MidLine(0); // 布林通道中轨
Series<Numeric> upBand(0); // 布林通道上轨
Series<Numeric> dnBand(0); // 布林通道下轨
Events
OnInit()
{
}
OnBar(ArrayRef<Integer> indexs)
{
Range[0:DataCount-1]
{
// 计算布林通道指标
MidLine = Average(Close, lookBackDays);
Numeric Band = StandardDev(Close, lookBackDays, 2);
upBand = MidLine + bolBandTrig * Band;
dnBand = MidLine - bolBandTrig * Band;
// 绘制布林通道
PlotNumeric("upBand", upBand);
PlotNumeric("dnBand", dnBand);
PlotNumeric("MidLine", MidLine);
// 多头开仓逻辑
If(MarketPosition == 0 And h >= upBand[1] and Longswitch ==1)
Buy(Lots, max(open,upBand[1]));
// 空头开仓逻辑
If(MarketPosition == 0 And l <= dnBand[1] and Shortswitch ==1)
SellShort(Lots, min(open,upBand[1]));
// 多头平仓逻辑
If(MarketPosition == 1 And low <= MidLine[1])
Sell(0, min(open,MidLine[1]));
// 空头平仓逻辑
If(MarketPosition == -1 And high >= MidLine[1])
BuyToCover(0, max(open,MidLine[1]));
}
}
//------------------------------------------------------------------------
// 编译版本 2025-03-13 09:54:41 Thursday
// 版权所有
// 更改声明 TradeBlazer Software 保留对 TradeBlazer 平台
// 每一版本的 TradeBlazer 公式修改和重写的权利
//------------------------------------------------------------------------
这是最新的最高最低价的止损
然后你股指锁仓的问题,股指是默认开平互转的(不平今),他是自动锁仓
在系统设置里可以取消
你们做股票方面的编程吗?
我想把这boll策略,也用到股票上。还有macd的一个策略,也用在股票上。
另外,你们有现成的海龟交易法则的编程吗?我直接买一个
股票门槛较高需要300W资金开户
策略逻辑上股票和期货区别不大
海龟策略软件内有内置
是说必须有股票账户绑定了,才给编程吗?
我先编程,回测/模拟,之后再绑定实盘账户。
开户和代写是独立的,客户可以自选哪边先做
鉴于股票户很难就是了(门槛较高)
好,那我想编一个股票策略,也是与期货类似,也是BOLL指标为主的
也是可以,新内容可以新发一个帖子
//---------------------------------------------
Params
Numeric lookBackDays(26); // 布林通道均线周期
Numeric bolBandTrig(1); // 布林通道参数,用于计算上下轨的倍数
Numeric Lots(0); // 交易手数
Numeric Longswitch(1); //多头开关 0关闭 1开启
Numeric Shortswitch(1); //空头开关 0关闭 1开启
Vars
Series<Numeric> MidLine(0); // 布林通道中轨
Series<Numeric> upBand(0); // 布林通道上轨
Series<Numeric> dnBand(0); // 布林通道下轨
Events
OnInit()
{
}
OnBar(ArrayRef<Integer> indexs)
{
Range[0:DataCount-1]
{
// 计算布林通道指标
MidLine = Average(Close, lookBackDays);
Numeric Band = StandardDev(Close, lookBackDays, 2);
upBand = MidLine + bolBandTrig * Band;
dnBand = MidLine - bolBandTrig * Band;
// 绘制布林通道
PlotNumeric("upBand", upBand);
PlotNumeric("dnBand", dnBand);
PlotNumeric("MidLine", MidLine);
// 多头开仓逻辑
If(MarketPosition == 0 And h >= upBand[1] and Longswitch ==1)
Buy(Lots, max(open,upBand[1]));
// 空头开仓逻辑
If(MarketPosition == 0 And l <= dnBand[1] and Shortswitch ==1)
SellShort(Lots, min(open,upBand[1]));
// 多头平仓逻辑
If(MarketPosition == 1 And Close[1] <= MidLine[1])
Sell(0, open);
// 空头平仓逻辑
If(MarketPosition == -1 And Close[1] >= MidLine[1])
BuyToCover(0, open);
}
}
//------------------------------------------------------------------------
// 编译版本 2025-03-13 09:54:41 Thursday
// 版权所有
// 更改声明 TradeBlazer Software 保留对 TradeBlazer 平台
// 每一版本的 TradeBlazer 公式修改和重写的权利
//------------------------------------------------------------------------
代码已交付
请查收,有问题继续这里提出
实盘/模拟盘中,没有按信号成交啊。价格低于中轨了,但是没有成交。导致多亏了好几千!
平仓条件:
做多:盘中价格低于等于上一个k线对应的中轨。
做空:盘中价格高于等于上一个k线对应的中轨
上次我写成收盘价了,抱歉。能帮我改一下吗?
平仓条件修改为:
做多平仓:盘中最低价低于等于上一个k线对应的中轨。
做空平仓:盘中最高价高于等于上一个k线对应的中轨
该项内容收费100
https://shop.tbquant.net/overviews?item_id=1000026
拍下截图即可
已拍下。
另外,我发现还有个问题:比如持有多头,本来该平仓的,却不平仓,而是开了空头锁仓,我希望是直接平掉。这是个问题,希望能改正。谢谢。
这个具体截图说明一下
这是我的一个模拟账户今天的成交,本该平仓,但它是锁仓。
策略需求文档 20250307
1 策略运行环境
1.1 平台
1.1.1 TBQuant
1.2 公式实现:图表
2 数据计算部分
2.1 常规Boll 指标(26,1)的 上轨,下轨,中轨
2.2 收盘价指每根K线的收盘价
3 开仓部分
3.1 多头开仓
3.1.1 当前价格大于等于上一根k线对应的上轨
3.2 空头开仓
3.2.1 当前价格小于等于上一根k线对应的下轨
4 平仓部分
4.1 多头平仓
4.1.1 收盘价低于等于上一根k线对应的中轨价格
4.2 空头平仓
4.2.1 收盘价低于等于上一根k线对应的中轨价格
5 其他需要注意的部分
变量:(以下为可以自己调整的参数)
(1)BOLL指标的均线和标准差
(2)手数
(3)多方/空方/多空双方
已经缴费了。大概何写好?是直接发到我的邮箱里还是微信?
收到,已安排
策略会发在帖子内,注意查收
我有现成的策略,请帮着修改一个bug:
当前k线无法多次成交,比如买入成功后,当前k线触及平仓线时或者再次触及做空信号时,只能等到下一个k线才可以,耽误了时机
1 策略运行环境
1.1 平台
1.1.1 TBQ
1.2 公式实现:图表
2 数据计算部分
2.1 常规Boll 指标(26,1)的 上轨,下轨,中轨
2.2 收盘价指每根K线的收盘价
3 开仓部分
3.1 多头开仓
3.1.1 当前价格高于,并突破上一根k线对应的上轨,
3.2 空头开仓
3.2.1 当前价格低于,并突破上一根k线对应的下轨
4 平仓部分
4.1 多头平仓
4.1.1 收盘价低于上一根k线对应的中轨价格,按收盘价确认
4.2 空头平仓
4.2.1 收盘价低于上一根k线对应的中轨价格,按收盘价确认
5 其他需要注意的部分
以损定量开仓
以上是您发送的需求,有一些修改,若干的问题需要您回答
1. 您说是修改策略,不过看您只贴了需求,那么按照需求编写
2.以损定量需要更精确的内容
我怎么将现成的策略发给你?刚才附件中不让上传.fbk 文件。
有邮箱吗?
代码复制在贴内即可
//------------------------------------------------------------------------
// 简称: Q01_V1_1124
// 名称: Q01更新日期20241124
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
Numeric Length(20,20,26,1); //周期
Numeric Offset(2); //标准差倍数
Integer Fund(50000);//加仓最大额度;
Numeric Frist_fund(3000,1000,6000,1000);//单笔亏损额
Numeric Enter_time(9,1,18,1);//加仓次数 至少加一手
Enum<String> Trend_options(["多空都做","只做多","只做空"]);//多空模式选择
Bool ISexit(True);//是否启动开仓第一根bar止损
Numeric MVP(50);//亏损跳数
Vars
Numeric UpLine; //上轨
Numeric DownLine; //下轨
Series<Numeric> MidLine; //中间线
Numeric Band;
Numeric StartVOL;
Series<Numeric> Enter_price; //中间线
Series<Numeric> Close_Rollover; //中间线
Series<Numeric> Band_Rollover; //中间线
Series<Numeric> time_long;
Series<Numeric> time_short;
Series<Numeric> Lots;
Series<Numeric> Lott;
Series<Numeric> MP_D;
Series<Numeric> MP_K;
Global Numeric Sign0;//状态码
Global Numeric Sign1;//状态码
Global Numeric CurrentVolume1;//状态码
Global Numeric CurrentVolume2;//状态码
Global Numeric MinPoint;//
Global Integer cancelId;
Numeric intervalSecs(3); //监控间隔
Global Numeric long_sign;
Global Numeric short_sign;
Global array<Integer> my_id;
Global Bool sign2;
Defs
//此处添加公式函数
Events
OnReady()
{
//根据操作源订阅委托
Bool ret = A_SubscribeTradeByCreateSource(A_GetOrderCreateSource);
Print("A_SubscribeTradeByCreateId:" + IIFString(ret, "True", "False"));
//获取报单源名称
Print("A_GetOrderCreateSource:" + A_GetOrderCreateSource);
Sign0=0;
CurrentVolume1=0;
CurrentVolume2=0;
MinPoint = PriceScale * MinMove;//计算每跳价值
}
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
//=========除权换月相关设置==============
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
Bool ret = SetSwapPosVolType(2); //设置自动换仓量类型
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
MidLine = AverageFC(Close[1],Length);
Band = StandardDev(Close[1],Length,2);
UpLine = Round(MidLine + Offset * Band,0);
DownLine = Round(MidLine - Offset * Band,0);
Close_Rollover=Close[1]/Rollover;
Band_Rollover=StandardDev(Close_Rollover,Length,2);
PlotNumeric("UpLine", UpLine);
PlotNumeric("DownLine", DownLine);
PlotNumeric("MidLine", MidLine);
Lots=IntPart(Fund/(O/rollover*ContractUnit*BigPointValue*0.1));
Lott=Max(1,Round(Frist_fund / ((Offset *Band_Rollover ) *BigPointValue*ContractUnit),0));
StartVOL=Min(Lots,Lott);
//Commentary("band:"+Text(Band_Rollover));
If(MarketPosition==0 And High>=UpLine and Trend_options!="只做空")
{
Enter_price=Max(Open,UpLine);
Buy(StartVOL,Enter_price);
PlotString("A","首:"+text(EntryPrice/rollover),H*1.01,Red);
time_long=1;
}
If(MarketPosition==0 And Low<=DownLine and Trend_options!="只做多")
{
Enter_price=Min(Open,DownLine);
SellShort(StartVOL,Enter_price);
PlotString("B","首:"+text(EntryPrice/rollover),L*0.99,Green);
time_short=1;
}
//==================================中轨止损============================
If(MarketPosition==1 And Low<=MidLine and BarsSinceLastEntry>0 )
{
Sell(0,Min(Open,MidLine));
}
If(MarketPosition==-1 And High>=MidLine and BarsSinceLastEntry>0 )
{
BuyToCover(0,Max(Open,MidLine));
}
//=================================加仓==================================
If(MarketPosition ==1 and time_long[1]<=Enter_time ) // 如果目前是多头持仓
{
If(BarsSinceLastEntry>0 And MidLine>=Enter_price[1] and BarsSinceLastEntry>0 and Trend_options!="只做空")
{
Enter_price=Open;
Buy(StartVOL,Enter_price);
PlotString("d","加"+text(longLastEntryPrice/rollover),H*1.01,yellow);
time_long=time_long[1]+1;
}
}
If(MarketPosition ==-1 and time_short[1]<=Enter_time ) // 如果目前是空头持仓
{
If(BarsSinceLastEntry>0 And MidLine<=Enter_price[1] and BarsSinceLastEntry>0 and Trend_options!="只做多")
{
Enter_price=Open;
SellShort(StartVOL,Enter_price);
PlotString("C","加"+text(shortLastEntryPrice/rollover),L*0.99,white);
time_short=time_short[1]+1;
}
}
//===================换月=======
If(HasRollover and MarketPosition <>0)
{
PlotString("e","除权",H*1.01,white);
}
If(BarStatus == 2 and IsTradeEnabled and istradingtime(MainSymbol,systemdatetime) and ISexit) //在交易时间开启了bar内止损
{
sign2=MarketPosition !=0 and BarsSinceEntry==0 ;
If(sign2)
{
Sign0=1;//正常交易时间
}
If(sign2==False)
{
Sign0=0;
Bool ret = StopTimer(cancelId);
Print("停止计时器" + IIFString(ret, "True", "False"));
}
}
If(MarketPosition !=0 and BarsSinceEntry==0 and Sign0==1)
{
cancelId=CreateTimer(intervalSecs*1000);Print("---------启动定时器---------");//创建计时器 intervalSecs 秒执行一次
}
If(BarStatus==2 )
{
Position pos;
//获取指定合约当前仓位
Bool ret = A_GetPosition(MainSymbol, pos,A_GetOrderCreateSource);
long_sign=pos.longCanSellVolume;
short_sign=pos.shortCanCoverVolume;//多头未成交 开仓单的数量
}
}
OnTimer(Integer id,Integer millsecs) //默认3秒执行一次
{
If(Sign0==1)
{
Sign1=1;
If(long_sign>0 and EntryPrice-Close>=MVP*MinPoint and Sign1==1)
{
A_SendOrderEx(Enum_Sell,Enum_Exit,long_sign,Close,my_id);Print("---------SP发出-平多---------");
Sign1=0;
}
If(abs(short_sign)>0 and Close-EntryPrice>=MVP*MinPoint and Sign1==1)
{
A_SendOrderEx(Enum_Buy,Enum_Exit,abs(short_sign),Close,my_id);Print("---------发出-平空---------");
Sign1=0;
}
}
}
那这个需求文档有需要参考的部分吗?
不参考也可以,直接将现成的代码的bug给修正了就行。
改写还是新写差距很大
改写需要具体说明产生bug的语句代码,另外也要有完整的代码交易逻辑语句,这个需要你提供。不然无法确认哪个"BUG"是需要修改的
你想要想清楚以上的问题。
改写的话,原策略的交易逻辑请用文字说明。
我再补充一下:
改写的问题在于你要说明原代码的策略(中文表述),并说明哪里需要修改,当原代码存在问题时,这个改写的难度会加大。
所以你能理清逻辑的情况下,建议新写
好,那就新写一个吧。
1 策略运行环境
1.1 平台
1.1.1 TBQ 1.4.2.1
1.2 公式实现:图表或其他(无所谓)
2 数据计算部分
2.1 常规Boll 指标(26,1)的 上轨,下轨,中轨
2.2 收盘价指每根K线的收盘价
3 开仓部分
3.1 多头开仓
3.1.1 当前价格大于等于上一根k线对应的上轨,
3.2 空头开仓
3.2.1 当前价格低于,并突破上一根k线对应的下轨
4 平仓部分
4.1 多头平仓
4.1.1 收盘价低于等于上一根k线对应的中轨价格
4.2 空头平仓
4.2.1 收盘价低于等于上一根k线对应的中轨价格
5 其他需要注意的部分
变量:(以下为可以自己调整的参数)
(1)BOLL指标的均线和标准差
(2)手数
(3)多方/空方/多空双方
(4)操作周期,15分钟/30分钟/60分钟/日
此策略主要是做股指期货
周期不作为参数了,直接图表设置