Skip to content

Commit 3ad5808

Browse files
committed
Merge branch 'master' into master_github
2 parents c17194c + 0b9285b commit 3ad5808

File tree

3 files changed

+119
-56
lines changed

3 files changed

+119
-56
lines changed

templates/trades.html.twig

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
{% block title %}Trades | Crypto Bot{% endblock %}
44

55
{% block javascript %}
6-
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
7-
<script src="https://unpkg.com/http-vue-loader"></script>
8-
<script src="/js/trades.js?v={{ asset_version() }}" type="module"></script>
6+
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
7+
<script src="https://cdn.jsdelivr.net/npm/vue3-sfc-loader/dist/vue3-sfc-loader.js"></script>
8+
<script src="/js/trades.js?v={{ asset_version() }}" type="module"></script>
99
{% endblock %}
1010

1111
{% block content %}
@@ -30,11 +30,11 @@
3030
<!-- /.Content Header (Page header) -->
3131

3232
<!-- Main content -->
33-
<div class="content" id="vue-trades">
33+
<div class="content">
3434
<div class="container-fluid">
3535
<div class="row">
3636
<div class="col-md-12">
37-
<trades></trades>
37+
<div id="vue-trades"></div>
3838
</div>
3939
</div>
4040
<!-- /.row -->

web/static/js/trades.js

+25-24
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
1-
Vue.filter('filter_price', function(value) {
2-
if (parseFloat(value) < 1) {
3-
return Intl.NumberFormat('en-US', {
4-
useGrouping: false,
5-
minimumFractionDigits: 2,
6-
maximumFractionDigits: 6
7-
}).format(value);
8-
}
1+
const options = {
2+
moduleCache: {
3+
vue: Vue
4+
},
95

10-
return Intl.NumberFormat('en-US', {
11-
useGrouping: false,
12-
minimumFractionDigits: 2,
13-
maximumFractionDigits: 2
14-
}).format(value);
15-
});
6+
getFile(url) {
7+
return fetch(url).then(response => (response.ok ? response.text() : Promise.reject(response)));
8+
},
169

17-
Vue.filter('round', function(value, decimalPlaces = 0) {
18-
return value.toFixed(decimalPlaces);
19-
});
10+
addStyle(styleStr) {
11+
const style = document.createElement('style');
12+
style.textContent = styleStr;
13+
const ref = document.head.getElementsByTagName('style')[0] || null;
14+
document.head.insertBefore(style, ref);
15+
},
2016

21-
Vue.filter('date', function(value) {
22-
return new Date(value).toLocaleString();
23-
});
17+
log(type, ...args) {
18+
console.log(type, ...args);
19+
}
20+
};
21+
22+
const { loadModule, version } = window['vue3-sfc-loader'];
2423

