[SHARE] Simple RSI BULL/BEAR strategy
#29
Hi Tommie
when i was looking at the Indicators at Coinigy, with Usdt/NEO, i recognized:
if after trend reversal, in the Bull-Trend, the Buy-Volume does fall back to more normal.
then the Bull_RSI_high could never be reached.
So i added a second Qualification that only apply in the Bull-Trend by using RateOfChange (ROC) indicator.
(the last version with PPO did not work because of human error).

With Neo the result is pretty good when backtesting January.

Im new to code so please let me know if i should erase this post. Again thanks alot

The ROC indicator behaves not as expected:
ROC-level: Coinigy shows a level of >4 for the Neo Bull Trend but for the strat eny other value else than 0, creates negative Results.
ROC-length works well.

Code:
/*
   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 (improves performance)
       this.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('IDLE_RSI', 'rsi', { optInTimePeriod: this.settings.IDLE_RSI });
       this.addTulipIndicator('BEAR_RSI', 'rsi', { optInTimePeriod: this.settings.BEAR_RSI });
       this.addTulipIndicator('ROC_val', 'roc', { optInTimePeriod: this.settings.ROC });
       
       // debug stuff
       this.startTime = new Date();
       this.stat = {
           bear: { min: 100, max: 0 },
           bull: { min: 100, max: 0 },
           idle: { 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 if( type == 'idle') {
       cur = this.stat.idle;
       if( rsi < cur.min ) this.stat.idle.min = rsi; // set new
       if( rsi > cur.max ) this.stat.idle.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()
   {
       if( this.candle.close.length < this.requiredHistory ) { return; } // check if candle length is correct
       
       // get all indicators
       let ind = this.tulipIndicators,
           maSlow = ind.maSlow.result.result,
           maFast = ind.maFast.result.result,
           rsi,
           ROC_val = ind.ROC_val.result.result;
           
       // 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
       {
           // IDLE-BULL OR REAL-BULL TREND ??
           if( ROC_val <= this.settings.ROC_lvl )
           {
               // BULL-IDLE TREND
               rsi = ind.IDLE_RSI.result.result;
               if( rsi > this.settings.IDLE_RSI_high ) this.short();
               else if( rsi < this.settings.IDLE_RSI_low )  this.long();
               if(this.debug) this.lowHigh( rsi, 'idle' );
               //log.debug('IDLE-trend');
           }
           // REAL 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('Finished in ' + str);
       
       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);
           log.debug('IDLE low/high: ' + stat.idle.min + ' / ' + stat.idle.max);
       }
   }
   
};

module.exports = strat;

Code:
# SMA Trends
SMA_long = 800
SMA_short = 40

# BULL
BULL_RSI = 10
BULL_RSI_high = 80
BULL_RSI_low = 50

# IDLE
IDLE_RSI = 12
IDLE_RSI_high = 65
IDLE_RSI_low = 39

# BEAR
BEAR_RSI = 15
BEAR_RSI_high = 50
BEAR_RSI_low = 25

# ROC
ROC = 6
ROC_lvl = 0

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

# ROC is the LENGHT (averaging)
# Leave ROC_lvl at 0 otherwise Results are negative



Attached Files
.png   gekkoIDLE_2.png (Size: 156.19 KB / Downloads: 187)
  Reply


Messages In This Thread
Werkkrew Stoploss - by susitronix - 02-02-2018, 09:39 PM
Removed post - by susitronix - 02-03-2018, 06:49 PM
Added Bull_Idle Trend to RSI BULL/BEAR strategy - by susitronix - 02-06-2018, 02:03 AM
@Gryphon Confirmation - by mvangoor - 03-22-2019, 11:59 PM
for 3 months - by ankasem - 02-18-2018, 05:30 PM

Forum Jump:


Users browsing this thread: