
量化策略开发,高质量社群,交易思路分享等相关内容
『正文』
ˇ
去年12月的时候我们初次体验ChatGPT,《ChatGPT生成量化交易策略》.
当时还是很惊喜的,可以辅助写代码,写注释,给出一些示例。使用的时间长了发现写一些基础的东西还行,太复杂的内容BUG会比较多吧,有时候也是答非所问。学习了github,给出的很多示例都可以在github找到。当然了,你不能对现阶段的公开版Ai要求太苛刻了。这几个月白嫖下来,我个人是非常满意的,帮我解决了不少问题,真的是一个非常不错的效率工具。
经过几个月的时间Chat也出了付费的版本,一个月20刀的价格我觉的相当良心了,更快的响应速度,更长的字数。这要是国内的厂商,路子就比较广泛了,分模块付费,SVIP,免费版植入广告等等,老生常谈了。
OK,言归正传。Chat新增了多个线程保存的功能,这样我们逐步训练自己的Ai助手,这个功能免费太良心了确实方便了很多。我的目的是让它帮我写一个基于国内Tbquant平台的代码,Chat并不了解它。因此,我们需要喂一些源码让它学习。需要不断校正Chat的回答,费了很多时间重新来过,总之就像教育子女一样,要有耐心,每天教育一点,有问题就纠错。不要暴躁,不要生气。。。。

这是一个Tbquant自带的布林策略,我们先让它学习。
Chat:
以下是您提供的布林强盗_多策略的TBQUANT代码:
scss
Copy code
// ---------------------------------------------------------------------------------
// 策略参数
Params
Numeric bollingerLengths(50);
Numeric Offset(1.25);
Numeric rocCalcLength(30);
Numeric liqLength(50);
Numeric Lots(1);
// ---------------------------------------------------------------------------------
// 策略变量
Vars
Series<Numeric> MidLine(0);
Numeric Band(0);
Series<Numeric> upBand(0);
Series<Numeric> rocCalc(0);
Series<Numeric> liqDays(50);
Series<Numeric> liqPoint(0);
// ---------------------------------------------------------------------------------
// 策略事件
Events
OnBar(ArrayRef<integer> const& indexes)
{
MidLine = AverageFC(Close,bollingerLengths);
Band = StandardDev(Close,bollingerLengths,2);
upBand = MidLine + Offset*Band;
rocCalc = Close - Close[rocCalcLength - 1];
If (MarketPosition != 1 And rocCalc[1] > 0 And High >= upBand[1]) Buy(Lots, Max(Open,upBand[1]));
If (MarketPosition == 0)
{
liqDays = liqLength;
}
Else
{
liqDays = liqDays - 1;
liqDays = Max(liqDays,10);
}
liqPoint = Average(Close, liqDays);
If (MarketPosition == 1 And BarsSinceEntry >= 1 And liqPoint[1] < upBand[1] And Low <= liqPoint[1]) Sell(0, Min(Open,liqPoint[1]));
}
这是符合TBQUANT格式的代码,可以在TBQUANT平台上运行。

Chat:
好的,以下是一个简单的双均线策略代码,使用15分钟周期,在中国期货市场:
scssCopy code
//------------------------------------------------------------------------
// 双均线策略
// 时间周期: 15分钟
// 市场: 中国期货市场
//------------------------------------------------------------------------
Params
Numeric FastLength(5);
Numeric SlowLength(20);
Numeric Lots(1);
Vars
Series<Numeric> FastMA(0);
Series<Numeric> SlowMA(0);
Events
OnBar(ArrayRef<Integer> const &inIndexes)
{
// 计算均线
FastMA = SMA(Close, FastLength);
SlowMA = SMA(Close, SlowLength);
// 没有仓位,金叉买入
if (MarketPosition == 0 and FastMA[1] < SlowMA[1] and FastMA[0] > SlowMA[0]) {
Buy(Lots, Open);
}
// 有多头仓位,死叉平仓
else if (MarketPosition == 1 and FastMA[1] > SlowMA[1] and FastMA[0] < SlowMA[0]) {
Sell(0, Open);
}
}
该策略使用两个简单移动平均线 (SMA),一个较短的均线 FastMA 和一个较长的均线 SlowMA。在每个15分钟周期结束时,计算两个均线的值,当短期均线上穿长期均线时,说明市场上涨势头强劲,会买入开多头仓位;反之,当短期均线下穿长期均线时,说明市场下跌势头强劲,会卖出平多头仓位。
需要注意的是,这只是一个简单的双均线策略,仅供参考和学习。在实际应用中,还需要根据市场情况、风险偏好等因素进行调整和优化。
它帮我写一个双均线的tbquant源码,代码里有一个地方偷价了。这个我需要手动修改一下,这是第一次训练,后面会逐步训练它修正细节。这里有一个细节需要注意,需要命名你们的代码格式,我和Chat约定这种代码格式是TB,以后我让它写代码,就只要说TB即可。如果不约定,它可能就去github或者pypi里找Python包了,而Tbquant是有python包的。情况如下:

