Relative Strength Index (RSI) strategy
This strategy uses the Relative Strength Index (RSI) to time entries and exits. RSI is a momentum oscillator that gauges the speed and change of price movement; readings above 70 are commonly treated as overbought, while readings below 30 are commonly treated as oversold. The script focuses on custom indicator calculations to inform trading decisions.
tip
This example strategy is machine generated using Gunbot AI. Review its behavior carefully in a simulated bot instance before using parts of this code in production.
// initialize customStratStore within pairLedger object
gb.data.pairLedger.customStratStore = gb.data.pairLedger.customStratStore || {};
// forced wait time reduces risk of double orders
function checkTime() {
return !gb.data.pairLedger.customStratStore.timeCheck || typeof gb.data.pairLedger.customStratStore.timeCheck !== "number"
? (gb.data.pairLedger.customStratStore.timeCheck = Date.now(), false)
: (Date.now() - gb.data.pairLedger.customStratStore.timeCheck > 8000);
}
const enoughTimePassed = checkTime();
// set timestamp for checkTime in next round
const setTimestamp = () => gb.data.pairLedger.customStratStore.timeCheck = Date.now();
// calculate RSI
function calculateRSI(period) {
const closes = gb.data.candlesClose.slice(-period);
const changes = closes.map((close, i) => i === 0 ? 0 : close - closes[i - 1]);
const gains = changes.map(change => change > 0 ? change : 0);
const losses = changes.map(change => change < 0 ? Math.abs(change) : 0);
const avgGain = gains.reduce((sum, gain) => sum + gain, 0) / period;
const avgLoss = losses.reduce((sum, loss) => sum + loss, 0) / period;
const RS = avgGain / avgLoss;
const RSI = 100 - (100 / (1 + RS));
return RSI;
}
// calculate moving average
function calculateMA(period, data) {
const values = data.slice(-period);
const sum = values.reduce((total, value) => total + value, 0);
const MA = sum / period;
return MA;
}
// calculate Bollinger Bands
function calculateBB(period, stdDev, data) {
const values = data.slice(-period);
const MA = calculateMA(period, data);
const variance = values.reduce((total, value) => total + Math.pow(value - MA, 2), 0) / period;
const stdDeviation = Math.sqrt(variance);
const upperBand = MA + (stdDev * stdDeviation);
const lowerBand = MA - (stdDev * stdDeviation);
return { upperBand, lowerBand };
}
// calculate indicators
const RSI = calculateRSI(14);
const { upperBand, lowerBand } = calculateBB(20, 2, gb.data.candlesClose);
// log indicators and trading conditions
console.log(`RSI: ${RSI}`);
console.log(`Upper Bollinger Band: ${upperBand}`);
console.log(`Lower Bollinger Band: ${lowerBand}`);
console.log(`Got Bag: ${gb.data.gotBag}`);
// set buy and sell conditions
const buyConditions = RSI < 30 && !gb.data.gotBag;
const sellConditions = RSI > 70 && gb.data.gotBag;
if (enoughTimePassed) {
if (buyConditions) {
const buyAmount = gb.data.baseBalance * 0.95;
gb.method.buyMarket(buyAmount, gb.data.pairName);
setTimestamp();
} else if (sellConditions) {
gb.method.sellMarket(gb.data.quoteBalance, gb.data.pairName);
setTimestamp();
}
}
// Code is machine generated, review it and run in simulator mode first