巧用FMZ平台交易插件进行期货合约的选择

Author: ianzeng123, Created: 2023-12-28 23:15:26, Updated: 2024-02-28 21:46:28

img

最近接到用户的询问,能否开发一个可以使用不同指标进行期货合约筛选的策略。

image

恰好呢,最近平台的交易终端更新了,页面的布局更加的完善,实时反馈的数据也更加的流畅,并且也优化了插件使用的功能。因此呢,我们可以使用交易插件完成这位同学的需求。

image

在发明者平台上,插件可以完善交易终端的体验,我们经常看到类似文华财经,MT4等具有一键下单,多种功能的止盈止损功能等辅助交易模块,然而这种类似方便的功能需要我们额外的付费(年费通常在7000元左右)。而在发明者平台,我们可以自己开发这些功能模块。有时候,我们需要一个小功能来辅助交易,比如一键平仓、一键对冲、阶梯挂单、冰山委托等操作,这种类似的功能并不太需要经常查看执行日志,所以新建一个实盘有些繁琐,我们直接在终端点击一下插件,就能够立即实现相应的功能,这样可以大大方便手动交易。

这些自定义的交易插件,我们自身可以编码实现。并且这个交易终端是定制化的,这就意味着我们可以根据我们的交易习惯,自定义交易功能辅助面板。在教学视频中,我们详细讲解了怎样开发一个插件,具体可以点击《交易终端辅助程序插件》

今天我们要开发的一个插件是可以根据不同的指标进行期货合约的选择,大家在股票交易软件中可能尝试过输入不同条件,比如“突破十日均线,突破布林带上限”,就可以返回今日k线数据符合两个条件的所有股票品种。这个功能呢,我们也可以使用交易插件来实现。我们一起来动手尝试一下吧。

大家在期货软件中经常可以看到MACD,布林带,RSI,KDJ指标等等,但是软件上仅仅是呈现图像,我们需要根据专业的知识去人为的判断这些指标背后代表的含义,如果关注多个品种,还需要一个个去点击查看,确实很麻烦。其实我们使用交易插件帮助我们进行解读不同品种,不同指标背后的含义,从而为手动交易提供一定的指标参考。

首先我们要挑选合适的指标,这里我们示范的指标有三个,分别是MACD,RSI,和布林带。这三个指标大家可太熟悉了,不过我们可以具体讲解一下具体指标的使用规范。

  • MACD:MACD指标是以0轴为中心上下振荡的振荡指标,它利用0轴将指标分为多方与空方两个部分。在0轴之上就定义为多方,在0轴之下就定义为空方。
  • RSI: RSI指标的超买超卖是判断市场短期走势的重要指标。当RSI指标达到70以上时,通常被认为是超买区域,表明市场已经进入一个高位,可能会出现回调或调整,认为是做空区域。相反,当RSI指标达到30以下,是超卖区域,更可能出现底部的回调,是做多区域。
  • 布林带:布林带包括中轨线(MB)、上轨线(UP)和下轨线(DN),如果收盘价大于上轨,代表可以做多;如果收盘价小于下轨,代表可以做空。

我们呢,就要在交易插件当中使用这三个指标进行期货品种的筛选。我们可以首先设置目标合约,确定要查看的周期,然后选择需要使用哪些指标进行品种的确定。

image

当我们填写完成各个参数以后,点击执行,插件就会自动返回在当前时刻哪些品种适合做多,哪些品种适合做空,我们呢,就可以参考这些指标的结果作为交易的辅助信号。

image

当然,这只是一个示范的插件,大家可以添加更多的指标,并且指标的参数也可以设置作为插件的参数。总之呢,自主权都在大家手上,可以根据自己的交易习惯开发出来符合“私人定制”的交易插件。

下面我们来看下具体的插件代码怎样编写。首先我们需要策略参数,包括目标合约,K线周期,和三个指标是否勾选的布尔值。

image

接着我们来看具体的代码应该怎样编写:

function main() {

    // 设置错误过滤器,排除特定类型的错误消息
    SetErrorFilter("login|ready|流控|连接失败|初始|Timeout|CancelOrder");

    // 创建一个表格用于显示交易建议
    var tbl = { 
        type: 'table', 
        title: '推荐合约 ' + _D(), // 表格标题包括当前日期
        cols: ['做多列表', '做空列表'], // 表格列
        rows: [] // 表格行
    }

    // 初始化做多和做空列表
    var longList = [];
    var shortList = [];
    
    // 获取当前主合约列表
    var curmainContract = tarSymbol.split(',')

    // 遍历每个合约
    for (var i = 0; i < curmainContract.length; i++) {
        // 输出当前合约
        Log(curmainContract[i])
        
        // 设置当前合约类型
        _C(exchange.SetContractType, curmainContract[i])
        
        // 获取历史价格数据
        var r = exchange.GetRecords(periodK * 60)

        // 计算技术指标
        var macd = TA.MACD(r, 12, 26, 9)
        var rsi = TA.RSI(r, 14)
        var boll = TA.BOLL(r, 20, 2)
        var upLine = boll[0]
        var downLine = boll[2]

        // 判断是否添加到做多列表
        var shouldAddToLongList = (!macdC || (macdC && macd[2][r.length - 1] > 0)) &&
                                (!rsiC || (rsiC && rsi[r.length - 1] < 30)) &&
                                (!bollC || (bollC && r[r.length - 1].Close > upLine[r.length - 1]))

        // 判断是否添加到做空列表
        var shouldAddToShortList = (!macdC || (macdC && macd[2][r.length - 1] <= 0)) &&
                                (!rsiC || (rsiC && rsi[r.length - 1] > 70)) &&
                                (!bollC || (bollC && r[r.length - 1].Close < downLine[r.length - 1]))

        // 如果符合条件,则添加到相应列表
        if (shouldAddToLongList) {
            longList.push(curmainContract[i]);
        }

        if (shouldAddToShortList) {
            shortList.push(curmainContract[i]);
        }

    }

    // 将做多和做空列表添加到表格行
    tbl.rows.push([longList, shortList]);

    // 返回完整的表格对象
    return tbl
}

和传统的长时间运行的策略不同,这里呢,我们只需要实时查看指标筛选的结果,所以策略里面不需要设置while循环。另外,插件是不显示日志的,所以这个使用状态栏表格进行显示。在策略里,使用轮询目标合约列表的形式,计算每个品种的指标值。根据策略的外部参数(macdC,rsiC和bollC)代表是否选择了某项指标,如果选择了某项指标,再根据指标的判断标准,在同时满足选择指标的判断标准以后,确定该品种应该添加进入做多列表或者做空列表。最后返回包含做多列表和做空列表的表格。

这样我们的期货筛选的交易插件就编写完成。但是呢,也有很大的改动空间,欢迎大家在此基础上进行修改和完善。


更多内容