@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 calculatePeriodGain(currentSummary, previousSummary, overridePrice) {
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
- returnRef = startValue.add(currentSummary.period.buys);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@barchart/portfolio-api-common",
3
- "version": "1.2.134",
3
+ "version": "1.2.138",
4
4
  "description": "Common classes used by the Portfolio system",
5
5
  "author": {
6
6
  "name": "Bryan Ingle",
@@ -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 calculatePeriodGain(currentSummary, previousSummary, overridePrice) {
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
- returnRef = startValue.add(currentSummary.period.buys);
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');