Skip to content

Commit

Permalink
Profit & Fees
Browse files Browse the repository at this point in the history
* API: Add profit calculation (buy/sell, sell/buy) to my_trades, profit won't be calculated unless there was a previous opposide order (buy profit on previos sell, sell profit on previous buy)
* Web UI: Add Fee and Profit column (Closes DeviaVir#1192)
* Normalize number formating for consistence and to remove clutter
  • Loading branch information
defkev committed Jan 23, 2018
1 parent e76bc0f commit 56f9e05
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 18 deletions.
4 changes: 3 additions & 1 deletion lib/engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,7 @@ module.exports = function container (get, set, clear) {
fee: fee,
price: price,
order_type: so.order_type || 'taker',
profit: s.last_sell_price && (price - s.last_sell_price) / s.last_sell_price,
cancel_after: so.cancel_after || 'day'
}
s.my_trades.push(my_trade)
Expand Down Expand Up @@ -658,7 +659,8 @@ module.exports = function container (get, set, clear) {
size: s.sell_order.orig_size,
fee: fee,
price: price,
order_type: so.order_type
order_type: so.order_type,
profit: s.last_buy_price && (price - s.last_buy_price) / s.last_buy_price
}
s.my_trades.push(my_trade)
if (so.stats) {
Expand Down
42 changes: 25 additions & 17 deletions templates/dashboard.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -73,20 +73,20 @@
<div class="col-lg-4 col-12">
<ul class="list-inline two-part">
<li class="text-left" style="display:inline"><i class="ti-arrow-up"></i> <span class="text-info">Price</span></li>
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-info"></i> <span><%= period.close %></span> <small><%= asset.toUpperCase() %></small></li>
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-info"></i> <span><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 7}).format(period.close) %></span> <small><%= asset.toUpperCase() %></small></li>
</ul>
</div>
<% if (typeof quote != "undefined") { %>
<div class="col-lg-4 col-12">
<ul class="list-inline two-part">
<li class="text-left" style="display:inline"><i class="ti-arrow-up"></i> <span class="text-success">ASK</span></li>
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-success"></i> <span><%= quote.ask %></span> <small><%= asset.toUpperCase() %></small></li>
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-success"></i> <span><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 7}).format(quote.ask) %></span> <small><%= asset.toUpperCase() %></small></li>
</ul>
</div>
<div class="col-lg-4 col-12">
<ul class="list-inline two-part">
<li class="text-left" style="display:inline"><i class="ti-arrow-up"></i> <span class="text-danger">BID</span></li>
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-danger"></i> <span><%= quote.bid %></span> <small><%= asset.toUpperCase() %></small></li>
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-danger"></i> <span><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 7}).format(quote.bid) %></span> <small><%= asset.toUpperCase() %></small></li>
</ul>
</div>
<% } %>
Expand All @@ -100,13 +100,13 @@
<div class="col-lg-6 col-12">
<ul class="list-inline two-part">
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-purple"></i> <span class="text-purple">Asset</span></li>
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-purple"></i> <span><%= balance.asset %></span> <small><%= asset.toUpperCase() %></small></li>
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-purple"></i> <span><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 8}).format(balance.asset) %></span> <small><%= asset.toUpperCase() %></small></li>
</ul>
</div>
<div class="col-lg-6 col-12">
<ul class="list-inline two-part">
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-purple"></i> <span class="text-purple">Currency</span></li>
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-purple"></i> <span><%= balance.currency %></span> <small><%= currency.toUpperCase() %></small></li>
<li class="text-left" style="display:inline"><i class="ti-arrow-up text-purple"></i> <span><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 8}).format(balance.currency) %></span> <small><%= currency.toUpperCase() %></small></li>
</ul>
</div>
</div>
Expand All @@ -118,9 +118,9 @@
<% if (typeof stats != "undefined") { %>
<div class="col-lg-3 col-sm-6 col-12">
<div class="white-box analytics-info">
<h3 class="box-title">Last balance (<%= new Intl.NumberFormat("en-US", {style: "percent", minimumSignificantDigits:2, maximumSignificantDigits: 10}).format( (parseFloat(stats.profit)/100)-(parseFloat(stats.buy_hold_profit)/100) ) %> vs buy hold)</h3>
<h3 class="box-title">Last balance (<%= new Intl.NumberFormat("en-US", {style: "percent", minimumFractionDigits: 2, maximumFractionDigits: 2}).format((parseFloat(stats.profit)/100)-(parseFloat(stats.buy_hold_profit)/100) ) %> vs buy hold)</h3>
<ul class="list-inline one-part">
<li class="text-right text-success"><i class="ti-arrow-up"></i> <span class="counter"><%= stats.tmp_balance %></span> <small><%= currency.toUpperCase() %></small></li>
<li class="text-right text-success"><i class="ti-arrow-up"></i> <span class="counter"><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 8, maximumFractionDigits: 8}).format(stats.tmp_balance) %></span> <small><%= currency.toUpperCase() %></small></li>
<li class="text-right text-<% if (parseFloat(stats.profit) < 0) { %>danger<% } else { %>success<% } %>""><i class="ti-arrow-up"></i> <span><%= stats.profit %></span> <small>of profit</small></li>
</ul>
</div>
Expand All @@ -129,7 +129,7 @@
<div class="white-box analytics-info">
<h3 class="box-title">Buy hold</h3>
<ul class="list-inline one-part">
<li class="text-right text-info"><i class="ti-arrow-up"></i> <span class="counter"><%= stats.buy_hold %></span> <small><%= currency.toUpperCase() %></small></li>
<li class="text-right text-info"><i class="ti-arrow-up"></i> <span class="counter"><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 8, maximumFractionDigits: 8}).format(stats.buy_hold) %></span> <small><%= currency.toUpperCase() %></small></li>
<li class="text-right text-<% if (parseFloat(stats.buy_hold_profit) < 0) { %>danger<% } else { %>success<% } %>""><i class="ti-arrow-up"></i> <span><%= stats.buy_hold_profit %></span> <small>of profit</small></li>
</ul>
</div>
Expand Down Expand Up @@ -310,44 +310,52 @@
<th>AMOUNT</th>
<th>PRICE</th>
<th>TOTAL</th>
<th>FEE</th>
<th>SLIPPAGE</th>
<th>DATE</th>
<th>EXECUTION TIME</th>
<th>PROFIT</th>
</tr>
</thead>
<tbody>
<% if (typeof buy_order != "undefined") { %>
<tr>
<td><span class='text-success'>BUY</span></td>
<td><%= buy_order.size %> <%= asset.toUpperCase() %></td>
<td><%= buy_order.price %> <%= currency.toUpperCase() %></td>
<td><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 8, maximumFractionDigits: 8}).format(buy_order.size) %> <%= asset.toUpperCase() %></td>
<td><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 2}).format(buy_order.price) %> <%= currency.toUpperCase() %></td>
<td>-</td>
<td>-</td>
<td>-</td>
<td><%= moment(buy_order.time).format('YYYY-MM-DD HH:mm:ss') %></td>
<td><span class='text-info'>Waiting</span></td>
<td>-</td>
</tr>
<% } %>
<% if (typeof sell_order != "undefined") { %>
<tr>
<td><span class='text-danger'>SELL</span></td>
<td><%= sell_order.size %> <%= asset.toUpperCase() %></td>
<td><%= sell_order.price %> <%= currency.toUpperCase() %></td>
<td><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 8, maximumFractionDigits: 8}).format(sell_order.size) %> <%= asset.toUpperCase() %></td>
<td><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 2}).format(sell_order.price) %> <%= currency.toUpperCase() %></td>
<td>-</td>
<td>-</td>
<td>-</td>
<td><%= moment(sell_order.time).format('YYYY-MM-DD HH:mm:ss') %></td>
<td><span class='text-info'>Waiting</span></td>
<td>-</td>
</tr>
<% } %>
<% if (my_trades) { %>
<% my_trades.sort(function(a,b){return a.time > b.time ? -1 : 1;}).forEach(function(trade){ %>
<tr>
<td><span class='text-<% if (trade.type == "buy") { %>success<% } else { %>danger<% } %>'><%= trade.type.toUpperCase() %></td>
<td><%= trade.size %> <%= asset.toUpperCase() %></td>
<td><%= trade.price %> <%= currency.toUpperCase() %></td>
<td><%= trade.size * trade.price %> <%= currency.toUpperCase() %></td>
<td><%= new Intl.NumberFormat("en-US", {style: "percent", maximumSignificantDigits: 4}).format(trade.slippage) %></td>
<td><span class='text-<% if (trade.type == "buy") { %>success<% } else { %>danger<% } %>'><%= trade.type.toUpperCase() %></span></td>
<td><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 8, maximumFractionDigits: 8}).format(trade.size) %> <%= asset.toUpperCase() %></td>
<td><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 2}).format(trade.price) %> <%= currency.toUpperCase() %></td>
<td><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 2}).format(trade.size * trade.price) %> <%= currency.toUpperCase() %></td>
<td><%= new Intl.NumberFormat("en-US", {useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 8}).format(trade.fee) %> <% if (trade.type == "buy") { %> <%= asset.toUpperCase() %> <% } else { %> <%= currency.toUpperCase() %> <% } %></td>
<td><span class="text-<% if (trade.slippage > 0) { %>danger<% } else { %>success<% } %>"><%= new Intl.NumberFormat("en-US", {style: "percent", useGrouping: false, minimumFractionDigits: 4, maximumFractionDigits: 4}).format(trade.slippage) %></span></td>
<td><%= moment(trade.time).format('YYYY-MM-DD HH:mm:ss') %></td>
<td><%= moment.duration(trade.execution_time).humanize() %></td>
<td><% if (trade.profit) { %><span class="text-<% if(trade.profit < 0) { %>danger<% } else { %>success<% } %>"><%= new Intl.NumberFormat("en-US", {style: "percent", useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 2}).format(trade.profit) %></span><% } else { %>-<% } %></td>
</tr>
<% }); %>
<% } %>
Expand Down

0 comments on commit 56f9e05

Please sign in to comment.