11-05-2019, 09:13 AM
(This post was last modified: 11-06-2019, 03:59 PM by Hallonstedt.)
There are a large number of Events with interesting data that are emitted by the Gekko plugins. Some would be quite useful in strategies but they are not available for the simple reason that strategies are not plugins and therefore cannot directly pick up the triggered events.
My quest was initially to be able to read live portfolio data as I have two strategies running in parallell and I need to know if I am exposed or not. I also want the strategy to react correctly to manual changes in the portfolio. I have since added more events that have proven quite useful.
Before using this guide, please be aware that it requires changes to two core Gekko plugins, meaning that if you update Gekko your changes are lost and the strategy will not work. It may also mean you break something else if you are not careful.
That being said, it is quite easy to do. Let's add the PortfolioChange event (~ is your Gekko root folder);
Edit ~/plugins/tradingAdvisor/tradingAdvisor.js and add:
Actor.prototype.processPortfolioChange = function(portfolio) { // This must be the handler name. The parameter name can be made up (portfolio). Just be consistent.
this.strategy.processPortfolioChange(portfolio); // This will be executed in baseTradingMethod.js
}
Edit ~/plugins/tradingAdvisor/baseTradingMethod.js and add:
Base.prototype.processPortfolioChange = function(portfolio) {
this.onPortfolioChange(portfolio); // onPortfolioChange will be accessible in the strategy
}
In your strategy, onPortfolioChange will trigger when the portfolio has changed so you can read the asset and currency variables. This is independent of your candle size so this can trigger at any moment. Add, for example;
strat.onPortfolioChange = function (portfolio) {
log.info('Portfolio has changed; Asset=', portfolio.asset.toFixed(3), 'and Currency=', portfolio.currency.toFixed(0) );
}
That's it!
Follow the same logic for any other Events. This adds Balance updates;
Edit ~/plugins/tradingAdvisor/tradingAdvisor.js and add:
Actor.prototype.portfolioValueChange = function(balance) {
this.strategy.portfolioValueChange(balance);
}
Edit ~/plugins/tradingAdvisor/baseTradingMethod.js and add:
Base.prototype.portfolioValueChange = function(balance) {
this.onBalanceChange(balance);
}
In your strategy, add:
strat.onBalanceChange = function (balance) {
log.info('Balance has changed; it is now', balance.balance.toFixed(1) );
}
My quest was initially to be able to read live portfolio data as I have two strategies running in parallell and I need to know if I am exposed or not. I also want the strategy to react correctly to manual changes in the portfolio. I have since added more events that have proven quite useful.
Before using this guide, please be aware that it requires changes to two core Gekko plugins, meaning that if you update Gekko your changes are lost and the strategy will not work. It may also mean you break something else if you are not careful.
That being said, it is quite easy to do. Let's add the PortfolioChange event (~ is your Gekko root folder);
Edit ~/plugins/tradingAdvisor/tradingAdvisor.js and add:
Actor.prototype.processPortfolioChange = function(portfolio) { // This must be the handler name. The parameter name can be made up (portfolio). Just be consistent.
this.strategy.processPortfolioChange(portfolio); // This will be executed in baseTradingMethod.js
}
Edit ~/plugins/tradingAdvisor/baseTradingMethod.js and add:
Base.prototype.processPortfolioChange = function(portfolio) {
this.onPortfolioChange(portfolio); // onPortfolioChange will be accessible in the strategy
}
In your strategy, onPortfolioChange will trigger when the portfolio has changed so you can read the asset and currency variables. This is independent of your candle size so this can trigger at any moment. Add, for example;
strat.onPortfolioChange = function (portfolio) {
log.info('Portfolio has changed; Asset=', portfolio.asset.toFixed(3), 'and Currency=', portfolio.currency.toFixed(0) );
}
That's it!
Follow the same logic for any other Events. This adds Balance updates;
Edit ~/plugins/tradingAdvisor/tradingAdvisor.js and add:
Actor.prototype.portfolioValueChange = function(balance) {
this.strategy.portfolioValueChange(balance);
}
Edit ~/plugins/tradingAdvisor/baseTradingMethod.js and add:
Base.prototype.portfolioValueChange = function(balance) {
this.onBalanceChange(balance);
}
In your strategy, add:
strat.onBalanceChange = function (balance) {
log.info('Balance has changed; it is now', balance.balance.toFixed(1) );
}