Skip to content

Commit fbd0bbd

Browse files
authored
Merge pull request #1023 from daniila/dca_orders_on_chart
Dca orders on chart
2 parents 3a65b48 + 445837a commit fbd0bbd

File tree

1 file changed

+70
-35
lines changed

1 file changed

+70
-35
lines changed

src/shared/charts/tradeChartData.ts

+70-35
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,34 @@
1-
import { formatPercent } from '@/shared/formatters';
1+
import { formatPercent, formatPriceCurrency } from '@/shared/formatters';
22
import { roundTimeframe } from '@/shared/timemath';
3-
import { PairHistory, Trade } from '@/types';
3+
import { Order, PairHistory, Trade } from '@/types';
44

55
function buildToolTip(trade: Trade, side: string): string {
66
return `${trade.is_short ? 'Short' : 'Long'} ${side} ${formatPercent(
77
trade.profit_ratio,
88
)} \nEnter-tag: ${trade.enter_tag ?? ''} \nExit-Tag: ${trade.exit_reason ?? ''}`;
99
}
10+
11+
function buildAdjustmentToolTip(trade: Trade, order: Order): string {
12+
return `${trade.is_short ? 'Short' : 'Long'} adjustment
13+
${order.ft_order_side === 'buy' ? '+' : '-'}${formatPriceCurrency(
14+
order.cost,
15+
trade.quote_currency ?? '',
16+
)}\nEnter-tag: ${trade.enter_tag ?? ''}`;
17+
}
18+
1019
// const ENTRY_SYMB = 'circle';
1120
// const EXIT_SYMB = 'rect';
1221

13-
const ENTRY_SYMB =
22+
const ADJUSTMENT_SYMBOL =
1423
'path://m 52.444161,104.1909 8.386653,25.34314 8.386651,25.34313 -16.731501,0.0422 -16.731501,0.0422 8.344848,-25.38539 z m 0.08656,-48.368126 8.386652,25.343139 8.386652,25.343137 -16.731501,0.0422 -16.731502,0.0422 8.344848,-25.385389 z';
15-
const EXIT_SYMB =
24+
const OPEN_CLOSE_SYMBOL =
1625
'path://m 102.20764,19.885384 h 24.1454 v 41.928829 h -24.1454 z m 12.17344,36.423813 8.38665,25.343139 8.38666,25.343134 -16.7315,0.0422 -16.731507,0.0422 8.344847,-25.385386 z';
1726

27+
const SHORT_COLOR = '#AD00FF';
28+
//const SHORT_ADJUST_COLOR = '#CE3BFF';
29+
const LONG_COLOR = '#0066FF';
30+
//const LONG_ADJUST_COLOR = '#00A9FF';
31+
1832
/** Return trade entries for charting */
1933
export function getTradeEntries(dataset: PairHistory, filteredTrades: Trade[]) {
2034
const tradeData: (number | string)[][] = [];
@@ -26,43 +40,64 @@ export function getTradeEntries(dataset: PairHistory, filteredTrades: Trade[]) {
2640
// 4: color
2741
// 5: label
2842
// 6: tooltip
29-
3043
for (let i = 0, len = filteredTrades.length; i < len; i += 1) {
3144
const trade: Trade = filteredTrades[i];
3245
if (
3346
trade.open_timestamp >= dataset.data_start_ts &&
3447
trade.open_timestamp <= dataset.data_stop_ts
3548
) {
36-
// Trade entry
37-
tradeData.push([
38-
roundTimeframe(dataset.timeframe_ms ?? 0, trade.open_timestamp),
39-
trade.open_rate,
40-
ENTRY_SYMB,
41-
trade.is_short ? 180 : 0,
42-
// (trade.profit_abs ?? 0) > 0 ? '#31e04b' : '#fc0505',
43-
trade.is_short ? '#AD00FF' : '#0066FF',
44-
'',
45-
// trade.profit_abs,
46-
buildToolTip(trade, 'entry'),
47-
]);
48-
}
49-
if (
50-
trade.close_timestamp !== undefined &&
51-
trade.close_timestamp <= dataset.data_stop_ts &&
52-
trade.close_timestamp > dataset.data_start_ts
53-
) {
54-
if (trade.close_date !== undefined && trade.close_rate !== undefined) {
55-
// Trade exit
56-
tradeData.push([
57-
roundTimeframe(dataset.timeframe_ms ?? 0, trade.close_timestamp),
58-
trade.close_rate,
59-
EXIT_SYMB,
60-
trade.is_short ? 180 : 0,
61-
trade.is_short ? '#AD00FF' : '#0066FF',
62-
// (trade.profit_abs ?? 0) > 0 ? '#31e04b' : '#fc0505',
63-
formatPercent(trade.profit_ratio, 2),
64-
buildToolTip(trade, 'exit'),
65-
]);
49+
if (trade.orders) {
50+
for (let i = 0; i < trade.orders.length; i++) {
51+
const order: Order = trade.orders[i];
52+
if (
53+
order.order_filled_timestamp &&
54+
order.order_filled_timestamp <= dataset.data_stop_ts &&
55+
order.order_filled_timestamp > dataset.data_start_ts
56+
) {
57+
// Trade entry
58+
if (i === 0) {
59+
tradeData.push([
60+
roundTimeframe(dataset.timeframe_ms ?? 0, trade.open_timestamp),
61+
order.safe_price,
62+
OPEN_CLOSE_SYMBOL,
63+
order.ft_order_side == 'sell' ? 180 : 0,
64+
trade.is_short ? SHORT_COLOR : LONG_COLOR,
65+
trade.is_short ? 'Short' : 'Long',
66+
buildToolTip(trade, 'entry'),
67+
]);
68+
// Trade exit
69+
} else if (i === trade.orders.length - 1 && trade.close_timestamp) {
70+
if (
71+
trade.close_timestamp <= dataset.data_stop_ts &&
72+
trade.close_timestamp > dataset.data_start_ts &&
73+
trade.is_open === false
74+
) {
75+
tradeData.push([
76+
roundTimeframe(dataset.timeframe_ms ?? 0, trade.close_timestamp),
77+
order.safe_price,
78+
OPEN_CLOSE_SYMBOL,
79+
trade.is_short ? 0 : 180,
80+
trade.is_short ? SHORT_COLOR : LONG_COLOR,
81+
// (trade.profit_abs ?? 0) > 0 ? '#31e04b' : '#fc0505',
82+
formatPercent(trade.profit_ratio, 2),
83+
buildToolTip(trade, 'exit'),
84+
]);
85+
}
86+
}
87+
// Position adjustment
88+
else {
89+
tradeData.push([
90+
roundTimeframe(dataset.timeframe_ms ?? 0, order.order_filled_timestamp),
91+
order.safe_price,
92+
ADJUSTMENT_SYMBOL,
93+
order.ft_order_side == 'sell' ? 180 : 0,
94+
trade.is_short ? SHORT_COLOR : LONG_COLOR,
95+
'',
96+
buildAdjustmentToolTip(trade, order),
97+
]);
98+
}
99+
}
100+
}
66101
}
67102
}
68103
}

0 commit comments

Comments
 (0)