@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.
@@ -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 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.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
- let startValue;
592
+ if (direction === PositionDirection.LONG) {
593
+ let startValue;
568
594
 
569
- if (previousSummary) {
570
- startValue = previousSummary.end.value;
571
- } else {
572
- startValue = Decimal.ZERO;
573
- }
595
+ if (previousSummary) {
596
+ startValue = previousSummary.end.value;
597
+ } else {
598
+ startValue = Decimal.ZERO;
599
+ }
574
600
 
575
- let endValue;
601
+ let endValue;
576
602
 
577
- if (overridePrice) {
578
- endValue = currentSummary.end.open.multiply(overridePrice);
579
- } else {
580
- endValue = currentSummary.end.value;
581
- }
603
+ if (overridePrice) {
604
+ endValue = currentSummary.end.open.multiply(overridePrice);
605
+ } else {
606
+ endValue = currentSummary.end.value;
607
+ }
582
608
 
583
- const valueChange = endValue.subtract(startValue);
584
- const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys.opposite());
585
- const incomeChange = currentSummary.period.income;
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
- returnRef = valueChange.add(tradeChange).add(incomeChange);
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
- let startValue;
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
- if (previousSummary) {
602
- startValue = previousSummary.end.value;
637
+ returnRef = startValue.add(currentSummary.period.buys.opposite());
603
638
  } else {
604
- startValue = Decimal.ZERO;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@barchart/portfolio-api-common",
3
- "version": "1.2.135",
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);
@@ -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 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.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
- let startValue;
4098
+ if (direction === PositionDirection.LONG) {
4099
+ let startValue;
4074
4100
 
4075
- if (previousSummary) {
4076
- startValue = previousSummary.end.value;
4077
- } else {
4078
- startValue = Decimal.ZERO;
4079
- }
4101
+ if (previousSummary) {
4102
+ startValue = previousSummary.end.value;
4103
+ } else {
4104
+ startValue = Decimal.ZERO;
4105
+ }
4080
4106
 
4081
- let endValue;
4107
+ let endValue;
4082
4108
 
4083
- if (overridePrice) {
4084
- endValue = currentSummary.end.open.multiply(overridePrice);
4085
- } else {
4086
- endValue = currentSummary.end.value;
4087
- }
4109
+ if (overridePrice) {
4110
+ endValue = currentSummary.end.open.multiply(overridePrice);
4111
+ } else {
4112
+ endValue = currentSummary.end.value;
4113
+ }
4088
4114
 
4089
- const valueChange = endValue.subtract(startValue);
4090
- const tradeChange = currentSummary.period.sells.subtract(currentSummary.period.buys.opposite());
4091
- const incomeChange = currentSummary.period.income;
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
- returnRef = valueChange.add(tradeChange).add(incomeChange);
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
- let startValue;
4134
+ if (direction === PositionDirection.LONG) {
4135
+ let startValue;
4106
4136
 
4107
- if (previousSummary) {
4108
- startValue = previousSummary.end.value;
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
- startValue = Decimal.ZERO;
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');