1
- import { formatPercent } from '@/shared/formatters' ;
1
+ import { formatPercent , formatPriceCurrency } from '@/shared/formatters' ;
2
2
import { roundTimeframe } from '@/shared/timemath' ;
3
- import { PairHistory , Trade } from '@/types' ;
3
+ import { Order , PairHistory , Trade } from '@/types' ;
4
4
5
5
function buildToolTip ( trade : Trade , side : string ) : string {
6
6
return `${ trade . is_short ? 'Short' : 'Long' } ${ side } ${ formatPercent (
7
7
trade . profit_ratio ,
8
8
) } \nEnter-tag: ${ trade . enter_tag ?? '' } \nExit-Tag: ${ trade . exit_reason ?? '' } `;
9
9
}
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
+
10
19
// const ENTRY_SYMB = 'circle';
11
20
// const EXIT_SYMB = 'rect';
12
21
13
- const ENTRY_SYMB =
22
+ const ADJUSTMENT_SYMBOL =
14
23
'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 =
16
25
'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' ;
17
26
27
+ const SHORT_COLOR = '#AD00FF' ;
28
+ //const SHORT_ADJUST_COLOR = '#CE3BFF';
29
+ const LONG_COLOR = '#0066FF' ;
30
+ //const LONG_ADJUST_COLOR = '#00A9FF';
31
+
18
32
/** Return trade entries for charting */
19
33
export function getTradeEntries ( dataset : PairHistory , filteredTrades : Trade [ ] ) {
20
34
const tradeData : ( number | string ) [ ] [ ] = [ ] ;
@@ -26,43 +40,64 @@ export function getTradeEntries(dataset: PairHistory, filteredTrades: Trade[]) {
26
40
// 4: color
27
41
// 5: label
28
42
// 6: tooltip
29
-
30
43
for ( let i = 0 , len = filteredTrades . length ; i < len ; i += 1 ) {
31
44
const trade : Trade = filteredTrades [ i ] ;
32
45
if (
33
46
trade . open_timestamp >= dataset . data_start_ts &&
34
47
trade . open_timestamp <= dataset . data_stop_ts
35
48
) {
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
+ }
66
101
}
67
102
}
68
103
}
0 commit comments