牛熊策略升級版[gekko]

本人非原創(chuàng)就轧,原文鏈接https://justhodl.blogspot.com/2018/02/gekko-rsibullbear-tradingview.html

RSI_BULL_BEAR是由@ tommiehansen所撰寫的Gekko交易策略,除了最原版的之外俊抵,現(xiàn)在最被討論的大概就是加上ADX指標(biāo)調(diào)整的RSI_BULL_BEAR_ADX了,ADX可以確認(rèn)市場是否存在趨勢以及衡量其強(qiáng)度践叠,只要搭配好的參數(shù)很容易能超出原版的表現(xiàn)顾瞻,在對不同幣種的適應(yīng)性下也更好,但現(xiàn)在又有由 @ Kohette 再加入了Ping Pong trading的概念赘淮,簡單的說就是在買入后會馬上掛一個高于原價%數(shù)的賣單,賺取短線的反彈睦霎,賣出時反之亦然梢卸。

每個策略配置兩個文件 *.js 和 *.toml。 配置路徑分別為 gekko/strategies 和 gekko/config/strategies


RSI_BULL_BEAR

RSI_BULL_BEAR.js

/*
    RSI Bull and Bear
    Use different RSI-strategies depending on a longer trend
    3 feb 2017
    
    (CC-BY-SA 4.0) Tommie Hansen
    https://creativecommons.org/licenses/by-sa/4.0/
    
*/

// req's
var log = require ('../core/log.js');
var config = require ('../core/util.js').getConfig();

// strategy
var strat = {
    
    /* INIT */
    init: function()
    {
        this.name = 'RSI Bull and Bear';
        this.requiredHistory = config.tradingAdvisor.historySize;
        this.resetTrend();      
        
        // debug? set to flase to disable all logging/messages (improves performance)
        this.debug = false;
        
        // performance
        config.backtest.batchSize = 1000; // increase performance
        config.silent = true;
        config.debug = false;
        
        // 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 });
        
        // debug stuff
        this.startTime = new Date();
        this.stat = {
            bear: { min: 100, max: 0 },
            bull: { min: 100, max: 0 }
        };
        
    }, // init()
    
    
    /* RESET TREND */
    resetTrend: function()
    {
        var trend = {
            duration: 0,
            direction: 'none',
            longPos: false,
        };
    
        this.trend = trend;
    },
    
    /* get lowest/highest for backtest-period */
    lowHigh: function( rsi, type )
    {
        let cur;
        if( type == 'bear' ) {
            cur = this.stat.bear;
            if( rsi < cur.min ) this.stat.bear.min = rsi; // set new
            if( rsi > cur.max ) this.stat.bear.max = rsi;
        }
        else {
            cur = this.stat.bull;
            if( rsi < cur.min ) this.stat.bull.min = rsi; // set new
            if( rsi > cur.max ) this.stat.bull.max = rsi;
        }
    },
    
    
    /* CHECK */
    check: function()
    {
        
        // get all indicators
        let ind = this.tulipIndicators,
            maSlow = ind.maSlow.result.result,
            maFast = ind.maFast.result.result,
            rsi;
            
        // BEAR TREND
        if( maFast < maSlow )
        {
            rsi = ind.BEAR_RSI.result.result;
            if( rsi > this.settings.BEAR_RSI_high ) this.short();
            else if( rsi < this.settings.BEAR_RSI_low ) this.long();
            
            if(this.debug) this.lowHigh( rsi, 'bear' );
            //log.debug('BEAR-trend');
        }

        // BULL TREND
        else
        {
            rsi = ind.BULL_RSI.result.result;
            if( rsi > this.settings.BULL_RSI_high ) this.short();
            else if( rsi < this.settings.BULL_RSI_low )  this.long();
            if(this.debug) this.lowHigh( rsi, 'bull' );
            //log.debug('BULL-trend');
        }
    
    }, // check()
    
    
    /* LONG */
    long: function()
    {
        if( this.trend.direction !== 'up' ) // new trend? (only act on new trends)
        {
            this.resetTrend();
            this.trend.direction = 'up';
            this.advice('long');
            //log.debug('go long');
        }
        
        if(this.debug)
        {
            this.trend.duration++;
            log.debug ('Long since', this.trend.duration, 'candle(s)');
        }
    },
    
    
    /* SHORT */
    short: function()
    {
        // new trend? (else do things)
        if( this.trend.direction !== 'down' )
        {
            this.resetTrend();
            this.trend.direction = 'down';
            this.advice('short');
        }
        
        if(this.debug)
        {
            this.trend.duration++;
            log.debug ('Short since', this.trend.duration, 'candle(s)');
        }
    },
    
    
    /* END backtest */
    end: function(){
        
        let seconds = ((new Date()- this.startTime)/1000),
            minutes = seconds/60,
            str;
            
        minutes < 1 ? str = seconds + ' seconds' : str = minutes + ' minutes';
        
        log.debug('====================================');
        log.debug('Finished in ' + str);
        log.debug('====================================');
        
        if(this.debug)
        {
            let stat = this.stat;
            log.debug('RSI low/high for period');
            log.debug('BEAR low/high: ' + stat.bear.min + ' / ' + stat.bear.max);
            log.debug('BULL low/high: ' + stat.bull.min + ' / ' + stat.bull.max);
        }

    }
    
};

module.exports = strat;

RSI_BULL_BEAR.toml

# SMA Trends
SMA_long = 1000
SMA_short = 50

# BULL
BULL_RSI = 10
BULL_RSI_high = 80
BULL_RSI_low = 60

# BEAR
BEAR_RSI = 15
BEAR_RSI_high = 50
BEAR_RSI_low = 20

# BULL/BEAR is defined by the longer SMA trends
# if SHORT over LONG = BULL
# if SHORT under LONG = BEAR

RSI_BULL_BEAR_ADX

RSI_BULL_BEAR_ADX.js

/*
    RSI Bull and Bear + ADX modifier
    1. Use different RSI-strategies depending on a longer trend
    2. But modify this slighly if shorter BULL/BEAR is detected
    -
    (CC-BY-SA 4.0) Tommie Hansen
    https://creativecommons.org/licenses/by-sa/4.0/
*/

// req's
var log = require('../core/log.js');
var config = require('../core/util.js').getConfig();

// strategy
var strat = {
    
    /* INIT */
    init: function()
    {
        // core
        this.name = 'RSI Bull and Bear + ADX';
        this.requiredHistory = config.tradingAdvisor.historySize;
        this.resetTrend();
        
        // debug? set to false to disable all logging/messages/stats (improves performance in backtests)
        this.debug = false;
        
        // performance
        config.backtest.batchSize = 1000; // increase performance
        config.silent = true;
        config.debug = false;
        
        // SMA
        this.addTulipIndicator('maSlow', 'sma', { optInTimePeriod: this.settings.SMA_long });
        this.addTulipIndicator('maFast', 'sma', { optInTimePeriod: this.settings.SMA_short });
        
        // RSI
        this.addTulipIndicator('BULL_RSI', 'rsi', { optInTimePeriod: this.settings.BULL_RSI });
        this.addTulipIndicator('BEAR_RSI', 'rsi', { optInTimePeriod: this.settings.BEAR_RSI });
        
        // ADX
        this.addTulipIndicator('ADX', 'adx', { optInTimePeriod: this.settings.ADX })
        
        // MOD (RSI modifiers)
        this.BULL_MOD_high = this.settings.BULL_MOD_high;
        this.BULL_MOD_low = this.settings.BULL_MOD_low;
        this.BEAR_MOD_high = this.settings.BEAR_MOD_high;
        this.BEAR_MOD_low = this.settings.BEAR_MOD_low;
        
        
        // debug stuff
        this.startTime = new Date();
        
        // add min/max if debug
        if( this.debug ){
            this.stat = {
                adx: { min: 1000, max: 0 },
                bear: { min: 1000, max: 0 },
                bull: { min: 1000, max: 0 }
            };
        }
        
        /* MESSAGES */
        
        // message the user about required history
        log.info("====================================");
        log.info('Running', this.name);
        log.info('====================================');
        log.info("Make sure your warmup period matches SMA_long and that Gekko downloads data if needed");
        
        // warn users
        if( this.requiredHistory < this.settings.SMA_long )
        {
            log.warn("*** WARNING *** Your Warmup period is lower then SMA_long. If Gekko does not download data automatically when running LIVE the strategy will default to BEAR-mode until it has enough data.");
        }
        
    }, // init()
    
    
    /* RESET TREND */
    resetTrend: function()
    {
        var trend = {
            duration: 0,
            direction: 'none',
            longPos: false,
        };
    
        this.trend = trend;
    },
    
    
    /* get low/high for backtest-period */
    lowHigh: function( val, type )
    {
        let cur;
        if( type == 'bear' ) {
            cur = this.stat.bear;
            if( val < cur.min ) this.stat.bear.min = val; // set new
            else if( val > cur.max ) this.stat.bear.max = val;
        }
        else if( type == 'bull' ) {
            cur = this.stat.bull;
            if( val < cur.min ) this.stat.bull.min = val; // set new
            else if( val > cur.max ) this.stat.bull.max = val;
        }
        else {
            cur = this.stat.adx;
            if( val < cur.min ) this.stat.adx.min = val; // set new
            else if( val > cur.max ) this.stat.adx.max = val;
        }
    },
    
    
    /* CHECK */
    check: function()
    {
        // get all indicators
        let ind = this.tulipIndicators,
            maSlow = ind.maSlow.result.result,
            maFast = ind.maFast.result.result,
            rsi,
            adx = ind.ADX.result.result;
        
            
        // BEAR TREND
        if( maFast < maSlow )
        {
            rsi = ind.BEAR_RSI.result.result;
            let rsi_hi = this.settings.BEAR_RSI_high,
                rsi_low = this.settings.BEAR_RSI_low;
            
            // ADX trend strength?
            if( adx > this.settings.ADX_high ) rsi_hi = rsi_hi + this.BEAR_MOD_high;
            else if( adx < this.settings.ADX_low ) rsi_low = rsi_low + this.BEAR_MOD_low;
                
            if( rsi > rsi_hi ) this.short();
            else if( rsi < rsi_low ) this.long();
            
            if(this.debug) this.lowHigh( rsi, 'bear' );
        }

        // BULL TREND
        else
        {
            rsi = ind.BULL_RSI.result.result;
            let rsi_hi = this.settings.BULL_RSI_high,
                rsi_low = this.settings.BULL_RSI_low;
            
            // ADX trend strength?
            if( adx > this.settings.ADX_high ) rsi_hi = rsi_hi + this.BULL_MOD_high;        
            else if( adx < this.settings.ADX_low ) rsi_low = rsi_low + this.BULL_MOD_low;
                
            if( rsi > rsi_hi ) this.short();
            else if( rsi < rsi_low )  this.long();
            if(this.debug) this.lowHigh( rsi, 'bull' );
        }
        
        // add adx low/high if debug
        if( this.debug ) this.lowHigh( adx, 'adx');
    
    }, // check()
    
    
    /* LONG */
    long: function()
    {
        if( this.trend.direction !== 'up' ) // new trend? (only act on new trends)
        {
            this.resetTrend();
            this.trend.direction = 'up';
            this.advice('long');
            if( this.debug ) log.info('Going long');
        }
        
        if( this.debug )
        {
            this.trend.duration++;
            log.info('Long since', this.trend.duration, 'candle(s)');
        }
    },
    
    
    /* SHORT */
    short: function()
    {
        // new trend? (else do things)
        if( this.trend.direction !== 'down' )
        {
            this.resetTrend();
            this.trend.direction = 'down';
            this.advice('short');
            if( this.debug ) log.info('Going short');
        }
        
        if( this.debug )
        {
            this.trend.duration++;
            log.info('Short since', this.trend.duration, 'candle(s)');
        }
    },
    
    
    /* END backtest */
    end: function()
    {
        let seconds = ((new Date()- this.startTime)/1000),
            minutes = seconds/60,
            str;
            
        minutes < 1 ? str = seconds.toFixed(2) + ' seconds' : str = minutes.toFixed(2) + ' minutes';
        
        log.info('====================================');
        log.info('Finished in ' + str);
        log.info('====================================');
    
        // print stats and messages if debug
        if(this.debug)
        {
            let stat = this.stat;
            log.info('BEAR RSI low/high: ' + stat.bear.min + ' / ' + stat.bear.max);
            log.info('BULL RSI low/high: ' + stat.bull.min + ' / ' + stat.bull.max);
            log.info('ADX min/max: ' + stat.adx.min + ' / ' + stat.adx.max);
        }
        
    }
    
};

