@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.
@@ -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 calculatePeriodGain(currentSummary, 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.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
- let endValue;
592
+ if (direction === PositionDirection.LONG) {
593
+ let startValue;
566
594
 
567
- if (overridePrice) {
568
- endValue = currentSummary.end.open.multiply(overridePrice);
569
- } else {
570
- endValue = currentSummary.end.value;
571
- }
595
+ if (previousSummary) {
596
+ startValue = previousSummary.end.value;
597
+ } else {
598
+ startValue = Decimal.ZERO;
599
+ }
600
+
601
+ let endValue;
572
602
 
573
- const valueChange = endValue.subtract(currentSummary.start.value);
574
- const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys);
575
- const incomeChange = currentSummary.period.income;
603
+ if (overridePrice) {
604
+ endValue = currentSummary.end.open.multiply(overridePrice);
605
+ } else {
606
+ endValue = currentSummary.end.value;
607
+ }
576
608
 
577
- returnRef = valueChange.add(tradeChange).add(incomeChange);
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
- returnRef = currentSummary.start.value.add(currentSummary.period.buys);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@barchart/portfolio-api-common",
3
- "version": "1.2.132",
3
+ "version": "1.2.136",
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);
@@ -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 calculatePeriodGain(currentSummary, 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.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
- let endValue;
4098
+ if (direction === PositionDirection.LONG) {
4099
+ let startValue;
4072
4100
 
4073
- if (overridePrice) {
4074
- endValue = currentSummary.end.open.multiply(overridePrice);
4075
- } else {
4076
- endValue = currentSummary.end.value;
4077
- }
4101
+ if (previousSummary) {
4102
+ startValue = previousSummary.end.value;
4103
+ } else {
4104
+ startValue = Decimal.ZERO;
4105
+ }
4106
+
4107
+ let endValue;
4078
4108
 
4079
- const valueChange = endValue.subtract(currentSummary.start.value);
4080
- const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys);
4081
- const incomeChange = currentSummary.period.income;
4109
+ if (overridePrice) {
4110
+ endValue = currentSummary.end.open.multiply(overridePrice);
4111
+ } else {
4112
+ endValue = currentSummary.end.value;
4113
+ }
4082
4114
 
4083
- returnRef = valueChange.add(tradeChange).add(incomeChange);
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
- returnRef = currentSummary.start.value.add(currentSummary.period.buys);
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');