Skip to content

Commit

Permalink
use datasets over ranges, gekko UI v0.1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
askmike committed Nov 13, 2016
1 parent 2e77914 commit ebca146
Show file tree
Hide file tree
Showing 8 changed files with 235 additions and 32 deletions.
2 changes: 0 additions & 2 deletions core/workers/datasetScan/parent.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ module.exports = function(config, done) {
let marketConfig = _.clone(config);
marketConfig.watch = market;

console.log(marketConfig);

dateRangeScan(marketConfig, (err, ranges) => {
if(err)
return next(err);
Expand Down
2 changes: 1 addition & 1 deletion web/vue/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "vue",
"version": "0.0.9",
"version": "0.1.0",
"description": "The frontend for the Gekko UI",
"author": "Mike van Rossum <mike@mvr.me>",
"scripts": {
Expand Down
49 changes: 29 additions & 20 deletions web/vue/src/backtester/backtestConfigBuilder.vue
Original file line number Diff line number Diff line change
@@ -1,42 +1,54 @@
<template lang='jade'>
.contain
.grd
.grd-row
.grd-row-col-3-6.mx1
h3 Market
market-picker.contain(v-on:market='updateMarket')
.grd-row-col-3-6.mx1
range-picker(v-on:range='updateRange', :config='market')
dataset-picker.contain.my2(v-on:dataset='updateDataset')
.hr
strat-picker.contain.my2(v-on:stratConfig='updateStrat')
</template>

<script>
import marketPicker from '../global/configbuilder/marketpicker.vue'
import datasetPicker from '../global/configbuilder/datasetPicker.vue'
import stratPicker from '../global/configbuilder/stratpicker.vue'
import rangePicker from '../global/configbuilder/rangepicker.vue'
import _ from 'lodash'
export default {
data: () => {
return {
market: {},
dataset: {},
strat: {},
range: {}
}
},
components: {
marketPicker,
stratPicker,
rangePicker
datasetPicker
},
computed: {
market: function() {
if(!this.dataset.exchange)
return {};
return {
exchange: this.dataset.exchange,
currency: this.dataset.currency,
asset: this.dataset.asset
}
},
range: function() {
if(!this.dataset.exchange)
return {};
return {
from: this.dataset.from,
to: this.dataset.to
}
},
config: function() {
let config = {};
Object.assign(
config,
this.market,
{
watch: this.market
},
this.strat,
{
backtest: {
Expand Down Expand Up @@ -77,12 +89,9 @@ export default {
return true;
},
updateMarket: function(mc) {
this.market = mc;
this.$emit('config', this.config);
},
updateRange: function(range) {
this.range = range;
updateDataset: function(set) {
this.dataset = set;
// console.log('updateDataset', set);
this.$emit('config', this.config);
},
updateStrat: function(sc) {
Expand Down
1 change: 1 addition & 0 deletions web/vue/src/backtester/backtester.vue
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export default {
},
methods: {
check: function(config) {
// console.log('CHECK', config);
this.config = config;
if(!config.valid)
Expand Down
92 changes: 88 additions & 4 deletions web/vue/src/data/data.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,41 @@
.text(v-html='intro')
.hr
h2 Available datasets
.txt--center.my2(v-if='!datasets.length')
.txt--center.my2(v-if='scanstate === "idle"')
a.w100--s.btn--blue.scan-btn(href='#', v-on:click.prevent='scan') scan available data
.txt--center.my2(v-if='scanstate === "scanning"')
spinner
.my2(v-if='scanstate === "scanned"')
table.full
thead
tr
th exchange
th currency
th asset
th from
th to
th duration
tbody
tr(v-for='set in datasets')
td {{ set.exchange }}
td {{ set.currency }}
td {{ set.asset }}
td {{ fmt(set.from) }}
td {{ fmt(set.to) }}
td {{ humanizeDuration(set.to.diff(set.from)) }}
.my2
h2 Import more data
p.text You can easily import more market data directly from the exchange using the importer.
router-link(to='/data/importer') Go to the importer.

</template>

<script>
import spinner from '../global/blockSpinner.vue'
import { post } from '../tools/ajax'
import marked from '../tools/marked'
// global moment
// global humanizeDuration
let intro = marked(`
Expand All @@ -24,17 +47,78 @@ Gekko needs local market data in order to backtest strategies. The local
data can also be used in a warmup period when running a strategy against a
live market.
`)
`);
export default {
components: {
spinner
},
data: () => {
return {
intro,
datasets: []
datasets: [],
scanstate: 'idle'
}
},
methods: {
scan: function() {
this.scanstate = 'scanning';
post('scansets', {}, (error, response) => {
this.scanstate = 'scanned';
let sets = [];
response.forEach(market => {
market.ranges.forEach(range => {
sets.push({
exchange: market.exchange,
currency: market.currency,
asset: market.asset,
from: moment.unix(range.from).utc(),
to: moment.unix(range.to).utc()
});
});
});
// for now, filter out sets smaller than 3 hours..
sets = sets.filter(set => {
if(set.to.diff(set.from, 'hours') > 2)
return true;
});
sets = sets.sort((a, b) => {
let adiff = a.to.diff(a.from);
let bdiff = b.to.diff(b.from);
if(adiff < bdiff)
return -1;
if(adiff > bdiff)
return 1;
return 0;
}).reverse();
this.datasets = sets;
})
},
humanizeDuration: (n) => window.humanizeDuration(n),
fmt: mom => mom.format('YYYY-MM-DD HH:mm')
}
}
</script>

<style>
table.full {
width: 100%;
}
table.full td {
padding: 0.5rem 0;
}
table.full th {
text-align: center;
}
</style>
6 changes: 2 additions & 4 deletions web/vue/src/data/import/importer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@
p(v-if='imports.length === 0') You currently don't have any imports running.
ul(v-if='imports.length')
li(v-for='_import in imports')
router-link(:to='"/single-import/" + _import.id') {{ _import.watch.exchange }}:{{ _import.watch.currency }}/{{ _import.watch.asset }}
router-link(:to='"/data/importer/import/" + _import.id') {{ _import.watch.exchange }}:{{ _import.watch.currency }}/{{ _import.watch.asset }}

.hr
h3 Start a new import
import-config-builder(v-on:config='updateConfig')
.hr
.txt--center
// router-link(to='/single-import/a').w100--s.my1.btn--blue.b(href='#') Import
a.w100--s.my1.btn--blue(href='#', v-on:click.prevent='run') Import
</template>

Expand All @@ -29,8 +28,7 @@ let intro = marked(`
## Import data
In order to backtest your strategies using Gekko against
historical data you first need to import data into Gekko.
The importer can download historical market data directly from the exchange.
`)
Expand Down
114 changes: 114 additions & 0 deletions web/vue/src/global/configbuilder/datasetpicker.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<template lang='jade'>
div
h3 Select a dataset
.txt--center.my2(v-if='scanstate === "idle"')
a.w100--s.btn--blue.scan-btn(href='#', v-on:click.prevent='scan') scan available data
.txt--center.my2(v-if='scanstate === "scanning"')
spinner
.my2(v-if='scanstate === "scanned"')
table.full
thead
tr
th
th exchange
th currency
th asset
th from
th to
th duration
tbody
tr(v-for='(set, i) in datasets')
td.radio
input(type='radio', name='dataset', :value='i', v-model='setIndex')
td {{ set.exchange }}
td {{ set.currency }}
td {{ set.asset }}
td {{ fmt(set.from) }}
td {{ fmt(set.to) }}
td {{ humanizeDuration(set.to.diff(set.from)) }}
</template>

<script>
import { post } from '../../tools/ajax'
import spinner from '../../global/blockSpinner.vue'
export default {
components: {
spinner
},
data: () => {
return {
datasets: [],
scanstate: 'idle',
setIndex: -1
};
},
methods: {
scan: function() {
this.scanstate = 'scanning';
post('scansets', {}, (error, response) => {
this.scanstate = 'scanned';
let sets = [];
response.forEach(market => {
market.ranges.forEach(range => {
sets.push({
exchange: market.exchange,
currency: market.currency,
asset: market.asset,
from: moment.unix(range.from).utc(),
to: moment.unix(range.to).utc()
});
});
});
// for now, filter out sets smaller than 3 hours..
sets = sets.filter(set => {
if(set.to.diff(set.from, 'hours') > 2)
return true;
});
sets = sets.sort((a, b) => {
let adiff = a.to.diff(a.from);
let bdiff = b.to.diff(b.from);
if(adiff < bdiff)
return -1;
if(adiff > bdiff)
return 1;
return 0;
}).reverse();
this.datasets = sets;
})
},
humanizeDuration: (n) => {
return window.humanizeDuration(n, {largest: 4});
},
fmt: mom => mom.format('YYYY-MM-DD HH:mm')
},
computed: {
set: function() {
return this.datasets[this.setIndex];
}
},
watch: {
set: function(val) {
if(!val)
return;
this.$emit('dataset', val);
}
}
}
</script>
<style>
td.radio {
width: 45px;
}
</style>
1 change: 0 additions & 1 deletion web/vue/src/global/configbuilder/stratpicker.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<template lang='jade'>
// config.tradingAdvisor
.grd
.grd-row
.grd-row-col-3-6.px1
Expand Down

0 comments on commit ebca146

Please sign in to comment.