module.exports = strat;

RSI_BULL_BEAR_ADX.toml

# SMA INDICATOR
SMA_long = 1000
SMA_short = 50

# RSI BULL / BEAR
BULL_RSI = 10
BULL_RSI_high = 80
BULL_RSI_low = 60
BEAR_RSI = 15
BEAR_RSI_high = 50
BEAR_RSI_low = 20

# MODIFY RSI (depending on ADX)
BULL_MOD_high = 5
BULL_MOD_low = -5
BEAR_MOD_high = 15
BEAR_MOD_low = -5

# ADX
ADX = 3
ADX_high = 70
ADX_low = 50

RSI_BULL_BEAR_PINGPONG

RSI_BULL_BEAR_PINGPONG.js

/*
    RSI Bull and Bear + ADX modifier
    1. Use different RSI-strategies depending on a longer trend
    2. But modify this slighly if shorter BULL/BEAR is detected
    -
    (CC-BY-SA 4.0) Tommie Hansen
    https://creativecommons.org/licenses/by-sa/4.0/
    
    UPDATE:
    3. Add pingPong for sideways market
    
    Rafael Martín.
*/

// req's
var log = require('../core/log.js');
var config = require('../core/util.js').getConfig();

// strategy
var strat = {
    
    /* INIT */
    init: function()
    {
        // core
        this.name = 'RSI Bull and Bear + ADX + PingPong';
        this.requiredHistory = config.tradingAdvisor.historySize;
        this.resetTrend();
        
        // debug? set to false to disable all logging/messages/stats (improves performance in backtests)
        this.debug = false;
        
        // performance
        config.backtest.batchSize = 1000; // increase performance
        config.silent = true;
        config.debug = false;
        
        // SMA
        this.addTulipIndicator('maSlow', 'sma', { optInTimePeriod: this.settings.SMA_long });
        this.addTulipIndicator('maFast', 'sma', { optInTimePeriod: this.settings.SMA_short });
        
        // RSI
        this.addTulipIndicator('BULL_RSI', 'rsi', { optInTimePeriod: this.settings.BULL_RSI });
        this.addTulipIndicator('BEAR_RSI', 'rsi', { optInTimePeriod: this.settings.BEAR_RSI });
        
        // ADX
        this.addTulipIndicator('ADX', 'adx', { optInTimePeriod: this.settings.ADX })
        
        // MOD (RSI modifiers)
        this.BULL_MOD_high = this.settings.BULL_MOD_high;
        this.BULL_MOD_low = this.settings.BULL_MOD_low;
        this.BEAR_MOD_high = this.settings.BEAR_MOD_high;
        this.BEAR_MOD_low = this.settings.BEAR_MOD_low;
        
        
        // debug stuff
        this.startTime = new Date();
        
        // add min/max if debug
        if( this.debug ){
            this.stat = {
                adx: { min: 1000, max: 0 },
                bear: { min: 1000, max: 0 },
                bull: { min: 1000, max: 0 }
            };
        }
        
        /* MESSAGES */
        
        // message the user about required history
        log.info("====================================");
        log.info('Running', this.name);
        log.info('====================================');
        log.info("Make sure your warmup period matches SMA_long and that Gekko downloads data if needed");
        
        // warn users
        if( this.requiredHistory < this.settings.SMA_long )
        {
            log.warn("*** WARNING *** Your Warmup period is lower then SMA_long. If Gekko does not download data automatically when running LIVE the strategy will default to BEAR-mode until it has enough data.");
        }
        
    }, // init()
    
    
    /* RESET TREND */
    resetTrend: function()
    {
        var trend = {
            duration: 0,
            direction: 'none',
            longPos: false, // this will be false or a price if we already have a long position
            pingPong : {
                gainsPercentage: this.settings.PINGPONG_GAINS_PERCENTAGE // when we want to close the long position?
            }
        };
    
        this.trend = trend;
    },
    
    
    /* get low/high for backtest-period */
    lowHigh: function( val, type )
    {
        let cur;
        if( type == 'bear' ) {
            cur = this.stat.bear;
            if( val < cur.min ) this.stat.bear.min = val; // set new
            else if( val > cur.max ) this.stat.bear.max = val;
        }
        else if( type == 'bull' ) {
            cur = this.stat.bull;
            if( val < cur.min ) this.stat.bull.min = val; // set new
            else if( val > cur.max ) this.stat.bull.max = val;
        }
        else {
            cur = this.stat.adx;
            if( val < cur.min ) this.stat.adx.min = val; // set new
            else if( val > cur.max ) this.stat.adx.max = val;
        }
    },
    
    
    /* CHECK */
    check: function()
    {
        // get all indicators
        let ind = this.tulipIndicators,
            maSlow = ind.maSlow.result.result,
            maFast = ind.maFast.result.result,
            rsi,
            adx = ind.ADX.result.result;
        
            
        // BEAR TREND
        if( maFast < maSlow )
        {
            rsi = ind.BEAR_RSI.result.result;
            let rsi_hi = this.settings.BEAR_RSI_high,
                rsi_low = this.settings.BEAR_RSI_low;
            
            // ADX trend strength?
            if( adx > this.settings.ADX_high ) rsi_hi = rsi_hi + this.BEAR_MOD_high;
            else if( adx < this.settings.ADX_low ) rsi_low = rsi_low + this.BEAR_MOD_low;
                
            if( rsi > rsi_hi ) this.short();
            else if( rsi < rsi_low ) this.long();
            //else this.pingPong();
            
            if(this.debug) this.lowHigh( rsi, 'bear' );
        }

        // BULL TREND
        else
        {
            rsi = ind.BULL_RSI.result.result;
            let rsi_hi = this.settings.BULL_RSI_high,
                rsi_low = this.settings.BULL_RSI_low;
            
            // ADX trend strength?
            if( adx > this.settings.ADX_high ) rsi_hi = rsi_hi + this.BULL_MOD_high;        
            else if( adx < this.settings.ADX_low ) rsi_low = rsi_low + this.BULL_MOD_low;
                
            if( rsi > rsi_hi ) this.short();
            else if( rsi < rsi_low )  this.long();
            else this.pingPong();
            
            if(this.debug) this.lowHigh( rsi, 'bull' );
        }
        
        // add adx low/high if debug
        if( this.debug ) this.lowHigh( adx, 'adx');
    
    }, // check()
    
    
    /* LONG */
    long: function()
    {
        if( this.trend.direction !== 'up' ) // new trend? (only act on new trends)
        {
            this.resetTrend();
            this.trend.direction = 'up';
            this.trend.longPos = this.candle.close;
            this.advice('long');
            if( this.debug ) log.info('Going long');
        }
        
        if( this.debug )
        {
            this.trend.duration++;
            log.info('Long since', this.trend.duration, 'candle(s)');
        }
    },
    
    
    /* SHORT */
    short: function()
    {
        // new trend? (else do things)
        if( this.trend.direction !== 'down' )
        {
            this.resetTrend();
            this.trend.direction = 'down';
            this.trend.longPos = false;
            this.advice('short');
            if( this.debug ) log.info('Going short');
        }
        
        if( this.debug )
        {
            this.trend.duration++;
            log.info('Short since', this.trend.duration, 'candle(s)');
        }
    },
    
    pingPong: function() {
        
        /**
        * Si actualmente tenemos una posicion long abierta vamos a comprobar si el precio 
        * actual del asset es un <gainsPercentage> más alto (trend.long + %gainsPercentage >= currentPrice)
        * y si es así cerramos la posición.
        */
        if (this.trend.longPos) {
            
            /**
            * Si tenemos una posicion long abierta pero la tendencia actual es bullish entonces 
            * no hacemos nada y dejamos que siga subiendo
            */
            //if (this.trend.direction == 'up') return;
            
            if (this.candle.close < (this.trend.longPos - (this.trend.longPos * (this.trend.pingPong.gainsPercentage / 3) / 100))) this.trend.longPos = this.candle.close; 
                        
            /**
            * Si no tenemos un porcentage de ganancias salimos de aqui
            */
            if (this.candle.close < (this.trend.longPos + (this.trend.longPos * this.trend.pingPong.gainsPercentage / 100) )) return;
            
            /**
            * Si hemos llegado hasta aqui significa que tenemos un long abierto, la tendencia actual es 
            * bajista y tenemos un <gainsPercentage> de ganancias, por lo tanto cerramos la posicion
            * para recoger ganancias y ponemos el longPos en false.
            */
            this.trend.longPos = false;
            this.advice('short');
        
        
        /**
        * Si hemos llegado hasta aqui significa que no tenemos ninguna posicion long abierta, por lo tanto 
        * podemos aprovechar para abrir una nueva posicion cuando sea el momento propicio.
        */
        } else {
            
            /**
            * Si estamos en tendencia bajista salimos de aqui sin hacer nada, asi dejamos que siga 
            * bajando y solo actuamos cuando la tendencia cambie a alcista (bullish).
            */
            if (this.trend.direction == 'down') return;
            
            /**
            * Si ha bajado al menos un <gains_percentage> abrimos un nuevo long
            */
            //if (this.candle.close < (this.trend.longPos - (this.trend.longPos * this.trend.pingPong.gainsPercentage / 100) )) return;

            
            /**
            * Si hemos llegado hasta aqui significa que se cumple los requisitos necesarios para volver a 
            * abrir una posicion long, por lo tanto ejecutamos un long y ademas guardamos el precio de la 
            * candle actual para saber a que precio hemos iniciado el long.
            */
            this.trend.longPos = this.candle.close;
            this.advice('long');
            
        }
    },
    
    
    /* END backtest */
    end: function()
    {
        let seconds = ((new Date()- this.startTime)/1000),
            minutes = seconds/60,
            str;
            
        minutes < 1 ? str = seconds.toFixed(2) + ' seconds' : str = minutes.toFixed(2) + ' minutes';
        
        log.info('====================================');
        log.info('Finished in ' + str);
        log.info('====================================');
    
        // print stats and messages if debug
        if(this.debug)
        {
            let stat = this.stat;
            log.info('BEAR RSI low/high: ' + stat.bear.min + ' / ' + stat.bear.max);
            log.info('BULL RSI low/high: ' + stat.bull.min + ' / ' + stat.bull.max);
            log.info('ADX min/max: ' + stat.adx.min + ' / ' + stat.adx.max);
        }
        
    }
    
};

