60行代码实现一个思路--合约抄底策略

Author: 小小梦, Created: 2022-03-19 14:37:08, Updated: 2023-09-20 09:03:57

img

网格策略、马丁策略这种喜欢震荡行情的策略有其固有弊端,在ETH合约市场上也测试了一段时间的类似策略。也经常和FMZ.COM上的新老玩家们聊天分享经验。对于此类策略,有一点是非常赞同一位朋友的说法的。那就是币圈中做合约,做多相对于做空风险小了那么一丢丢。或者简单说就是下跌最惨就是归零,上涨是无限的。

那么马丁、网格之类的策略是不是只做多,不做空,拉一个长区间分布抄底风险会比做双边的好些呢?这个思路听起来很不错,但是是否经得住实战谁也不知道。不过起码我们可以简单的回测测试一下这个思路。于是乎我们就有了今天的文章主题–设计一个合约抄底策略。

基于FMZ.COM迅捷开发

实现这个思路的代码真的非常简单,得益于平台的灵活性、接口封装、强大的回测系统等等。整个代码只用60行(为了代码书写规范,很多可以简写的并没有简写)。

策略思路设计很简单,根据逻辑开始时的初始价格,间隔距离往下挂买单,价格持续下行就继续挂买单,持续抄底。然后挂出基于持仓价格增加一定利润差价之后的平仓单,等待平仓。如果平仓,就以当前的价格为初始价格重复以上逻辑。策略不做空单持仓,只做多单。

策略源码:

function cancelAll() {
    while (true) {
        var orders = _C(exchange.GetOrders)
        if (orders.length == 0) { 
            break 
        }
        for (var i = 0 ; i < orders.length ; i++) {
            exchange.CancelOrder(orders[i].Id, orders[i])
            Sleep(interval)
        }
    }
}

function getLong(arr, kind) {
    var ret = null 
    for (var i = 0 ; i < arr.length ; i++) {
        if (arr[i].Type == (kind == "pos" ? PD_LONG : ORDER_TYPE_BUY)) {
            ret = arr[i]
        }
    }
    return ret
}

function pendingBidOrders(firstPrice) {
    var index = 0
    var amount = baseAmount
    while (true) {
        var pos = _C(exchange.GetPosition)
        var price = firstPrice - index * baseSpacing
        amount *= ratio
        index++
        exchange.SetDirection("buy")
        exchange.Buy(price, amount)        
        if (pos.length != 0) {
            var longPos = getLong(pos, "pos")
            if (longPos) {
                exchange.SetDirection("closebuy")
                exchange.Sell(longPos.Price + profitTarget, longPos.Amount)
            }
        }
        while (true) {
            Sleep(interval)
            if (!getLong(_C(exchange.GetOrders), "orders")) {
                cancelAll()
                break
            }
            if (!getLong(_C(exchange.GetPosition), "pos")) {
                cancelAll()
                return 
            }
        }
    }
}

function main() {
    exchange.SetContractType(symbol)
    while (true) {
        pendingBidOrders(_C(exchange.GetTicker).Last)
    }
}

参数设计也很简单:

img

只有这几个参数。

看看这几十行代码回测效果

随便设置一下回测时间范围:

img

回测运行:

img

img

看起来很有网格、马丁类型策略的味道~。入门学习的新同学是不是很怕那种长篇的策略,很容易被劝退。简短精炼的策略入门更加合适,更容易消化策略思路,学习逻辑设计。

策略代码仅用于学习、研究。


Related

More

阿乐 /upload/asset/1dd6dcfd4579dc0b239a6.jpeg 运行之后会报错然后一直在挂单,撤单无限循环,要如何解决

梦想身价八位数 这个策略只能在币安上跑吗?

梦想身价八位数 仓位增长系数是什么意思?

梦想身价八位数 怎么没有策略地址啊?复制策略源码不能用

小小梦 是不是运行了多个实盘,如果一个服务器上运行2个实盘,频率就翻倍,以此类推的。

阿乐 /upload/asset/1dd36e54848c3bdf8c759.jpeg 按道理我这个参数两个轮训一分钟最多120次,并没有超过币安限制每分钟1200次访问呀,有点不理解

小小梦 您好,这个和策略无关的,您可以设置一下麦语言模版参数上的轮询间隔,设置大一些。如果您一个服务器上跑多个实盘,都访问一个交易所的接口,那么频率是会翻倍的,很容易就超频超限了。

阿乐 /upload/asset/1dce38677beaf3c7ca065.jpeg 现在币安不能支持麦语言策略使用么,会提示用web什么的方式进行实时更新避免api封禁

小小梦 不客气,刚写支持FMZ量化。

阿乐 好的谢谢我知道了

小小梦 您好,这个是个教学策略,主要是讲解思路,可以在币安永续合约跑,跑OK需要对策略修改一下。上面问题的原因是下单量为小数了,OKX是要求下单量为合约整张数的。币安期货USDT本位永续合约可以是小数

小小梦 都可以跑,就是参数调整下就行。

小小梦 这个策略只是一个教学策略,切勿实盘,回测研究学习可以。复制策略源码,还要加上策略参数,参数如文章上的截图。

小小梦 设置2就是2倍加仓。