你看,这就不是Tbquant的C++格式了,所以要再次和Chat明确代码格式,同时命名你们的之间的代码交流的格式。
Chat:
好的,这是一个基于tbquant实现的双均线策略的代码,你可以根据需要进行调整和优化:
scss
Copy code
//------------------------------------------------------------------------
// 简称: DualMA
// 名称: 双均线策略
// 类别: 公式应用
// 类型: 内建应用
// 输出:
//------------------------------------------------------------------------
/*
策略说明:
该策略基于两条均线(短期均线和长期均线)进行交易决策。
当短期均线上穿长期均线时,开多单。
当短期均线下穿长期均线时,平多单。
当短期均线下穿长期均线时,开空单。
当短期均线上穿长期均线时,平空单。
系统要素:
1、短期均线长度
2、长期均线长度
3、交易手数
入场条件:
1、短期均线上穿长期均线时,开多单。
2、短期均线下穿长期均线时,开空单。
出场条件:
1、持有多单时,短期均线下穿长期均线时,平多单。
2、持有空单时,短期均线上穿长期均线时,平空单。
*/
Params
Numeric FastMA_Length(20); // 短期均线长度
Numeric SlowMA_Length(50); // 长期均线长度
Numeric Lots(1); // 交易手数
Vars
Series<Numeric> FastMA(0); // 短期均线
Series<Numeric> SlowMA(0); // 长期均线
Events
OnBar(ArrayRef<Integer> const& bars)
{
// 计算短期均线和长期均线
FastMA = MA(Close, FastMA_Length);
SlowMA = MA(Close, SlowMA_Length);
// 当短期均线上穿长期均线时,开多单
if (MarketPosition != 1 && CrossOver(FastMA, SlowMA))
{
Buy(Lots, Open);
}
// 当短期均线下穿长期均线时,平多单
if (MarketPosition == 1 && CrossUnder(FastMA, SlowMA))
{
Sell(0, Open);
}
// 当短期均线下穿长期均线时,开空单
if (MarketPosition != -1 && CrossUnder(SlowMA, FastMA))
{
SellShort(Lots, Open);
}
// 当短期均线上穿长期均线时,平空单
if (MarketPosition == -1 && CrossOver(SlowMA, FastMA))
{
BuyToCover(0, Open);
}
}


你看,Chat的学习速度很快,经过多次错误,修正调教后。它的回答越来越贴近我的目标了。
Chat:
//------------------------------------------------------------------------
// 简称: MACD
// 名称: 移动平均线散点图
// 类别: 公式应用
// 类型: 内建应用
// 输出:
//------------------------------------------------------------------------
Params
Numeric FastLength(12); // 快线周期
Numeric SlowLength(26); // 慢线周期
Numeric SignalLength(9); // 信号线周期
Numeric Lots(1); // 交易手数
Vars
Series<Numeric> MACD(0); // MACD 线
Series<Numeric> Signal(0); // 信号线
Series<Numeric> Histogram(0); // MACD 柱状图
Events
OnBar(ArrayRef<Integer> const& bars)
{
// 计算 MACD 线和信号线
MACD = MACD(Close, FastLength, SlowLength);
Signal = SMA(MACD, SignalLength);
Histogram = MACD - Signal;
// 当 MACD 线上穿信号线时,开多单
if (MarketPosition != 1 && CrossOver(MACD, Signal))
{
Buy(Lots, Open);
}
// 当 MACD 线下穿信号线时,平多单
if (MarketPosition == 1 && CrossUnder(MACD, Signal))
{
Sell(0, Open);
}
// 当 MACD 线下穿信号线时,开空单
if (MarketPosition != -1 && CrossUnder(Signal, MACD))
{
SellShort(Lots, Open);
}
// 当 MACD 线上穿信号线时,平空单
if (MarketPosition == -1 && CrossOver(Signal, MACD))
{
BuyToCover(0, Open);
}
}
//这段代码使用 TB 语言编写了一个 MACD 策略。
我:对就是这样的格式,请帮我用TB编写一个RSI交易策略
Chat:好的,以下是基于TB的RSI交易策略的代码:
//------------------------------------------------------------------------
// 简称: RSI
// 名称: 相对强弱指标交易策略
// 类别: 公式应用
// 类型: 内建应用
// 输出:
//------------------------------------------------------------------------
/*
策略说明:
该策略基于相对强弱指标(RSI)进行交易决策。
当RSI指标上穿20时,开多单。
当RSI指标下穿80时,开空单。
系统要素:
1、RSI长度
2、交易手数
入场条件:
1、RSI指标上穿20时,开多单。
2、RSI指标下穿80时,开空单。
出场条件:
1、持有多单时,RSI指标下穿70时,平多单。
2、持有空单时,RSI指标上穿30时,平空单。
*/
Params
Numeric RSI_Length(14); // RSI指标长度
Numeric Lots(1); // 交易手数
Vars
Series<Numeric> RSI(0); // RSI指标
Events
OnBar(ArrayRef<Integer> const& bars)
{
// 计算RSI指标
RSI = RSI(Close, RSI_Length);
// 当RSI指标上穿20时,开多单
if (MarketPosition != 1 && CrossOver(RSI, 20))
{
Buy(Lots, Open);
}
// 当RSI指标下穿80时,开空单
if (MarketPosition != -1 && CrossUnder(RSI, 80))
{
SellShort(Lots, Open);
}
// 当持有多单且RSI指标下穿70时,平多单
if (MarketPosition == 1 && CrossUnder(RSI, 70))
{
Sell(Lots, Open);
}
// 当持有空单且RSI指标上穿30时,平空单
if (MarketPosition == -1 && CrossOver(RSI, 30))
{
BuyToCover(Lots, Open);
}
}
总结:
总之,我现在坚持每天喂它一些源码让它去学习。我试试一年下来它会达到什么水平。有兴趣的朋友可以去试试,就当养孩子了,chatgpt是一个养成类游戏,哈哈哈哈。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解