module.exports = strat;

RSI_BULL_BEAR_PINGPONG.toml

# SMA INDICATOR
SMA_long = 1000
SMA_short = 50

# RSI BULL
BULL_RSI = 10
BULL_RSI_high = 80
BULL_RSI_low = 60

# RSI BEAR
BEAR_RSI = 15
BEAR_RSI_high = 50
BEAR_RSI_low = 20

# MODIFY RSI (depending on ADX)
BULL_MOD_high = 5
BULL_MOD_low = -5
BEAR_MOD_high = 15
BEAR_MOD_low = -5

# ADX
ADX = 3
ADX_high = 70
ADX_low = 50

# PING PONG
PINGPONG_GAINS_PERCENTAGE = 2

大家可以選擇策略進(jìn)行backtest副女,選擇適合自己的參數(shù)蛤高。

歡迎大家加入gekko 知識星球, 在這里你可以得到碑幅,關(guān)于gekko環(huán)境搭建問題的解答/查看群主分享的交易機(jī)器人策略/加入gekko策略交流群組戴陡,以及獲取更多的關(guān)于gekko使用方面的信息。
沒有任何基礎(chǔ)的小白也可以搭建自己的交易機(jī)器人沟涨。


gekko
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恤批,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子裹赴,更是在濱河造成了極大的恐慌喜庞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棋返,死亡現(xiàn)場離奇詭異延都,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懊昨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門窄潭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來春宣,“玉大人酵颁,你說我怎么就攤上這事≡碌郏” “怎么了躏惋?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嚷辅。 經(jīng)常有香客問我簿姨,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任扁位,我火速辦了婚禮准潭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘域仇。我一直安慰自己刑然,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布暇务。 她就那樣靜靜地躺著泼掠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垦细。 梳的紋絲不亂的頭發(fā)上择镇,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機(jī)與錄音括改,去河邊找鬼腻豌。 笑死,一個胖子當(dāng)著我的面吹牛嘱能,可吹牛的內(nèi)容都是我干的饲梭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼焰檩,長吁一口氣:“原來是場噩夢啊……” “哼憔涉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起析苫,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤兜叨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后衩侥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體国旷,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年茫死,在試婚紗的時候發(fā)現(xiàn)自己被綠了跪但。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡峦萎,死狀恐怖屡久,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爱榔,我是刑警寧澤被环,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站详幽,受9級特大地震影響筛欢,放射性物質(zhì)發(fā)生泄漏浸锨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一版姑、第九天 我趴在偏房一處隱蔽的房頂上張望柱搜。 院中可真熱鬧,春花似錦剥险、人聲如沸冯凹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宇姚。三九已至,卻和暖如春夫凸,著一層夾襖步出監(jiān)牢的瞬間浑劳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工夭拌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魔熏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓鸽扁,卻偏偏與公主長得像蒜绽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子桶现,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355