简易版牛熊判定,短线对冲交易策略[gekko]

策略介绍

该策略非原创,来自github: https://github.com/Saichovsky, 本文不构成任何投资建议,仅供参考。

这是一个基于MA(移动平均线)来自动改变RSI参数的短线交易策略,自动判断牛熊。

我把测试结果放在前面,希望大家看到后如果觉得收益不是很满意,就不需要配置该策略文件了,帮大家节省时间。 该策略更适合USDT/BTC交易对。

该策略回测结果

  • noop为不做交易的情况下的收益率。系统默认策略中,我选择了RSI, 是因为在以往测试中发现该策略收益更理想一些,而且本文介绍的策略是基于RSI优化的。在调整过程中,Candle Size 10minute也是测试的最佳时间间隔。

测试结果

参数:
  • Candle Size: 10 minute
  • 回测时间段: 2018.01.03-2018.03.03
  • 数据来源: 币安
  • RSI_BULL_BEAR 策略参数
    *BEAR_RSI = 15
    *BEAR_RSI_high = 50
    *BEAR_RSI_low = 25
收益率统计
交易對 \策略 noop RSI RSI_BULL_BEAR
USDT/BTC -17.87931% -25.47593% 10.72157%
USDT/ETH 10.72157% -21.74737% -5.33235%
BTC/ADA - -43.44617% -37.35651%
  1. USDT/BTC
    统计结果:在该时间段 完成 41次 买入/卖出操作,使用RSI_BULL_BEAR 该策略收益大概20%左右。
    屏幕快照 2018-03-03 上午9.53.34.png
  1. USDT/ETH
    统计结果:在该时间段 完成 42次 买入/卖出操作,使用RSI_BULL_BEAR 该策略收益大概-15%左右。
    屏幕快照 2018-03-03 上午10.17.02.png
  1. BTC/ADA
    统计结果:在该时间段 完成 42次 买入/卖出操作,使用RSI_BULL_BEAR 该策略收益大概-37%左右。
    btc:ada.png

策略配置

  1. 将如下代码文件保存在 RSI_BULL_BEAR.js 文件中,放置在路径gekko/config/strategies 下。
/*
    RSI Bull and Bear
    Use different RSI-strategies depending on a longer trend

    (CC-BY-SA 4.0) Tommie Hansen
    https://creativecommons.org/licenses/by-sa/4.0/
*/

var _ = require ('lodash');
var log = require ('../core/log.js');

// Configuration
var config = require ('../core/util.js').getConfig();
var async = require ('async');

// Let's create our own method
var method = {};


// Prepare everything our method needs
method.init = function () {

   this.name = 'RSI Bull and Bear';

   // Keep state about stuff
   this.trend = {
       direction: 'none',
       duration: 0,
       persisted: false,
       adviced: false
   };

   // How many candles do we need as a base before start giving advice
   this.requiredHistory = config.tradingAdvisor.historySize;

    // add indicators
    this.addTulipIndicator('maSlow', 'sma', { optInTimePeriod: this.settings.SMA_long });
    this.addTulipIndicator('maFast', 'sma', { optInTimePeriod: this.settings.SMA_short });

    this.addTulipIndicator('BULL_RSI', 'rsi', { optInTimePeriod: this.settings.BULL_RSI });
    this.addTulipIndicator('BEAR_RSI', 'rsi', { optInTimePeriod: this.settings.BEAR_RSI });

}

// What happens on every new candle?
method.update = function(candle) {} // do nothing
method.log = function() {} // do nothing

method.check = function (candle)
{
   if( candle.close.length < this.requiredHistory ) { return; } // TODO: still needed?!

    // get all indicators
    let ind = this.tulipIndicators;

    let maSlow = ind.maSlow.result.result,
        maFast = ind.maFast.result.result,
        rsi;


    // define rules
    let goLong = false,
        goShort = false;

    // BEAR TREND
    if( maFast < maSlow )
    {
        log.debug('BEAR Trend');
        rsi = ind.BEAR_RSI.result.result;
        if( rsi > this.settings.BEAR_RSI_high ) goShort = true;
        if( rsi < this.settings.BEAR_RSI_low )  goLong = true;
    }

    // BULL TREND
    else
    {
        log.debug('BULL Trend');
        rsi = ind.BULL_RSI.result.result;
        if( rsi > this.settings.BULL_RSI_high ) goShort = true;
        if( rsi < this.settings.BULL_RSI_low )  goLong = true;
    }

    // LONG
    if( goLong )
    {

        // new trend? (only act on new trends)
        if (this.trend.direction !== 'up')
        {

            // reset the state for the new trend
            this.trend = {
                duration: 0,
                persisted: false,
                direction: 'up',
                adviced: false
            };


            if( !this.trend.adviced )
            {
                this.trend.adviced = true;
                this.advice('long');
            }
            else {
                this.advice();
            }

        }

        this.trend.duration ++;
        log.debug ('Positive since ', this.trend.duration, 'candle (s)');

    }

    // SHORT
    else if( goShort )
    {

        // new trend? (else do things)
        if( this.trend.direction !== 'down' )
        {

            // reset state
            this.trend = {
                duration: 0,
                persisted: false,
                direction: 'down',
                adviced: false
            };

            if( !this.trend.adviced )
            {
                this.trend.adviced = true;
                this.advice ('short');
            }
            else {
                this.advice();
            }

        }

        this.trend.duration ++;
        log.debug ('Negative since ', this.trend.duration, 'candle (s)');

    }

    // default
    else
    {
        //log.debug('No trend');
        this.advice();
    }

} // method.check()

module.exports = method;
  1. 将如下代码文件保存为 RSI_BULL_BEAR.toml 文件,放在 gekko/config/strategies路径下
# BEAR
BEAR_RSI = 15
BEAR_RSI_high = 50
BEAR_RSI_low = 25


# BULL/BEAR is defined by the longer SMA trends
# if SHORT over LONG = BULL
# if SHORT under LONG = BEAR
  1. 保存完成后,在gekko路径下执行如下命令(docker方式启动)
docker-compose build
HOST=deamon.com PORT=3000 docker-compose up -d   # HOST 需要修改

欢迎大家加入gekko 知识星球, 在这里你可以得到,关于gekko环境搭建问题的解答/查看群主分享的交易机器人策略/加入gekko策略交流群组,以及获取更多的关于gekko使用方面的信息。
没有任何基础的小白也可以搭建自己的交易机器人。


gekko交流
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 策略是Gekko自动化交易的核心。他们关注市场并根据技术分析指标决定做什么。 默认策略介绍 DEMA这个方法使用(...
    哈哈098833阅读 1,043评论 0 1
  • 一、标题设置 代码: 显示效果: 一级 二级 三级 四级 五级 六级 Headline1 Headline2 二、...
    孞言阅读 486评论 0 0
  • “就感受而言,完美的爱就象是色彩中的白色一样。 许多人以为白色是没有色彩的。不是的,白色涵括了所 有的色彩。白色是...
    岳晓晴阅读 145评论 0 0
  • 十秒钟短视频,完成快速变脸,秀出你的彩妆功力吧! 最终效果示例 抖音变脸挑战 1 抖音变脸挑战 2 by 熊宝宝 ...
    羊一只_阅读 1,916评论 0 0
  • NZYDDXYYDZZMZN.
    十一先生_阅读 195评论 0 0