@barchart/portfolio-api-common 1.2.135 → 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 +65 -32
- package/package.json +1 -1
- package/test/SpecRunner.js +66 -33
|
@@ -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);
|
|
@@ -391,6 +394,8 @@ module.exports = (() => {
|
|
|
391
394
|
|
|
392
395
|
const data = item._data;
|
|
393
396
|
|
|
397
|
+
data.initiate = guessInitiateDirection(item.previousSummaries, item.currentSummary);
|
|
398
|
+
|
|
394
399
|
data.quantity = snapshot.open;
|
|
395
400
|
data.previousPrice = position.previous || null;
|
|
396
401
|
|
|
@@ -417,13 +422,13 @@ module.exports = (() => {
|
|
|
417
422
|
data.periodRealized = currentSummary !== null ? currentSummary.period.realized : Decimal.ZERO;
|
|
418
423
|
data.periodUnrealized = currentSummary !== null ? currentSummary.period.unrealized : Decimal.ZERO;
|
|
419
424
|
|
|
420
|
-
data.periodGain = calculatePeriodGain(currentSummary, previousSummary1);
|
|
421
|
-
data.periodGainPrevious = calculatePeriodGain(previousSummary1, previousSummary2);
|
|
422
|
-
data.periodGainPrevious2 = calculatePeriodGain(previousSummary2, previousSummary3);
|
|
425
|
+
data.periodGain = calculatePeriodGain(data.initiate, currentSummary, previousSummary1);
|
|
426
|
+
data.periodGainPrevious = calculatePeriodGain(data.initiate, previousSummary1, previousSummary2);
|
|
427
|
+
data.periodGainPrevious2 = calculatePeriodGain(data.initiate, previousSummary2, previousSummary3);
|
|
423
428
|
|
|
424
|
-
data.periodDivisor = calculatePeriodDivisor(currentSummary, previousSummary1);
|
|
425
|
-
data.periodDivisorPrevious = calculatePeriodDivisor(previousSummary1, previousSummary2);
|
|
426
|
-
data.periodDivisorPrevious2 = calculatePeriodDivisor(previousSummary2, previousSummary3);
|
|
429
|
+
data.periodDivisor = calculatePeriodDivisor(data.initiate, currentSummary, previousSummary1);
|
|
430
|
+
data.periodDivisorPrevious = calculatePeriodDivisor(data.initiate, previousSummary1, previousSummary2);
|
|
431
|
+
data.periodDivisorPrevious2 = calculatePeriodDivisor(data.initiate, previousSummary2, previousSummary3);
|
|
427
432
|
|
|
428
433
|
if (snapshot.open.getIsZero()) {
|
|
429
434
|
data.basisPrice = Decimal.ZERO;
|
|
@@ -535,7 +540,7 @@ module.exports = (() => {
|
|
|
535
540
|
data.unrealized = unrealized;
|
|
536
541
|
data.unrealizedChange = unrealizedChange;
|
|
537
542
|
|
|
538
|
-
let periodGain = calculatePeriodGain(currentSummary, previousSummary, priceToUse);
|
|
543
|
+
let periodGain = calculatePeriodGain(data.initiate, currentSummary, previousSummary, priceToUse);
|
|
539
544
|
let periodGainChange;
|
|
540
545
|
|
|
541
546
|
if (data.periodGain !== null) {
|
|
@@ -560,31 +565,55 @@ module.exports = (() => {
|
|
|
560
565
|
}
|
|
561
566
|
}
|
|
562
567
|
|
|
563
|
-
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) {
|
|
564
589
|
let returnRef;
|
|
565
590
|
|
|
566
591
|
if (currentSummary) {
|
|
567
|
-
|
|
592
|
+
if (direction === PositionDirection.LONG) {
|
|
593
|
+
let startValue;
|
|
568
594
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
595
|
+
if (previousSummary) {
|
|
596
|
+
startValue = previousSummary.end.value;
|
|
597
|
+
} else {
|
|
598
|
+
startValue = Decimal.ZERO;
|
|
599
|
+
}
|
|
574
600
|
|
|
575
|
-
|
|
601
|
+
let endValue;
|
|
576
602
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
603
|
+
if (overridePrice) {
|
|
604
|
+
endValue = currentSummary.end.open.multiply(overridePrice);
|
|
605
|
+
} else {
|
|
606
|
+
endValue = currentSummary.end.value;
|
|
607
|
+
}
|
|
582
608
|
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
609
|
+
const valueChange = endValue.subtract(startValue);
|
|
610
|
+
const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys.opposite());
|
|
611
|
+
const incomeChange = currentSummary.period.income;
|
|
586
612
|
|
|
587
|
-
|
|
613
|
+
returnRef = valueChange.add(tradeChange).add(incomeChange);
|
|
614
|
+
} else {
|
|
615
|
+
returnRef = Decimal.ZERO;
|
|
616
|
+
}
|
|
588
617
|
} else {
|
|
589
618
|
returnRef = Decimal.ZERO;
|
|
590
619
|
}
|
|
@@ -592,19 +621,23 @@ module.exports = (() => {
|
|
|
592
621
|
return returnRef;
|
|
593
622
|
}
|
|
594
623
|
|
|
595
|
-
function calculatePeriodDivisor(currentSummary, previousSummary) {
|
|
624
|
+
function calculatePeriodDivisor(direction, currentSummary, previousSummary) {
|
|
596
625
|
let returnRef;
|
|
597
626
|
|
|
598
627
|
if (currentSummary) {
|
|
599
|
-
|
|
628
|
+
if (direction === PositionDirection.LONG) {
|
|
629
|
+
let startValue;
|
|
630
|
+
|
|
631
|
+
if (previousSummary) {
|
|
632
|
+
startValue = previousSummary.end.value;
|
|
633
|
+
} else {
|
|
634
|
+
startValue = Decimal.ZERO;
|
|
635
|
+
}
|
|
600
636
|
|
|
601
|
-
|
|
602
|
-
startValue = previousSummary.end.value;
|
|
637
|
+
returnRef = startValue.add(currentSummary.period.buys.opposite());
|
|
603
638
|
} else {
|
|
604
|
-
|
|
639
|
+
returnRef = Decimal.ZERO;
|
|
605
640
|
}
|
|
606
|
-
|
|
607
|
-
returnRef = startValue.add(currentSummary.period.buys.opposite());
|
|
608
641
|
} else {
|
|
609
642
|
returnRef = Decimal.ZERO;
|
|
610
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);
|
|
@@ -3897,6 +3900,8 @@ module.exports = (() => {
|
|
|
3897
3900
|
|
|
3898
3901
|
const data = item._data;
|
|
3899
3902
|
|
|
3903
|
+
data.initiate = guessInitiateDirection(item.previousSummaries, item.currentSummary);
|
|
3904
|
+
|
|
3900
3905
|
data.quantity = snapshot.open;
|
|
3901
3906
|
data.previousPrice = position.previous || null;
|
|
3902
3907
|
|
|
@@ -3923,13 +3928,13 @@ module.exports = (() => {
|
|
|
3923
3928
|
data.periodRealized = currentSummary !== null ? currentSummary.period.realized : Decimal.ZERO;
|
|
3924
3929
|
data.periodUnrealized = currentSummary !== null ? currentSummary.period.unrealized : Decimal.ZERO;
|
|
3925
3930
|
|
|
3926
|
-
data.periodGain = calculatePeriodGain(currentSummary, previousSummary1);
|
|
3927
|
-
data.periodGainPrevious = calculatePeriodGain(previousSummary1, previousSummary2);
|
|
3928
|
-
data.periodGainPrevious2 = calculatePeriodGain(previousSummary2, previousSummary3);
|
|
3931
|
+
data.periodGain = calculatePeriodGain(data.initiate, currentSummary, previousSummary1);
|
|
3932
|
+
data.periodGainPrevious = calculatePeriodGain(data.initiate, previousSummary1, previousSummary2);
|
|
3933
|
+
data.periodGainPrevious2 = calculatePeriodGain(data.initiate, previousSummary2, previousSummary3);
|
|
3929
3934
|
|
|
3930
|
-
data.periodDivisor = calculatePeriodDivisor(currentSummary, previousSummary1);
|
|
3931
|
-
data.periodDivisorPrevious = calculatePeriodDivisor(previousSummary1, previousSummary2);
|
|
3932
|
-
data.periodDivisorPrevious2 = calculatePeriodDivisor(previousSummary2, previousSummary3);
|
|
3935
|
+
data.periodDivisor = calculatePeriodDivisor(data.initiate, currentSummary, previousSummary1);
|
|
3936
|
+
data.periodDivisorPrevious = calculatePeriodDivisor(data.initiate, previousSummary1, previousSummary2);
|
|
3937
|
+
data.periodDivisorPrevious2 = calculatePeriodDivisor(data.initiate, previousSummary2, previousSummary3);
|
|
3933
3938
|
|
|
3934
3939
|
if (snapshot.open.getIsZero()) {
|
|
3935
3940
|
data.basisPrice = Decimal.ZERO;
|
|
@@ -4041,7 +4046,7 @@ module.exports = (() => {
|
|
|
4041
4046
|
data.unrealized = unrealized;
|
|
4042
4047
|
data.unrealizedChange = unrealizedChange;
|
|
4043
4048
|
|
|
4044
|
-
let periodGain = calculatePeriodGain(currentSummary, previousSummary, priceToUse);
|
|
4049
|
+
let periodGain = calculatePeriodGain(data.initiate, currentSummary, previousSummary, priceToUse);
|
|
4045
4050
|
let periodGainChange;
|
|
4046
4051
|
|
|
4047
4052
|
if (data.periodGain !== null) {
|
|
@@ -4066,31 +4071,55 @@ module.exports = (() => {
|
|
|
4066
4071
|
}
|
|
4067
4072
|
}
|
|
4068
4073
|
|
|
4069
|
-
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) {
|
|
4070
4095
|
let returnRef;
|
|
4071
4096
|
|
|
4072
4097
|
if (currentSummary) {
|
|
4073
|
-
|
|
4098
|
+
if (direction === PositionDirection.LONG) {
|
|
4099
|
+
let startValue;
|
|
4074
4100
|
|
|
4075
|
-
|
|
4076
|
-
|
|
4077
|
-
|
|
4078
|
-
|
|
4079
|
-
|
|
4101
|
+
if (previousSummary) {
|
|
4102
|
+
startValue = previousSummary.end.value;
|
|
4103
|
+
} else {
|
|
4104
|
+
startValue = Decimal.ZERO;
|
|
4105
|
+
}
|
|
4080
4106
|
|
|
4081
|
-
|
|
4107
|
+
let endValue;
|
|
4082
4108
|
|
|
4083
|
-
|
|
4084
|
-
|
|
4085
|
-
|
|
4086
|
-
|
|
4087
|
-
|
|
4109
|
+
if (overridePrice) {
|
|
4110
|
+
endValue = currentSummary.end.open.multiply(overridePrice);
|
|
4111
|
+
} else {
|
|
4112
|
+
endValue = currentSummary.end.value;
|
|
4113
|
+
}
|
|
4088
4114
|
|
|
4089
|
-
|
|
4090
|
-
|
|
4091
|
-
|
|
4115
|
+
const valueChange = endValue.subtract(startValue);
|
|
4116
|
+
const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys.opposite());
|
|
4117
|
+
const incomeChange = currentSummary.period.income;
|
|
4092
4118
|
|
|
4093
|
-
|
|
4119
|
+
returnRef = valueChange.add(tradeChange).add(incomeChange);
|
|
4120
|
+
} else {
|
|
4121
|
+
returnRef = Decimal.ZERO;
|
|
4122
|
+
}
|
|
4094
4123
|
} else {
|
|
4095
4124
|
returnRef = Decimal.ZERO;
|
|
4096
4125
|
}
|
|
@@ -4098,19 +4127,23 @@ module.exports = (() => {
|
|
|
4098
4127
|
return returnRef;
|
|
4099
4128
|
}
|
|
4100
4129
|
|
|
4101
|
-
function calculatePeriodDivisor(currentSummary, previousSummary) {
|
|
4130
|
+
function calculatePeriodDivisor(direction, currentSummary, previousSummary) {
|
|
4102
4131
|
let returnRef;
|
|
4103
4132
|
|
|
4104
4133
|
if (currentSummary) {
|
|
4105
|
-
|
|
4134
|
+
if (direction === PositionDirection.LONG) {
|
|
4135
|
+
let startValue;
|
|
4106
4136
|
|
|
4107
|
-
|
|
4108
|
-
|
|
4137
|
+
if (previousSummary) {
|
|
4138
|
+
startValue = previousSummary.end.value;
|
|
4139
|
+
} else {
|
|
4140
|
+
startValue = Decimal.ZERO;
|
|
4141
|
+
}
|
|
4142
|
+
|
|
4143
|
+
returnRef = startValue.add(currentSummary.period.buys.opposite());
|
|
4109
4144
|
} else {
|
|
4110
|
-
|
|
4145
|
+
returnRef = Decimal.ZERO;
|
|
4111
4146
|
}
|
|
4112
|
-
|
|
4113
|
-
returnRef = startValue.add(currentSummary.period.buys.opposite());
|
|
4114
4147
|
} else {
|
|
4115
4148
|
returnRef = Decimal.ZERO;
|
|
4116
4149
|
}
|
|
@@ -4163,7 +4196,7 @@ module.exports = (() => {
|
|
|
4163
4196
|
return PositionItem;
|
|
4164
4197
|
})();
|
|
4165
4198
|
|
|
4166
|
-
},{"./../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){
|
|
4167
4200
|
const assert = require('@barchart/common-js/lang/assert'),
|
|
4168
4201
|
Currency = require('@barchart/common-js/lang/Currency'),
|
|
4169
4202
|
is = require('@barchart/common-js/lang/is');
|