1 parent
4636bf92d8
commit
fdba29a70c
5 files changed
+168
-541
No files matched your search
+3
-1
@@ -13,4 +13,6 @@ steps:
|
|||||||
registry: harbor.frantchenco.page
|
registry: harbor.frantchenco.page
|
||||||
auto_tag: true
|
auto_tag: true
|
||||||
tags:
|
tags:
|
||||||
- latest
|
- latest
|
||||||
|
cache_from:
|
||||||
|
- "harbor.frantchenco.page/library/gekko"
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
apiVersion: traefik.containo.us/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: svc-rancher-headers
|
||||||
|
spec:
|
||||||
|
headers:
|
||||||
|
customRequestHeaders:
|
||||||
|
X-Forwarded-Proto: "https"
|
||||||
|
---
|
||||||
|
apiVersion: traefik.containo.us/v1alpha1
|
||||||
|
kind: IngressRoute
|
||||||
|
metadata:
|
||||||
|
name: ingressroutetls-gekko
|
||||||
|
namespace: gekko
|
||||||
|
spec:
|
||||||
|
entryPoints:
|
||||||
|
- websecure
|
||||||
|
routes:
|
||||||
|
- match: Host(`gekko.dev.frantchenco.page`)
|
||||||
|
kind: Rule
|
||||||
|
services:
|
||||||
|
- name: gekko
|
||||||
|
port: 3000
|
||||||
@@ -1,539 +0,0 @@
|
|||||||
// Everything is explained here:
|
|
||||||
// @link https://gekko.wizb.it/docs/commandline/plugins.html
|
|
||||||
|
|
||||||
var config = {};
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// GENERAL SETTINGS
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
config.debug = true; // for additional logging / debugging
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// WATCHING A MARKET
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
config.watch = {
|
|
||||||
|
|
||||||
// see https://gekko.wizb.it/docs/introduction/supported_exchanges.html
|
|
||||||
exchange: 'binance',
|
|
||||||
currency: 'USDT',
|
|
||||||
asset: 'BTC',
|
|
||||||
}
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// CONFIGURING TRADING ADVICE
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
config.tradingAdvisor = {
|
|
||||||
enabled: true,
|
|
||||||
method: 'MACD',
|
|
||||||
candleSize: 60,
|
|
||||||
historySize: 10,
|
|
||||||
}
|
|
||||||
|
|
||||||
// MACD settings:
|
|
||||||
config.MACD = {
|
|
||||||
// EMA weight (α)
|
|
||||||
// the higher the weight, the more smooth (and delayed) the line
|
|
||||||
short: 10,
|
|
||||||
long: 21,
|
|
||||||
signal: 9,
|
|
||||||
// the difference between the EMAs (to act as triggers)
|
|
||||||
thresholds: {
|
|
||||||
down: -0.025,
|
|
||||||
up: 0.025,
|
|
||||||
// How many candle intervals should a trend persist
|
|
||||||
// before we consider it real?
|
|
||||||
persistence: 1
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// settings for other strategies can be found at the bottom, note that only
|
|
||||||
// one strategy is active per gekko, the other settings are ignored.
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// CONFIGURING PLUGINS
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
// do you want Gekko to simulate the profit of the strategy's own advice?
|
|
||||||
config.paperTrader = {
|
|
||||||
enabled: true,
|
|
||||||
// report the profit in the currency or the asset?
|
|
||||||
reportInCurrency: true,
|
|
||||||
// start balance, on what the current balance is compared with
|
|
||||||
simulationBalance: {
|
|
||||||
// these are in the unit types configured in the watcher.
|
|
||||||
asset: 1,
|
|
||||||
currency: 100,
|
|
||||||
},
|
|
||||||
// how much fee in % does each trade cost?
|
|
||||||
feeMaker: 0.15,
|
|
||||||
feeTaker: 0.25,
|
|
||||||
feeUsing: 'maker',
|
|
||||||
// how much slippage/spread should Gekko assume per trade?
|
|
||||||
slippage: 0.05,
|
|
||||||
}
|
|
||||||
|
|
||||||
config.performanceAnalyzer = {
|
|
||||||
enabled: true,
|
|
||||||
riskFreeReturn: 5
|
|
||||||
}
|
|
||||||
|
|
||||||
// Want Gekko to perform real trades on buy or sell advice?
|
|
||||||
// Enabling this will activate trades for the market being
|
|
||||||
// watched by `config.watch`.
|
|
||||||
config.trader = {
|
|
||||||
enabled: false,
|
|
||||||
key: '',
|
|
||||||
secret: '',
|
|
||||||
username: '', // your username, only required for specific exchanges.
|
|
||||||
passphrase: '', // GDAX, requires a passphrase.
|
|
||||||
}
|
|
||||||
|
|
||||||
config.eventLogger = {
|
|
||||||
enabled: false,
|
|
||||||
// optionally pass a whitelist of events to log, if not past
|
|
||||||
// the eventLogger will log _all_ events.
|
|
||||||
// whitelist: ['portfolioChange', 'portfolioValueChange']
|
|
||||||
}
|
|
||||||
|
|
||||||
config.pushover = {
|
|
||||||
enabled: false,
|
|
||||||
sendPushoverOnStart: false,
|
|
||||||
muteSoft: true, // disable advice printout if it's soft
|
|
||||||
tag: '[GEKKO]',
|
|
||||||
key: '',
|
|
||||||
user: ''
|
|
||||||
}
|
|
||||||
|
|
||||||
config.blotter = {
|
|
||||||
enabled: false,
|
|
||||||
filename: 'blotter.csv',
|
|
||||||
dateFormat: 'l LT',
|
|
||||||
timezone: -300, // -300 minutes for EST(-5:00), only used if exchange doesn't provide correct timezone
|
|
||||||
}
|
|
||||||
|
|
||||||
// want Gekko to send a mail on buy or sell advice?
|
|
||||||
config.mailer = {
|
|
||||||
enabled: false, // Send Emails if true, false to turn off
|
|
||||||
sendMailOnStart: true, // Send 'Gekko starting' message if true, not if false
|
|
||||||
|
|
||||||
email: '', // Your Gmail address
|
|
||||||
muteSoft: true, // disable advice printout if it's soft
|
|
||||||
|
|
||||||
// You don't have to set your password here, if you leave it blank we will ask it
|
|
||||||
// when Gekko's starts.
|
|
||||||
//
|
|
||||||
// NOTE: Gekko is an open source project < https://github.com/askmike/gekko >,
|
|
||||||
// make sure you looked at the code or trust the maintainer of this bot when you
|
|
||||||
// fill in your email and password.
|
|
||||||
//
|
|
||||||
// WARNING: If you have NOT downloaded Gekko from the github page above we CANNOT
|
|
||||||
// guarantuee that your email address & password are safe!
|
|
||||||
|
|
||||||
password: '', // Your Gmail Password - if not supplied Gekko will prompt on startup.
|
|
||||||
|
|
||||||
tag: '[GEKKO] ', // Prefix all email subject lines with this
|
|
||||||
|
|
||||||
// ADVANCED MAIL SETTINGS
|
|
||||||
// you can leave those as is if you
|
|
||||||
// just want to use Gmail
|
|
||||||
|
|
||||||
server: 'smtp.gmail.com', // The name of YOUR outbound (SMTP) mail server.
|
|
||||||
smtpauth: true, // Does SMTP server require authentication (true for Gmail)
|
|
||||||
// The following 3 values default to the Email (above) if left blank
|
|
||||||
user: '', // Your Email server user name - usually your full Email address '[email protected]'
|
|
||||||
from: '', // '[email protected]'
|
|
||||||
to: '', // '[email protected], [email protected]'
|
|
||||||
ssl: true, // Use SSL (true for Gmail)
|
|
||||||
port: '', // Set if you don't want to use the default port
|
|
||||||
}
|
|
||||||
|
|
||||||
config.pushbullet = {
|
|
||||||
// sends pushbullets if true
|
|
||||||
enabled: false,
|
|
||||||
// Send 'Gekko starting' message if true
|
|
||||||
sendMessageOnStart: true,
|
|
||||||
// Send Message for advice? Recommend Flase for paper, true for live
|
|
||||||
sendOnAdvice: true,
|
|
||||||
// Send Message on Trade Completion?
|
|
||||||
sendOnTrade: true,
|
|
||||||
// For Overall P/L calc. Pass in old balance if desired, else leave '0'
|
|
||||||
startingBalance: 0,
|
|
||||||
// your pushbullet API key
|
|
||||||
key: '',
|
|
||||||
// your email
|
|
||||||
email: '[email protected]',
|
|
||||||
// Messages will start with this tag
|
|
||||||
tag: '[GEKKO]'
|
|
||||||
};
|
|
||||||
|
|
||||||
config.kodi = {
|
|
||||||
// if you have a username & pass, add it like below
|
|
||||||
// http://user:pass@ip-or-hostname:8080/jsonrpc
|
|
||||||
host: 'http://ip-or-hostname:8080/jsonrpc',
|
|
||||||
enabled: false,
|
|
||||||
sendMessageOnStart: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
config.ircbot = {
|
|
||||||
enabled: false,
|
|
||||||
emitUpdates: false,
|
|
||||||
muteSoft: true,
|
|
||||||
channel: '#your-channel',
|
|
||||||
server: 'irc.freenode.net',
|
|
||||||
botName: 'gekkobot'
|
|
||||||
}
|
|
||||||
|
|
||||||
config.telegrambot = {
|
|
||||||
enabled: false,
|
|
||||||
// Receive notifications for trades and warnings/errors related to trading
|
|
||||||
emitTrades: false,
|
|
||||||
token: 'YOUR_TELEGRAM_BOT_TOKEN',
|
|
||||||
};
|
|
||||||
|
|
||||||
config.twitter = {
|
|
||||||
// sends pushbullets if true
|
|
||||||
enabled: false,
|
|
||||||
// Send 'Gekko starting' message if true
|
|
||||||
sendMessageOnStart: false,
|
|
||||||
// disable advice printout if it's soft
|
|
||||||
muteSoft: false,
|
|
||||||
tag: '[GEKKO]',
|
|
||||||
// twitter consumer key
|
|
||||||
consumer_key: '',
|
|
||||||
// twitter consumer secret
|
|
||||||
consumer_secret: '',
|
|
||||||
// twitter access token key
|
|
||||||
access_token_key: '',
|
|
||||||
// twitter access token secret
|
|
||||||
access_token_secret: ''
|
|
||||||
};
|
|
||||||
|
|
||||||
config.xmppbot = {
|
|
||||||
enabled: false,
|
|
||||||
emitUpdates: false,
|
|
||||||
client_id: 'jabber_id',
|
|
||||||
client_pwd: 'jabber_pw',
|
|
||||||
client_host: 'jabber_server',
|
|
||||||
client_port: 5222,
|
|
||||||
status_msg: 'I\'m online',
|
|
||||||
receiver: 'jabber_id_for_updates'
|
|
||||||
}
|
|
||||||
|
|
||||||
config.campfire = {
|
|
||||||
enabled: false,
|
|
||||||
emitUpdates: false,
|
|
||||||
nickname: 'Gordon',
|
|
||||||
roomId: null,
|
|
||||||
apiKey: '',
|
|
||||||
account: ''
|
|
||||||
}
|
|
||||||
|
|
||||||
config.redisBeacon = {
|
|
||||||
enabled: false,
|
|
||||||
port: 6379, // redis default
|
|
||||||
host: '127.0.0.1', // localhost
|
|
||||||
// On default Gekko broadcasts
|
|
||||||
// events in the channel with
|
|
||||||
// the name of the event, set
|
|
||||||
// an optional prefix to the
|
|
||||||
// channel name.
|
|
||||||
channelPrefix: '',
|
|
||||||
broadcast: [
|
|
||||||
'candle'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
config.slack = {
|
|
||||||
enabled: false,
|
|
||||||
token: '',
|
|
||||||
sendMessageOnStart: true,
|
|
||||||
muteSoft: true,
|
|
||||||
channel: '' // #tradebot
|
|
||||||
}
|
|
||||||
|
|
||||||
config.ifttt = {
|
|
||||||
enabled: false,
|
|
||||||
eventName: 'gekko',
|
|
||||||
makerKey: '',
|
|
||||||
muteSoft: true,
|
|
||||||
sendMessageOnStart: true
|
|
||||||
}
|
|
||||||
|
|
||||||
config.candleWriter = {
|
|
||||||
enabled: true
|
|
||||||
}
|
|
||||||
|
|
||||||
config.adviceWriter = {
|
|
||||||
enabled: false,
|
|
||||||
muteSoft: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
config.backtestResultExporter = {
|
|
||||||
enabled: false,
|
|
||||||
writeToDisk: false,
|
|
||||||
data: {
|
|
||||||
stratUpdates: false,
|
|
||||||
portfolioValues: true,
|
|
||||||
stratCandles: true,
|
|
||||||
roundtrips: true,
|
|
||||||
trades: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
config.candleUploader = {
|
|
||||||
enabled: false,
|
|
||||||
url: '',
|
|
||||||
apiKey: ''
|
|
||||||
}
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// CONFIGURING ADAPTER
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
config.adapter = 'sqlite';
|
|
||||||
|
|
||||||
config.sqlite = {
|
|
||||||
path: 'plugins/sqlite',
|
|
||||||
|
|
||||||
dataDirectory: 'history',
|
|
||||||
version: 0.1,
|
|
||||||
|
|
||||||
journalMode: require('./web/isWindows.js') ? 'DELETE' : 'WAL',
|
|
||||||
|
|
||||||
dependencies: []
|
|
||||||
}
|
|
||||||
|
|
||||||
// Postgres adapter example config (please note: requires postgres >= 9.5):
|
|
||||||
config.postgresql = {
|
|
||||||
path: 'plugins/postgresql',
|
|
||||||
version: 0.1,
|
|
||||||
connectionString: 'postgres://user:pass@localhost:5432', // if default port
|
|
||||||
database: null, // if set, we'll put all tables into a single database.
|
|
||||||
schema: 'public',
|
|
||||||
dependencies: [{
|
|
||||||
module: 'pg',
|
|
||||||
version: '7.4.3'
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mongodb adapter, requires mongodb >= 3.3 (no version earlier tested)
|
|
||||||
config.mongodb = {
|
|
||||||
path: 'plugins/mongodb',
|
|
||||||
version: 0.1,
|
|
||||||
connectionString: 'mongodb://localhost/gekko', // connection to mongodb server
|
|
||||||
dependencies: [{
|
|
||||||
module: 'mongojs',
|
|
||||||
version: '2.4.0'
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
|
|
||||||
config.candleUploader = {
|
|
||||||
enabled: false,
|
|
||||||
url: '',
|
|
||||||
apiKey: ''
|
|
||||||
}
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// CONFIGURING BACKTESTING
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
// Note that these settings are only used in backtesting mode, see here:
|
|
||||||
// @link: https://gekko.wizb.it/docs/commandline/backtesting.html
|
|
||||||
|
|
||||||
config.backtest = {
|
|
||||||
daterange: 'scan',
|
|
||||||
// daterange: {
|
|
||||||
// from: "2018-03-01",
|
|
||||||
// to: "2018-04-28"
|
|
||||||
//},
|
|
||||||
batchSize: 50
|
|
||||||
}
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// CONFIGURING IMPORTING
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
config.importer = {
|
|
||||||
daterange: {
|
|
||||||
// NOTE: these dates are in UTC
|
|
||||||
from: "2017-11-01 00:00:00",
|
|
||||||
to: "2017-11-20 00:00:00"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
// OTHER STRATEGY SETTINGS
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
// Exponential Moving Averages settings:
|
|
||||||
config.DEMA = {
|
|
||||||
// EMA weight (α)
|
|
||||||
// the higher the weight, the more smooth (and delayed) the line
|
|
||||||
weight: 21,
|
|
||||||
// amount of candles to remember and base initial EMAs on
|
|
||||||
// the difference between the EMAs (to act as triggers)
|
|
||||||
thresholds: {
|
|
||||||
down: -0.025,
|
|
||||||
up: 0.025
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// PPO settings:
|
|
||||||
config.PPO = {
|
|
||||||
// EMA weight (α)
|
|
||||||
// the higher the weight, the more smooth (and delayed) the line
|
|
||||||
short: 12,
|
|
||||||
long: 26,
|
|
||||||
signal: 9,
|
|
||||||
// the difference between the EMAs (to act as triggers)
|
|
||||||
thresholds: {
|
|
||||||
down: -0.025,
|
|
||||||
up: 0.025,
|
|
||||||
// How many candle intervals should a trend persist
|
|
||||||
// before we consider it real?
|
|
||||||
persistence: 2
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Uses one of the momentum indicators but adjusts the thresholds when PPO is bullish or bearish
|
|
||||||
// Uses settings from the ppo and momentum indicator config block
|
|
||||||
config.varPPO = {
|
|
||||||
momentum: 'TSI', // RSI, TSI or UO
|
|
||||||
thresholds: {
|
|
||||||
// new threshold is default threshold + PPOhist * PPOweight
|
|
||||||
weightLow: 120,
|
|
||||||
weightHigh: -120,
|
|
||||||
// How many candle intervals should a trend persist
|
|
||||||
// before we consider it real?
|
|
||||||
persistence: 0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// RSI settings:
|
|
||||||
config.RSI = {
|
|
||||||
interval: 14,
|
|
||||||
thresholds: {
|
|
||||||
low: 30,
|
|
||||||
high: 70,
|
|
||||||
// How many candle intervals should a trend persist
|
|
||||||
// before we consider it real?
|
|
||||||
persistence: 1
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// TSI settings:
|
|
||||||
config.TSI = {
|
|
||||||
short: 13,
|
|
||||||
long: 25,
|
|
||||||
thresholds: {
|
|
||||||
low: -25,
|
|
||||||
high: 25,
|
|
||||||
// How many candle intervals should a trend persist
|
|
||||||
// before we consider it real?
|
|
||||||
persistence: 1
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Ultimate Oscillator Settings
|
|
||||||
config.UO = {
|
|
||||||
first: {
|
|
||||||
weight: 4,
|
|
||||||
period: 7
|
|
||||||
},
|
|
||||||
second: {
|
|
||||||
weight: 2,
|
|
||||||
period: 14
|
|
||||||
},
|
|
||||||
third: {
|
|
||||||
weight: 1,
|
|
||||||
period: 28
|
|
||||||
},
|
|
||||||
thresholds: {
|
|
||||||
low: 30,
|
|
||||||
high: 70,
|
|
||||||
// How many candle intervals should a trend persist
|
|
||||||
// before we consider it real?
|
|
||||||
persistence: 1
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// CCI Settings
|
|
||||||
config.CCI = {
|
|
||||||
constant: 0.015, // constant multiplier. 0.015 gets to around 70% fit
|
|
||||||
history: 90, // history size, make same or smaller than history
|
|
||||||
thresholds: {
|
|
||||||
up: 100, // fixed values for overbuy upward trajectory
|
|
||||||
down: -100, // fixed value for downward trajectory
|
|
||||||
persistence: 0 // filter spikes by adding extra filters candles
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// StochRSI settings
|
|
||||||
config.StochRSI = {
|
|
||||||
interval: 3,
|
|
||||||
thresholds: {
|
|
||||||
low: 20,
|
|
||||||
high: 80,
|
|
||||||
// How many candle intervals should a trend persist
|
|
||||||
// before we consider it real?
|
|
||||||
persistence: 3
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// custom settings:
|
|
||||||
config.custom = {
|
|
||||||
my_custom_setting: 10,
|
|
||||||
}
|
|
||||||
|
|
||||||
config['talib-macd'] = {
|
|
||||||
parameters: {
|
|
||||||
optInFastPeriod: 10,
|
|
||||||
optInSlowPeriod: 21,
|
|
||||||
optInSignalPeriod: 9
|
|
||||||
},
|
|
||||||
thresholds: {
|
|
||||||
down: -0.025,
|
|
||||||
up: 0.025,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
config['talib-macd'] = {
|
|
||||||
parameters: {
|
|
||||||
optInFastPeriod: 10,
|
|
||||||
optInSlowPeriod: 21,
|
|
||||||
optInSignalPeriod: 9
|
|
||||||
},
|
|
||||||
thresholds: {
|
|
||||||
down: -0.025,
|
|
||||||
up: 0.025,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
config['tulip-adx'] = {
|
|
||||||
optInTimePeriod: 10,
|
|
||||||
thresholds: {
|
|
||||||
down: -0.025,
|
|
||||||
up: 0.025,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// set this to true if you understand that Gekko will
|
|
||||||
// invest according to how you configured the indicators.
|
|
||||||
// None of the advice in the output is Gekko telling you
|
|
||||||
// to take a certain position. Instead it is the result
|
|
||||||
// of running the indicators you configured automatically.
|
|
||||||
//
|
|
||||||
// In other words: Gekko automates your trading strategies,
|
|
||||||
// it doesn't advice on itself, only set to true if you truly
|
|
||||||
// understand this.
|
|
||||||
//
|
|
||||||
// Not sure? Read this first: https://github.com/askmike/gekko/issues/201
|
|
||||||
config['I understand that Gekko only automates MY OWN trading strategies'] = false;
|
|
||||||
|
|
||||||
module.exports = config;
|
|
||||||
@@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Frantche MACD RSI - DJM 14/06/2021
|
||||||
|
|
||||||
|
(updated a couple of times since, check git history)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// helpers
|
||||||
|
var _ = require('lodash');
|
||||||
|
var log = require('../core/log.js');
|
||||||
|
|
||||||
|
|
||||||
|
// let's create our own method
|
||||||
|
var method = {};
|
||||||
|
|
||||||
|
// prepare everything our method needs
|
||||||
|
method.init = function() {
|
||||||
|
// keep state about the current trend
|
||||||
|
// here, on every new candle we use this
|
||||||
|
// state object to check if we need to
|
||||||
|
// report it.
|
||||||
|
this.trend = {
|
||||||
|
direction: 'none',
|
||||||
|
duration: 0,
|
||||||
|
persisted: false,
|
||||||
|
adviced: false
|
||||||
|
};
|
||||||
|
|
||||||
|
log.debug(this.settings);
|
||||||
|
|
||||||
|
|
||||||
|
// how many candles do we need as a base
|
||||||
|
// before we can start giving advice?
|
||||||
|
this.requiredHistory = this.tradingAdvisor.historySize;
|
||||||
|
|
||||||
|
// define the indicators we need
|
||||||
|
this.addIndicator('macd', 'MACD', this.settings);
|
||||||
|
this.addIndicator('rsi', 'RSI', this.settings);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// what happens on every new candle?
|
||||||
|
method.update = function(candle) {
|
||||||
|
// nothing!
|
||||||
|
}
|
||||||
|
|
||||||
|
// for debugging purposes: log the last calculated
|
||||||
|
// EMAs and diff.
|
||||||
|
method.log = function() {
|
||||||
|
var digits = 8;
|
||||||
|
var macd = this.indicators.macd;
|
||||||
|
|
||||||
|
var diff = macd.diff;
|
||||||
|
var signal = macd.signal.result;
|
||||||
|
|
||||||
|
log.debug('calculated MACD properties for candle:');
|
||||||
|
log.debug('\t', 'short:', macd.short.result.toFixed(digits));
|
||||||
|
log.debug('\t', 'long:', macd.long.result.toFixed(digits));
|
||||||
|
log.debug('\t', 'macd:', diff.toFixed(digits));
|
||||||
|
log.debug('\t', 'signal:', signal.toFixed(digits));
|
||||||
|
log.debug('\t', 'macdiff:', macd.result.toFixed(digits));
|
||||||
|
}
|
||||||
|
|
||||||
|
method.check = function() {
|
||||||
|
var macddiff = this.indicators.macd.result;
|
||||||
|
|
||||||
|
if(macddiff > this.settings.thresholds.up) {
|
||||||
|
|
||||||
|
// new trend detected
|
||||||
|
if(this.trend.direction !== 'up')
|
||||||
|
// reset the state for the new trend
|
||||||
|
this.trend = {
|
||||||
|
duration: 0,
|
||||||
|
persisted: false,
|
||||||
|
direction: 'up',
|
||||||
|
adviced: false
|
||||||
|
};
|
||||||
|
|
||||||
|
this.trend.duration++;
|
||||||
|
|
||||||
|
log.debug('In uptrend since', this.trend.duration, 'candle(s)');
|
||||||
|
|
||||||
|
if(this.trend.duration >= this.settings.thresholds.persistence)
|
||||||
|
this.trend.persisted = true;
|
||||||
|
|
||||||
|
if(this.trend.persisted && !this.trend.adviced) {
|
||||||
|
this.trend.adviced = true;
|
||||||
|
this.advice('long');
|
||||||
|
} else
|
||||||
|
this.advice();
|
||||||
|
|
||||||
|
} else if(macddiff < this.settings.thresholds.down) {
|
||||||
|
|
||||||
|
// new trend detected
|
||||||
|
if(this.trend.direction !== 'down')
|
||||||
|
// reset the state for the new trend
|
||||||
|
this.trend = {
|
||||||
|
duration: 0,
|
||||||
|
persisted: false,
|
||||||
|
direction: 'down',
|
||||||
|
adviced: false
|
||||||
|
};
|
||||||
|
|
||||||
|
this.trend.duration++;
|
||||||
|
|
||||||
|
log.debug('In downtrend since', this.trend.duration, 'candle(s)');
|
||||||
|
|
||||||
|
if(this.trend.duration >= this.settings.thresholds.persistence)
|
||||||
|
this.trend.persisted = true;
|
||||||
|
|
||||||
|
if(this.trend.persisted && !this.trend.adviced) {
|
||||||
|
this.trend.adviced = true;
|
||||||
|
this.advice('short');
|
||||||
|
} else
|
||||||
|
this.advice();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
log.debug('In no trend');
|
||||||
|
|
||||||
|
// we're not in an up nor in a downtrend
|
||||||
|
// but for now we ignore sideways trends
|
||||||
|
//
|
||||||
|
// read more @link:
|
||||||
|
//
|
||||||
|
// https://github.com/askmike/gekko/issues/171
|
||||||
|
|
||||||
|
// this.trend = {
|
||||||
|
// direction: 'none',
|
||||||
|
// duration: 0,
|
||||||
|
// persisted: false,
|
||||||
|
// adviced: false
|
||||||
|
// };
|
||||||
|
|
||||||
|
this.advice();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = method;
|
||||||
+2
-1
@@ -7,7 +7,8 @@
|
|||||||
const CONFIG = {
|
const CONFIG = {
|
||||||
headless: false,
|
headless: false,
|
||||||
api: {
|
api: {
|
||||||
host: '127.0.0.1',
|
host: 'localhost',
|
||||||
|
path: '/',
|
||||||
port: 3000,
|
port: 3000,
|
||||||
timeout: 120000 // 2 minutes
|
timeout: 120000 // 2 minutes
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in new issue
Block a user