@barchart/portfolio-api-common 1.2.132 → 1.2.136
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/processing/PositionItem.js +72 -21
- package/package.json +1 -1
- package/test/SpecRunner.js +73 -22
|
@@ -5,7 +5,8 @@ const assert = require('@barchart/common-js/lang/assert'),
|
|
|
5
5
|
Event = require('@barchart/common-js/messaging/Event'),
|
|
6
6
|
is = require('@barchart/common-js/lang/is');
|
|
7
7
|
|
|
8
|
-
const InstrumentType = require('./../data/InstrumentType')
|
|
8
|
+
const InstrumentType = require('./../data/InstrumentType'),
|
|
9
|
+
PositionDirection = require('./../data/PositionDirection');
|
|
9
10
|
|
|
10
11
|
module.exports = (() => {
|
|
11
12
|
'use strict';
|
|
@@ -91,6 +92,8 @@ module.exports = (() => {
|
|
|
91
92
|
this._data.periodDivisorPrevious = null;
|
|
92
93
|
this._data.periodDivisorPrevious2 = null;
|
|
93
94
|
|
|
95
|
+
this._data.initiate = null;
|
|
96
|
+
|
|
94
97
|
this._data.newsExists = false;
|
|
95
98
|
this._data.fundamental = { };
|
|
96
99
|
this._data.locked = getIsLocked(position);
|
|
@@ -385,11 +388,14 @@ module.exports = (() => {
|
|
|
385
388
|
|
|
386
389
|
const previousSummary1 = getPreviousSummary(item.previousSummaries, 1);
|
|
387
390
|
const previousSummary2 = getPreviousSummary(item.previousSummaries, 2);
|
|
391
|
+
const previousSummary3 = getPreviousSummary(item.previousSummaries, 3);
|
|
388
392
|
|
|
389
393
|
const snapshot = getSnapshot(position, currentSummary, item._reporting);
|
|
390
394
|
|
|
391
395
|
const data = item._data;
|
|
392
396
|
|
|
397
|
+
data.initiate = guessInitiateDirection(item.previousSummaries, item.currentSummary);
|
|
398
|
+
|
|
393
399
|
data.quantity = snapshot.open;
|
|
394
400
|
data.previousPrice = position.previous || null;
|
|
395
401
|
|
|
@@ -416,13 +422,13 @@ module.exports = (() => {
|
|
|
416
422
|
data.periodRealized = currentSummary !== null ? currentSummary.period.realized : Decimal.ZERO;
|
|
417
423
|
data.periodUnrealized = currentSummary !== null ? currentSummary.period.unrealized : Decimal.ZERO;
|
|
418
424
|
|
|
419
|
-
data.periodGain = calculatePeriodGain(currentSummary);
|
|
420
|
-
data.periodGainPrevious = calculatePeriodGain(previousSummary1);
|
|
421
|
-
data.periodGainPrevious2 = calculatePeriodGain(previousSummary2);
|
|
425
|
+
data.periodGain = calculatePeriodGain(data.initiate, currentSummary, previousSummary1);
|
|
426
|
+
data.periodGainPrevious = calculatePeriodGain(data.initiate, previousSummary1, previousSummary2);
|
|
427
|
+
data.periodGainPrevious2 = calculatePeriodGain(data.initiate, previousSummary2, previousSummary3);
|
|
422
428
|
|
|
423
|
-
data.periodDivisor = calculatePeriodDivisor(currentSummary);
|
|
424
|
-
data.periodDivisorPrevious = calculatePeriodDivisor(previousSummary1);
|
|
425
|
-
data.periodDivisorPrevious2 = calculatePeriodDivisor(previousSummary2);
|
|
429
|
+
data.periodDivisor = calculatePeriodDivisor(data.initiate, currentSummary, previousSummary1);
|
|
430
|
+
data.periodDivisorPrevious = calculatePeriodDivisor(data.initiate, previousSummary1, previousSummary2);
|
|
431
|
+
data.periodDivisorPrevious2 = calculatePeriodDivisor(data.initiate, previousSummary2, previousSummary3);
|
|
426
432
|
|
|
427
433
|
if (snapshot.open.getIsZero()) {
|
|
428
434
|
data.basisPrice = Decimal.ZERO;
|
|
@@ -506,6 +512,7 @@ module.exports = (() => {
|
|
|
506
512
|
data.unrealizedTodayChange = unrealizedTodayChange;
|
|
507
513
|
|
|
508
514
|
const currentSummary = item.currentSummary;
|
|
515
|
+
const previousSummary = getPreviousSummary(item.previousSummaries, 1);
|
|
509
516
|
|
|
510
517
|
if (currentSummary && position.instrument.type !== InstrumentType.CASH) {
|
|
511
518
|
let priceToUse;
|
|
@@ -533,7 +540,7 @@ module.exports = (() => {
|
|
|
533
540
|
data.unrealized = unrealized;
|
|
534
541
|
data.unrealizedChange = unrealizedChange;
|
|
535
542
|
|
|
536
|
-
let periodGain = calculatePeriodGain(currentSummary, priceToUse);
|
|
543
|
+
let periodGain = calculatePeriodGain(data.initiate, currentSummary, previousSummary, priceToUse);
|
|
537
544
|
let periodGainChange;
|
|
538
545
|
|
|
539
546
|
if (data.periodGain !== null) {
|
|
@@ -558,23 +565,55 @@ module.exports = (() => {
|
|
|
558
565
|
}
|
|
559
566
|
}
|
|
560
567
|
|
|
561
|
-
function
|
|
568
|
+
function guessInitiateDirection(previousSummaries, currentSummary) {
|
|
569
|
+
const summaries = previousSummaries.concat(currentSummary);
|
|
570
|
+
|
|
571
|
+
const direction = summaries.reduce((accumulator, summary) => {
|
|
572
|
+
let returnRef = accumulator;
|
|
573
|
+
|
|
574
|
+
if (summary === null && summary.start.direction !== PositionDirection.EVEN) {
|
|
575
|
+
returnRef = summary.start.direction;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
if (summary === null && summary.start.direction !== PositionDirection.EVEN) {
|
|
579
|
+
returnRef = summary.end.direction;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
return returnRef;
|
|
583
|
+
}, null);
|
|
584
|
+
|
|
585
|
+
return direction || PositionDirection.LONG;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
function calculatePeriodGain(direction, currentSummary, previousSummary, overridePrice) {
|
|
562
589
|
let returnRef;
|
|
563
590
|
|
|
564
591
|
if (currentSummary) {
|
|
565
|
-
|
|
592
|
+
if (direction === PositionDirection.LONG) {
|
|
593
|
+
let startValue;
|
|
566
594
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
595
|
+
if (previousSummary) {
|
|
596
|
+
startValue = previousSummary.end.value;
|
|
597
|
+
} else {
|
|
598
|
+
startValue = Decimal.ZERO;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
let endValue;
|
|
572
602
|
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
603
|
+
if (overridePrice) {
|
|
604
|
+
endValue = currentSummary.end.open.multiply(overridePrice);
|
|
605
|
+
} else {
|
|
606
|
+
endValue = currentSummary.end.value;
|
|
607
|
+
}
|
|
576
608
|
|
|
577
|
-
|
|
609
|
+
const valueChange = endValue.subtract(startValue);
|
|
610
|
+
const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys.opposite());
|
|
611
|
+
const incomeChange = currentSummary.period.income;
|
|
612
|
+
|
|
613
|
+
returnRef = valueChange.add(tradeChange).add(incomeChange);
|
|
614
|
+
} else {
|
|
615
|
+
returnRef = Decimal.ZERO;
|
|
616
|
+
}
|
|
578
617
|
} else {
|
|
579
618
|
returnRef = Decimal.ZERO;
|
|
580
619
|
}
|
|
@@ -582,11 +621,23 @@ module.exports = (() => {
|
|
|
582
621
|
return returnRef;
|
|
583
622
|
}
|
|
584
623
|
|
|
585
|
-
function calculatePeriodDivisor(currentSummary) {
|
|
624
|
+
function calculatePeriodDivisor(direction, currentSummary, previousSummary) {
|
|
586
625
|
let returnRef;
|
|
587
626
|
|
|
588
627
|
if (currentSummary) {
|
|
589
|
-
|
|
628
|
+
if (direction === PositionDirection.LONG) {
|
|
629
|
+
let startValue;
|
|
630
|
+
|
|
631
|
+
if (previousSummary) {
|
|
632
|
+
startValue = previousSummary.end.value;
|
|
633
|
+
} else {
|
|
634
|
+
startValue = Decimal.ZERO;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
returnRef = startValue.add(currentSummary.period.buys.opposite());
|
|
638
|
+
} else {
|
|
639
|
+
returnRef = Decimal.ZERO;
|
|
640
|
+
}
|
|
590
641
|
} else {
|
|
591
642
|
returnRef = Decimal.ZERO;
|
|
592
643
|
}
|
package/package.json
CHANGED
package/test/SpecRunner.js
CHANGED
|
@@ -3511,7 +3511,8 @@ const assert = require('@barchart/common-js/lang/assert'),
|
|
|
3511
3511
|
Event = require('@barchart/common-js/messaging/Event'),
|
|
3512
3512
|
is = require('@barchart/common-js/lang/is');
|
|
3513
3513
|
|
|
3514
|
-
const InstrumentType = require('./../data/InstrumentType')
|
|
3514
|
+
const InstrumentType = require('./../data/InstrumentType'),
|
|
3515
|
+
PositionDirection = require('./../data/PositionDirection');
|
|
3515
3516
|
|
|
3516
3517
|
module.exports = (() => {
|
|
3517
3518
|
'use strict';
|
|
@@ -3597,6 +3598,8 @@ module.exports = (() => {
|
|
|
3597
3598
|
this._data.periodDivisorPrevious = null;
|
|
3598
3599
|
this._data.periodDivisorPrevious2 = null;
|
|
3599
3600
|
|
|
3601
|
+
this._data.initiate = null;
|
|
3602
|
+
|
|
3600
3603
|
this._data.newsExists = false;
|
|
3601
3604
|
this._data.fundamental = { };
|
|
3602
3605
|
this._data.locked = getIsLocked(position);
|
|
@@ -3891,11 +3894,14 @@ module.exports = (() => {
|
|
|
3891
3894
|
|
|
3892
3895
|
const previousSummary1 = getPreviousSummary(item.previousSummaries, 1);
|
|
3893
3896
|
const previousSummary2 = getPreviousSummary(item.previousSummaries, 2);
|
|
3897
|
+
const previousSummary3 = getPreviousSummary(item.previousSummaries, 3);
|
|
3894
3898
|
|
|
3895
3899
|
const snapshot = getSnapshot(position, currentSummary, item._reporting);
|
|
3896
3900
|
|
|
3897
3901
|
const data = item._data;
|
|
3898
3902
|
|
|
3903
|
+
data.initiate = guessInitiateDirection(item.previousSummaries, item.currentSummary);
|
|
3904
|
+
|
|
3899
3905
|
data.quantity = snapshot.open;
|
|
3900
3906
|
data.previousPrice = position.previous || null;
|
|
3901
3907
|
|
|
@@ -3922,13 +3928,13 @@ module.exports = (() => {
|
|
|
3922
3928
|
data.periodRealized = currentSummary !== null ? currentSummary.period.realized : Decimal.ZERO;
|
|
3923
3929
|
data.periodUnrealized = currentSummary !== null ? currentSummary.period.unrealized : Decimal.ZERO;
|
|
3924
3930
|
|
|
3925
|
-
data.periodGain = calculatePeriodGain(currentSummary);
|
|
3926
|
-
data.periodGainPrevious = calculatePeriodGain(previousSummary1);
|
|
3927
|
-
data.periodGainPrevious2 = calculatePeriodGain(previousSummary2);
|
|
3931
|
+
data.periodGain = calculatePeriodGain(data.initiate, currentSummary, previousSummary1);
|
|
3932
|
+
data.periodGainPrevious = calculatePeriodGain(data.initiate, previousSummary1, previousSummary2);
|
|
3933
|
+
data.periodGainPrevious2 = calculatePeriodGain(data.initiate, previousSummary2, previousSummary3);
|
|
3928
3934
|
|
|
3929
|
-
data.periodDivisor = calculatePeriodDivisor(currentSummary);
|
|
3930
|
-
data.periodDivisorPrevious = calculatePeriodDivisor(previousSummary1);
|
|
3931
|
-
data.periodDivisorPrevious2 = calculatePeriodDivisor(previousSummary2);
|
|
3935
|
+
data.periodDivisor = calculatePeriodDivisor(data.initiate, currentSummary, previousSummary1);
|
|
3936
|
+
data.periodDivisorPrevious = calculatePeriodDivisor(data.initiate, previousSummary1, previousSummary2);
|
|
3937
|
+
data.periodDivisorPrevious2 = calculatePeriodDivisor(data.initiate, previousSummary2, previousSummary3);
|
|
3932
3938
|
|
|
3933
3939
|
if (snapshot.open.getIsZero()) {
|
|
3934
3940
|
data.basisPrice = Decimal.ZERO;
|
|
@@ -4012,6 +4018,7 @@ module.exports = (() => {
|
|
|
4012
4018
|
data.unrealizedTodayChange = unrealizedTodayChange;
|
|
4013
4019
|
|
|
4014
4020
|
const currentSummary = item.currentSummary;
|
|
4021
|
+
const previousSummary = getPreviousSummary(item.previousSummaries, 1);
|
|
4015
4022
|
|
|
4016
4023
|
if (currentSummary && position.instrument.type !== InstrumentType.CASH) {
|
|
4017
4024
|
let priceToUse;
|
|
@@ -4039,7 +4046,7 @@ module.exports = (() => {
|
|
|
4039
4046
|
data.unrealized = unrealized;
|
|
4040
4047
|
data.unrealizedChange = unrealizedChange;
|
|
4041
4048
|
|
|
4042
|
-
let periodGain = calculatePeriodGain(currentSummary, priceToUse);
|
|
4049
|
+
let periodGain = calculatePeriodGain(data.initiate, currentSummary, previousSummary, priceToUse);
|
|
4043
4050
|
let periodGainChange;
|
|
4044
4051
|
|
|
4045
4052
|
if (data.periodGain !== null) {
|
|
@@ -4064,23 +4071,55 @@ module.exports = (() => {
|
|
|
4064
4071
|
}
|
|
4065
4072
|
}
|
|
4066
4073
|
|
|
4067
|
-
function
|
|
4074
|
+
function guessInitiateDirection(previousSummaries, currentSummary) {
|
|
4075
|
+
const summaries = previousSummaries.concat(currentSummary);
|
|
4076
|
+
|
|
4077
|
+
const direction = summaries.reduce((accumulator, summary) => {
|
|
4078
|
+
let returnRef = accumulator;
|
|
4079
|
+
|
|
4080
|
+
if (summary === null && summary.start.direction !== PositionDirection.EVEN) {
|
|
4081
|
+
returnRef = summary.start.direction;
|
|
4082
|
+
}
|
|
4083
|
+
|
|
4084
|
+
if (summary === null && summary.start.direction !== PositionDirection.EVEN) {
|
|
4085
|
+
returnRef = summary.end.direction;
|
|
4086
|
+
}
|
|
4087
|
+
|
|
4088
|
+
return returnRef;
|
|
4089
|
+
}, null);
|
|
4090
|
+
|
|
4091
|
+
return direction || PositionDirection.LONG;
|
|
4092
|
+
}
|
|
4093
|
+
|
|
4094
|
+
function calculatePeriodGain(direction, currentSummary, previousSummary, overridePrice) {
|
|
4068
4095
|
let returnRef;
|
|
4069
4096
|
|
|
4070
4097
|
if (currentSummary) {
|
|
4071
|
-
|
|
4098
|
+
if (direction === PositionDirection.LONG) {
|
|
4099
|
+
let startValue;
|
|
4072
4100
|
|
|
4073
|
-
|
|
4074
|
-
|
|
4075
|
-
|
|
4076
|
-
|
|
4077
|
-
|
|
4101
|
+
if (previousSummary) {
|
|
4102
|
+
startValue = previousSummary.end.value;
|
|
4103
|
+
} else {
|
|
4104
|
+
startValue = Decimal.ZERO;
|
|
4105
|
+
}
|
|
4106
|
+
|
|
4107
|
+
let endValue;
|
|
4078
4108
|
|
|
4079
|
-
|
|
4080
|
-
|
|
4081
|
-
|
|
4109
|
+
if (overridePrice) {
|
|
4110
|
+
endValue = currentSummary.end.open.multiply(overridePrice);
|
|
4111
|
+
} else {
|
|
4112
|
+
endValue = currentSummary.end.value;
|
|
4113
|
+
}
|
|
4082
4114
|
|
|
4083
|
-
|
|
4115
|
+
const valueChange = endValue.subtract(startValue);
|
|
4116
|
+
const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys.opposite());
|
|
4117
|
+
const incomeChange = currentSummary.period.income;
|
|
4118
|
+
|
|
4119
|
+
returnRef = valueChange.add(tradeChange).add(incomeChange);
|
|
4120
|
+
} else {
|
|
4121
|
+
returnRef = Decimal.ZERO;
|
|
4122
|
+
}
|
|
4084
4123
|
} else {
|
|
4085
4124
|
returnRef = Decimal.ZERO;
|
|
4086
4125
|
}
|
|
@@ -4088,11 +4127,23 @@ module.exports = (() => {
|
|
|
4088
4127
|
return returnRef;
|
|
4089
4128
|
}
|
|
4090
4129
|
|
|
4091
|
-
function calculatePeriodDivisor(currentSummary) {
|
|
4130
|
+
function calculatePeriodDivisor(direction, currentSummary, previousSummary) {
|
|
4092
4131
|
let returnRef;
|
|
4093
4132
|
|
|
4094
4133
|
if (currentSummary) {
|
|
4095
|
-
|
|
4134
|
+
if (direction === PositionDirection.LONG) {
|
|
4135
|
+
let startValue;
|
|
4136
|
+
|
|
4137
|
+
if (previousSummary) {
|
|
4138
|
+
startValue = previousSummary.end.value;
|
|
4139
|
+
} else {
|
|
4140
|
+
startValue = Decimal.ZERO;
|
|
4141
|
+
}
|
|
4142
|
+
|
|
4143
|
+
returnRef = startValue.add(currentSummary.period.buys.opposite());
|
|
4144
|
+
} else {
|
|
4145
|
+
returnRef = Decimal.ZERO;
|
|
4146
|
+
}
|
|
4096
4147
|
} else {
|
|
4097
4148
|
returnRef = Decimal.ZERO;
|
|
4098
4149
|
}
|
|
@@ -4145,7 +4196,7 @@ module.exports = (() => {
|
|
|
4145
4196
|
return PositionItem;
|
|
4146
4197
|
})();
|
|
4147
4198
|
|
|
4148
|
-
},{"./../data/InstrumentType":1,"@barchart/common-js/lang/Currency":20,"@barchart/common-js/lang/Decimal":22,"@barchart/common-js/lang/Disposable":23,"@barchart/common-js/lang/assert":29,"@barchart/common-js/lang/is":33,"@barchart/common-js/messaging/Event":35}],9:[function(require,module,exports){
|
|
4199
|
+
},{"./../data/InstrumentType":1,"./../data/PositionDirection":2,"@barchart/common-js/lang/Currency":20,"@barchart/common-js/lang/Decimal":22,"@barchart/common-js/lang/Disposable":23,"@barchart/common-js/lang/assert":29,"@barchart/common-js/lang/is":33,"@barchart/common-js/messaging/Event":35}],9:[function(require,module,exports){
|
|
4149
4200
|
const assert = require('@barchart/common-js/lang/assert'),
|
|
4150
4201
|
Currency = require('@barchart/common-js/lang/Currency'),
|
|
4151
4202
|
is = require('@barchart/common-js/lang/is');
|