@barchart/portfolio-api-common 1.2.134 → 1.2.138
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.
|
@@ -176,7 +176,18 @@ module.exports = (() => {
|
|
|
176
176
|
static get TRANSACTION_CREATE_FAILED_POSITION_LOCKED() {
|
|
177
177
|
return transactionCreateFailedPositionLocked;
|
|
178
178
|
}
|
|
179
|
-
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* The transaction failed because corporate action history is corrupt.
|
|
182
|
+
*
|
|
183
|
+
* @public
|
|
184
|
+
* @static
|
|
185
|
+
* @returns {FailureType}
|
|
186
|
+
*/
|
|
187
|
+
static get TRANSACTION_CREATE_FAILED_INSTRUMENT_CORRUPT() {
|
|
188
|
+
return transactionCreateFailedInstrumentCorrupt;
|
|
189
|
+
}
|
|
190
|
+
|
|
180
191
|
/**
|
|
181
192
|
* The transaction (of this type) cannot be deleted by a user, instead,
|
|
182
193
|
* it is created and managed by the system (e.g. dividends).
|
|
@@ -292,6 +303,7 @@ module.exports = (() => {
|
|
|
292
303
|
const transactionCreateFailedTypeReserved = new FailureType('TRANSACTION_CREATE_FAILED_TYPE_RESERVED', 'Unable to create {U|type.description} transaction, this type of transaction is managed by the system.');
|
|
293
304
|
const transactionCreateFailedReinvestPriceUnavailable = new FailureType('TRANSACTION_CREATE_FAILED_REINVEST_PRICE_UNAVAILABLE', 'Unable to create transaction, a dividend was paid on {L|day}; however no historical price is available for this day. To successfully create this transaction, please turn off dividend reinvestment for this position.');
|
|
294
305
|
const transactionCreateFailedPositionLocked = new FailureType('TRANSACTION_CREATE_FAILED_POSITION_LOCKED', 'Unable to create transaction, your {L|description} history is being recalculated. Please re-enter this transaction in a minute or two.');
|
|
306
|
+
const transactionCreateFailedInstrumentCorrupt = new new FailureType('TRANSACTION_CREATE_FAILED_POSITION_LOCKED', 'Unable to create transaction, corporate action history for {U|symbol} cannot be located.');
|
|
295
307
|
|
|
296
308
|
const transactionDeleteFailedOutOfSequence = new FailureType('TRANSACTION_DELETE_FAILED_OUT_OF_SEQUENCE', 'Deleting any transaction, except for the most recent, will cause transaction history to be re-written. Please confirm your intent to re-write transaction history (which could take some time and alter the historical results for this position).');
|
|
297
309
|
const transactionDeleteFailedNoTransaction = new FailureType('TRANSACTION_DELETE_FAILED_NO_TRANSACTION', 'Unable to delete transaction. The referenced transaction does not exist.');
|
|
@@ -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,7 +565,27 @@ 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.end.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) {
|
|
@@ -581,7 +606,7 @@ module.exports = (() => {
|
|
|
581
606
|
}
|
|
582
607
|
|
|
583
608
|
const valueChange = endValue.subtract(startValue);
|
|
584
|
-
const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys);
|
|
609
|
+
const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys.opposite());
|
|
585
610
|
const incomeChange = currentSummary.period.income;
|
|
586
611
|
|
|
587
612
|
returnRef = valueChange.add(tradeChange).add(incomeChange);
|
|
@@ -592,7 +617,7 @@ module.exports = (() => {
|
|
|
592
617
|
return returnRef;
|
|
593
618
|
}
|
|
594
619
|
|
|
595
|
-
function calculatePeriodDivisor(currentSummary, previousSummary) {
|
|
620
|
+
function calculatePeriodDivisor(direction, currentSummary, previousSummary) {
|
|
596
621
|
let returnRef;
|
|
597
622
|
|
|
598
623
|
if (currentSummary) {
|
|
@@ -604,7 +629,11 @@ module.exports = (() => {
|
|
|
604
629
|
startValue = Decimal.ZERO;
|
|
605
630
|
}
|
|
606
631
|
|
|
607
|
-
|
|
632
|
+
if (direction === PositionDirection.SHORT) {
|
|
633
|
+
returnRef = startValue.opposite().add(currentSummary.period.sells);
|
|
634
|
+
} else {
|
|
635
|
+
returnRef = startValue.add(currentSummary.period.buys.opposite());
|
|
636
|
+
}
|
|
608
637
|
} else {
|
|
609
638
|
returnRef = Decimal.ZERO;
|
|
610
639
|
}
|
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,7 +4071,27 @@ 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.end.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) {
|
|
@@ -4087,7 +4112,7 @@ module.exports = (() => {
|
|
|
4087
4112
|
}
|
|
4088
4113
|
|
|
4089
4114
|
const valueChange = endValue.subtract(startValue);
|
|
4090
|
-
const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys);
|
|
4115
|
+
const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys.opposite());
|
|
4091
4116
|
const incomeChange = currentSummary.period.income;
|
|
4092
4117
|
|
|
4093
4118
|
returnRef = valueChange.add(tradeChange).add(incomeChange);
|
|
@@ -4098,7 +4123,7 @@ module.exports = (() => {
|
|
|
4098
4123
|
return returnRef;
|
|
4099
4124
|
}
|
|
4100
4125
|
|
|
4101
|
-
function calculatePeriodDivisor(currentSummary, previousSummary) {
|
|
4126
|
+
function calculatePeriodDivisor(direction, currentSummary, previousSummary) {
|
|
4102
4127
|
let returnRef;
|
|
4103
4128
|
|
|
4104
4129
|
if (currentSummary) {
|
|
@@ -4110,7 +4135,11 @@ module.exports = (() => {
|
|
|
4110
4135
|
startValue = Decimal.ZERO;
|
|
4111
4136
|
}
|
|
4112
4137
|
|
|
4113
|
-
|
|
4138
|
+
if (direction === PositionDirection.SHORT) {
|
|
4139
|
+
returnRef = startValue.opposite().add(currentSummary.period.sells);
|
|
4140
|
+
} else {
|
|
4141
|
+
returnRef = startValue.add(currentSummary.period.buys.opposite());
|
|
4142
|
+
}
|
|
4114
4143
|
} else {
|
|
4115
4144
|
returnRef = Decimal.ZERO;
|
|
4116
4145
|
}
|
|
@@ -4163,7 +4192,7 @@ module.exports = (() => {
|
|
|
4163
4192
|
return PositionItem;
|
|
4164
4193
|
})();
|
|
4165
4194
|
|
|
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){
|
|
4195
|
+
},{"./../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
4196
|
const assert = require('@barchart/common-js/lang/assert'),
|
|
4168
4197
|
Currency = require('@barchart/common-js/lang/Currency'),
|
|
4169
4198
|
is = require('@barchart/common-js/lang/is');
|