25-
new Vue({
26-
el: '#vue-trades',
24+
const app = Vue.createApp({
2725
components: {
28-
'trades': httpVueLoader('js/trades.vue')
29-
}
26+
'my-component': Vue.defineAsyncComponent(() => loadModule('./js/trades.vue', options))
27+
},
28+
template: `<my-component></my-component>`
3029
});
30+
31+
app.mount('#vue-trades');

web/static/js/trades.vue

+89-27
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<div class="card-header">
55
<h3 class="card-title">Positions</h3> <span class="text-muted float-right"><transition name="slide-fade" mode="out-in"><div :key="positionsUpdatedAt">{{ positionsUpdatedAt }}</div></transition></span>
66
</div>
7-
<!-- /.card-header -->
7+
88
<div class="card-body">
99
<table class="table table-bordered table-sm table-hover">
1010
<thead>
@@ -31,30 +31,30 @@
3131
</td>
3232
<td>
3333
<template v-if="!!position.currency">
34-
{{ position.currency|filter_price }}
34+
{{ formatPrice(position.currency) }}
3535
</template>
3636
<template v-if="!!position.currencyProfit">
37-
<span class="text-muted"> / {{ position.currencyProfit|filter_price }}</span>
37+
<span class="text-muted"> / {{ formatPrice(position.currencyProfit) }}</span>
3838
</template>
3939
</td>
4040
<td>
4141
<span v-if="typeof position.position.profit !== 'undefined'" v-bind:class="{ 'text-success': position.position.profit >= 0, 'text-danger': position.position.profit < 0 }">
42-
{{ position.position.profit|round(2) }} %
42+
{{ round(position.position.profit, 2) }} %
4343
</span>
4444
</td>
4545
<td>
4646
<template v-if="!!position.position.entry">
47-
{{ position.position.entry|filter_price }}
47+
{{ formatPrice(position.position.entry) }}
4848
</template>
4949
</td>
5050
<td>
5151
<template v-if="!!position.position.updatedAt">
52-
{{ position.position.updatedAt|date('d.m.y H:i') }}
52+
{{ date(position.position.updatedAt, 'd.m.y H:i') }}
5353
</template>
5454
</td>
5555
<td>
5656
<template v-if="!!position.position.createdAt">
57-
{{ position.position.createdAt|date('d.m.y H:i') }}
57+
{{ date(position.position.createdAt, 'd.m.y H:i') }}
5858
</template>
5959
</td>
6060
<td>
@@ -77,7 +77,7 @@
7777

7878
<div class="card">
7979
<div class="card-header">
80-
<h3 class="card-title">Orders</h3> <span class="text-muted float-right"><transition name="slide-fade" mode="out-in"><div :key="positionsUpdatedAt">{{ ordersUpdatedAt }}</div></transition></span>
80+
<h3 class="card-title">Orders</h3> <span class="text-muted float-right"><transition name="slide-fade" mode="out-in"><div :key="ordersUpdatedAt">{{ ordersUpdatedAt }}</div></transition></span>
8181
</div>
8282
<div class="card-body">
8383
<div class="table-responsive">
@@ -106,12 +106,12 @@
106106
<td><a target="blank" :href="'/tradingview/' + order.exchange + ':' + order.order.symbol">{{ order.order.symbol }}</a></td>
107107
<td>{{ order.order.type }}</td>
108108
<td>{{ order.order.id }}</td>
109-
<td>{{ order.order.price }}<span class="text-muted" v-if="order.percent_to_price" title="Percent to current price"> {{ order.percent_to_price|round(1) }} %</span></td>
109+
<td>{{ order.order.price }}<span class="text-muted" v-if="order.percent_to_price" title="Percent to current price"> {{ round(order.percent_to_price, 1) }} %</span></td>
110110
<td v-bind:class="{ 'text-success': order.order.amount > 0, 'text-danger': order.order.amount < 0 }">{{ order.order.amount }}</td>
111111
<td>{{ order.order.retry }}</td>
112112
<td>{{ order.order.ourId }}</td>
113-
<td>{{ order.order.createdAt|date('d.m.y H:i') }}</td>
114-
<td>{{ order.order.updatedAt|date('d.m.y H:i') }}</td>
113+
<td>{{ date(order.order.createdAt, 'd.m.y H:i') }}</td>
114+
<td>{{ date(order.order.updatedAt, 'd.m.y H:i') }}</td>
115115
<td>{{ order.order.status }}</td>
116116
<td>
117117
<i v-if="order.order.side === 'sell'" class="fas fa-chevron-circle-down text-danger" title="short"></i>
@@ -130,19 +130,22 @@
130130
</template>
131131

132132
<script>
133-
module.exports = {
134-
data: function() {
133+
import { ref } from 'vue'
134+
135+
export default {
136+
data() {
137+
const positionsUpdatedAt = ref(null);
138+
const ordersUpdatedAt = ref(null);
139+
const orders = ref([]);
140+
const positions = ref([]);
141+
135142
return {
136-
positions: [],
137-
orders: [],
138-
positionsUpdatedAt: '',
139-
ordersUpdatedAt: ''
143+
positionsUpdatedAt,
144+
ordersUpdatedAt,
145+
orders,
146+
positions
140147
}
141148
},
142-
created: function() {
143-
this.fetchPageAsJson();
144-
this.timer = setInterval(this.fetchPageAsJson, 3000);
145-
},
146149
methods: {
147150
async fetchPageAsJson() {
148151
const res = await fetch('/trades.json');
@@ -155,27 +158,86 @@ module.exports = {
155158
this.positions = data.positions || [];
156159
this.orders = data.orders || [];
157160
161+
this.positions = [
162+
{
163+
'currency': 12.12,
164+
'currencyProfit': 12,
165+
'exchange': 'binance',
166+
'position': {
167+
'type': 'long',
168+
'amount': 12.12,
169+
'profit': 12,
170+
'entry': 13.23,
171+
'updatedAt' : new Date(),
172+
'createdAt': new Date(),
173+
}
174+
}
175+
]
176+
177+
this.orders = [
178+
{
179+
'currency': 12.12,
180+
'currencyProfit': 12,
181+
'exchange': 'binance',
182+
'order': {
183+
'type': 'ggg',
184+
'id': 'aaa',
185+
'price': 12.12,
186+
'percent_to_price': 4,
187+
'ourId': '12',
188+
'entry': 13.23,
189+
'side': 'buy',
190+
'updatedAt': new Date(),
191+
'createdAt': new Date(),
192+
'status': 'aaaa',
193+
}
194+
}
195+
];
196+
158197
this.positionsUpdatedAt = new Date().toLocaleTimeString();
159198
this.ordersUpdatedAt = new Date().toLocaleTimeString();
160199
},
161-
cancelAutoUpdate() {
162-
clearInterval(this.timer);
200+
formatPrice(value) {
201+
if (parseFloat(value) < 1) {
202+
return Intl.NumberFormat('en-US', {
203+
useGrouping: false,
204+
minimumFractionDigits: 2,
205+
maximumFractionDigits: 6
206+
}).format(value);
207+
}
208+
209+
return Intl.NumberFormat('en-US', {
210+
useGrouping: false,
211+
minimumFractionDigits: 2,
212+
maximumFractionDigits: 2
213+
}).format(value);
214+
},
215+
round(value, decimalPlaces = 0) {
216+
return value.toFixed(decimalPlaces);
217+
},
218+
date(value) {
219+
return new Date(value).toLocaleString();
163220
}
164221
},
165-
beforeDestroy() {
166-
clearInterval(this.timer);
167-
},
222+
mounted() {
223+
this.fetchPageAsJson();
224+
this.timer = setInterval(this.fetchPageAsJson, 3000);
225+
}
168226
}
227+
169228
</script>
170229

171-
<style>
230+
<style scoped>
172231
.slide-fade-enter-active {
173232
transition: all .3s ease;
174233
}
234+
175235
.slide-fade-leave-active {
176236
transition: all .6s cubic-bezier(1.0, 0.5, 0.8, 1.0);
177237
}
238+
178239
.slide-fade-enter, .slide-fade-leave-to {
179240
opacity: 0.3;
180241
}
181242
</style>
243+

0 commit comments

Comments
 (0)