Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | 9x 9x 9x 9x 8x 8x 8x 49x 7x 7x 1x 7x 7x 1x 7x 6x 8x 2x 9x 9x 10x 1x 9x 9x 2x 9x 8x 9x 25x | import * as IB from "@stoqey/ib";
import {MapExt} from "@waytrade/microservice-core";
import {AccountSummary} from "../models/account-summary.model";
import {MarketData} from "../models/market-data.model";
/**
* Account summary tag values, make suer this is in sync with
* AccountSummary model.
*
* Ecented AccountSummary model if you extend this!!
*/
export const ACCOUNT_SUMMARY_TAGS = [
"AccountType",
"NetLiquidation",
"TotalCashValue",
"SettledCash",
"AccruedCash",
"BuyingPower",
"EquityWithLoanValue",
"PreviousEquityWithLoanValue",
"GrossPositionValue",
"RegTEquity",
"RegTMargin",
"InitMarginReq",
"SMA",
"InitMarginReq",
"MaintMarginReq",
"AvailableFunds",
"ExcessLiquidity",
"Cushion",
"FullInitMarginReq",
"FullMaintMarginReq",
"FullAvailableFunds",
"FullExcessLiquidity",
"LookAheadNextChange",
"LookAheadInitMarginReq",
"LookAheadMaintMarginReq",
"LookAheadAvailableFunds",
"LookAheadExcessLiquidity",
"HighestSeverity",
"DayTradesRemaining",
"Leverage",
];
/**
* Collection of helper functions used by IBApiService.
*/
export class IBApiServiceHelper {
/**
* Collect account summary tag values to map of account ids and
* AccountSummary models.
*/
static colllectAccountSummaryTagValues(
accountId: string,
tagValues: IB.AccountSummaryTagValues,
baseCurrency: string,
all: MapExt<string, AccountSummary>,
): void {
const accountSummary = all.getOrAdd(
accountId,
() => new AccountSummary({account: accountId}),
);
tagValues.forEach((summaryValues, key) => {
if (ACCOUNT_SUMMARY_TAGS.find(v => v === key)) {
let value = summaryValues.get(baseCurrency);
if (!value) {
value = summaryValues.get("");
}
let val: number | string | undefined = Number(value?.value);
if (isNaN(val)) {
val = value?.value;
}
if (val !== undefined) {
((<unknown>accountSummary) as Record<string, unknown>)[
key[0].toLowerCase() + key.substr(1)
] = val;
}
}
});
if (Object.keys(accountSummary).length === 1) {
all.delete(accountId);
}
}
/** Convert IB.MarketDataTicks to MarketData model. */
static marketDataTicksToModel(data: IB.MarketDataTicks): MarketData {
const result: Record<string, number | undefined> = {};
data.forEach((value, type) => {
if (!value.value) {
return;
}
let propName =
type > IB.IBApiNextTickType.API_NEXT_FIRST_TICK_ID
? IB.IBApiNextTickType[type]
: IB.IBApiTickType[type];
if (propName?.startsWith("DELAYED_")) {
propName = propName.substr("DELAYED_".length);
}
if (propName) {
result[propName] = value.value;
}
});
return result;
}
/** Format a possition id. */
static formatPositionId(accountId: string, conId?: number): string {
return `${accountId}:${conId}`;
}
}
|