kraken-grid 1.4.2 → 1.4.3
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.
- package/bin/gemini-grid.js +2 -0
- package/bin/kraken-grid.js +2 -0
- package/bot.d.ts +50 -0
- package/bot.js.map +1 -0
- package/dist/allocation.js +609 -0
- package/dist/allocation.js.map +1 -0
- package/dist/balancer.js +101 -0
- package/dist/balancer.js.map +1 -0
- package/dist/bot.js +1368 -0
- package/dist/bot.js.map +1 -0
- package/dist/gemini.js +259 -0
- package/dist/gemini.js.map +1 -0
- package/dist/ginit.js.map +1 -0
- package/dist/init.js.map +1 -0
- package/dist/jest.config.js.map +1 -0
- package/dist/krak2gem.js +629 -0
- package/dist/krak2gem.js.map +1 -0
- package/dist/manager.js +545 -0
- package/dist/manager.js.map +1 -0
- package/dist/pricers/openex.js +41 -0
- package/dist/reports.js +297 -0
- package/dist/reports.js.map +1 -0
- package/dist/safestore.js +134 -0
- package/dist/safestore.js.map +1 -0
- package/dist/savings.js +239 -0
- package/dist/savings.js.map +1 -0
- package/dist/test/customExpect.js +26 -0
- package/dist/test/customExpect.js.map +1 -0
- package/dist/test/gem.test.js +189 -0
- package/dist/test/gem.test.js.map +1 -0
- package/dist/test/kraken.test.js +300 -0
- package/dist/test/kraken.test.js.map +1 -0
- package/dist/test/mock-example.test.js +44 -0
- package/dist/test/mock-example.test.js.map +1 -0
- package/dist/testFasterCache.js +231 -0
- package/dist/testFasterCache.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/web.js +216 -0
- package/dist/web.js.map +1 -0
- package/dist/websocket.js +18 -0
- package/dist/websocket.js.map +1 -0
- package/gemini.js +291 -0
- package/global.d.ts +28 -0
- package/init.js.map +1 -0
- package/package.json +7 -7
- package/pricers/openex.js +41 -0
- package/savings.d.ts +30 -0
- package/static/client.js +521 -0
- package/static/gallocation.js +90 -0
- package/static/imgByKtick.js +288 -0
- package/static/md-block.js +301 -0
- package/test/extend.test.js +225 -0
- package/test/gem.test.js +317 -0
- package/test/precedence.js +77 -0
- package/test/shared.js +1 -0
- package/test/typing.js +21 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/types.d.ts +157 -0
- package/types.js +4 -0
- package/types.js.map +1 -0
- package/unconverted.d.ts +62 -0
- package/.vscode/launch.json +0 -50
- package/.vscode/tasks.json +0 -21
- package/.~lock.capGains.ods# +0 -1
- package/capGains.csv +0 -552
- package/capGains.ods +0 -0
- package/cardsLog.txt +0 -482
- package/init.js.NOT +0 -38
- package/jest.config.ts.not +0 -251
- package/kraken-grid.code-workspace +0 -18
- /package/{.dist → dist}/ginit.js +0 -0
- /package/{.dist → dist}/init.js +0 -0
- /package/{.dist → dist}/jest.config.js +0 -0
package/bot.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/* I think this file is unnecessary now. ...
|
|
2
|
+
import { Portfolio, APIResponse } from './types';
|
|
3
|
+
import { Savings } from './savings';
|
|
4
|
+
|
|
5
|
+
declare interface BotInstance {
|
|
6
|
+
order(buysell: string, market: string, price: number, amt: number,
|
|
7
|
+
lev?: string, inUref?: number, closeO?: number): Promise<any>;
|
|
8
|
+
set(ur: any, type: any, price: any): Promise<void>;
|
|
9
|
+
listOpens(isFresh?: boolean): Promise<void>;
|
|
10
|
+
deleverage(opensA: any[], oid: number, undo?: boolean): Promise<void>;
|
|
11
|
+
ExchangeSavings(): Savings;
|
|
12
|
+
refnum(opensA: any[], oid: number, newRef: any): Promise<void>;
|
|
13
|
+
list(args: any[]): Promise<void>;
|
|
14
|
+
kapi(...args: [string | [string, Record<string, any>], number?]): Promise<APIResponse>;
|
|
15
|
+
lessmore(less: boolean, oid: number, amt: number, all?: boolean | null): Promise<void>;
|
|
16
|
+
kill(o: any, oa: any[]): Promise<APIResponse>;
|
|
17
|
+
report(showBalance?: boolean): Promise<void>;
|
|
18
|
+
howMuch(tkr: string, np: number): Promise<number>;
|
|
19
|
+
sleep(ms: number): Promise<void>;
|
|
20
|
+
marginReport(show?: boolean): Promise<any>;
|
|
21
|
+
getLev(portfolio: Portfolio, buysell: string, price: number, amt: number,
|
|
22
|
+
market: string, posP: any): string;
|
|
23
|
+
showState(prefix?: string): string;
|
|
24
|
+
getExtra(): any;
|
|
25
|
+
pairInfo(p: string): any;
|
|
26
|
+
showPair(p: string): void;
|
|
27
|
+
FLAGS: {
|
|
28
|
+
safe: boolean;
|
|
29
|
+
verbose: boolean | string | undefined;
|
|
30
|
+
risky: boolean;
|
|
31
|
+
};
|
|
32
|
+
save(): void;
|
|
33
|
+
basesFromPairs(): string[];
|
|
34
|
+
findPair(base: string, quote?: string, idx?: number): any;
|
|
35
|
+
numerairesFromPairs(): string[];
|
|
36
|
+
init(pwd?: string): Promise<Portfolio>;
|
|
37
|
+
keys(): Promise<void>;
|
|
38
|
+
getPrice(tkr: string): Promise<number>;
|
|
39
|
+
tfc: any;
|
|
40
|
+
getPairs(): any;
|
|
41
|
+
getTickers(): string[];
|
|
42
|
+
getAlts(): Record<string, string>;
|
|
43
|
+
getPortfolio(): Portfolio;
|
|
44
|
+
getConfig(): any;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
declare interface BotConstructor {
|
|
48
|
+
(config: any): BotInstance;
|
|
49
|
+
}
|
|
50
|
+
*/
|
package/bot.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["bot.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/* eslint-disable no-restricted-globals */\n/* eslint-disable import/extensions */\n/* eslint-disable no-console */\n//import type { Process } from 'node';\nimport PSCon from 'prompt-sync';\n // ({sigint: true});\nimport ssModule from './safestore.js'; // encrypted sorage\nimport ReportCon from './reports.js';\nimport TFC from'./testFasterCache.js';\nimport {GridPoint, BothSidesRef, BothSidesPair, OrderEntry, \n Order, TickerResponse, ClosedOrderResponse,\n Portfolio, GotError, BotInstance,\n APIResponse} from './types.js';\n\nconst prompt = PSCon({sigint: true});\nconst myConfig : any = {exch: 'K'};\nexport{}\nexport default function Bot(config: any) {\n if(config.bot) return config.bot; // Singleton!\n Object.assign(myConfig, config);\n const {Savings, AllocCon, ClientCon} = myConfig;\n let safestore;\n let Reports;\n let pairs: Object = {};\n let tickers : string[] = [];\n let Bases;\n let Numeraires;\n let Extra = {};\n const alts = {};\n let exchange;\n let tfc; // So we don't have to use config.bot.tfc\n\n let portfolio: Portfolio = {}; // A record of what's on the exchange\n let lCOts = 0; // Timestamp for use in collecting executed trades.\n const FLAGS = {safe:true,verbose:process.TESTING,risky:false};\n\n function getPortfolio() { return portfolio; }\n function getConfig() { return myConfig; }\n function getAlts() { return alts; }\n function getTickers() { return tickers; }\n function getPairs() {return pairs; }\n function getExtra() { return Extra; }\n\n function toDec(n,places) {\n const f = 10**places;\n return Math.round(n*f)/f;\n }\n\n // Returns a Savings object which includes assets on the exchange.\n function ExchangeSavings() {\n const assets : Object[]= [];\n Object.keys(portfolio).forEach(key => {\n if(tickers.includes(key)\n && Array.isArray(portfolio[key])\n && portfolio[key].length === 4\n && portfolio[key][3] !== 0) {\n assets.push({ticker:key,amount:toDec(portfolio[key][3],4)});\n }\n });\n return Savings({assets,label:'OnExchange',AllocCon});\n }\n\n // Store the API keys if they change.\n async function keys() { \n \tsafestore.ssUpdate(`${portfolio.key} ${portfolio.secret}`, false);\n }\n\n // pairs is the result of calling AssetPairs, so a series of properties\n // like `PAIR: {altname, base, etc.}`. If you want more than just the\n // property name (the pair, or symbol used by Kraken for that market),\n // you have to pass 1 in as idx. You can pass undefined for quote.\n // TODO: make this function easier to use, like:\n // findPair('XXBTZUSD', altname) -> 'XBTUSD'.\n function findPair(base, quote = portfolio.Numeraire, idx = 0) {\n // const gMarket = exchange.inKraken(base+quote).toLowerCase();\n // const kBase = exchange.inKraken(base, true)\n const p = Object.entries(pairs).find(a => a[1].altname===base \n || a[0] === base || alts[base] === a[0]\n || (a[1].quote===quote && ([base,alts[base]].includes(a[1].base)))\n/* || a[0] === kBase \n || base === exchange.inKraken(a[0])\n || a[0] === gMarket\n || base+quote === exchange.inKraken(a[0], true) */);\n if(!p) {\n console.trace(`No pair with base ${base} and quote ${quote\n }, in pairs that has ${Object.keys(pairs).length} keys.`);\n return '';\n }\n return idx === -1 ? p : p[idx];\n };\n\n // Save changes as they happen in encrypted storage.\n function save() {\n const toSave = {\n key: portfolio.key,\n secret: portfolio.secret,\n savings: portfolio.Savings,\n Alloc: portfolio.Allocation,\n Numeraire: portfolio.Numeraire || 'ZUSD',\n Pairs: Array.from(portfolio.Pairs),\n\t Closed: portfolio.Closed,\n Extra,\n limits: portfolio.limits,\n lastUpdate: portfolio.lastUpdate};\n safestore.replace(toSave);\n console.log(\"Updated, saved to disk.\",FLAGS.verbose ? toSave : '');\n }\n\n function showPair(p) {\n console.log(\"The pair\",p,\"is: \",pairs[p],\n \"and pairs' length is:\",Object.keys(pairs).length);\n }\n \n function pairInfo(p) {\n return pairs[p];\n }\n\n function sleep(ms) {\n // When debugging, step INTO this function and wait at the breakpoint below.\n // If you step OVER the await that calls sleep(), JavaScript will continue \n // executing other code (like the next test file) while waiting for the timeout.\n return new Promise(resolve => {\n setTimeout(resolve, ms)});\n }\n\n // Call a Kraken API\n async function protectedKapi(\n arg: string | [string, Record<string, any>],\n sd: number = 5\n ) {\n let ret;\n const cached = tfc.isCached('kapi',arg);\n if( cached.answer && process.USECACHE ) {\n ret = cached.cached;\n } else if( process.USECACHE==='must' ) { return { result: { \n descr: `No Cache for ${cached.id}` } }; \n } else try {\n if(Array.isArray(arg)) {\n ret = await exchange.api(...arg);\n } else {\n ret = await exchange.api(arg);\n }\n await sleep(1000);\n } catch(gerr: unknown) {\n const err = gerr as GotError;\n // For error conditions that are usually transient.\n if((!/AddOrder/.test(arg[0])&&/ETIMEDOUT|EAI_AGAIN/.test(err.code))\n || /nonce/.test(err.message)\n || /Response code 520/.test(err.message)\n || /Response code 50/.test(err.message)\n || (FLAGS.risky && /Internal error/.test(err.message))\n || /Unavailable/.test(err.message) \n || /Rate limit|Throttled/.test(err.message)) {\n if(sd > 5)\n console.log(22,`${err.message\n }, so trying again in ${sd}s...(${new Date}):`);\n if(Array.isArray(arg)) {\n // eslint-disable-next-line no-param-reassign\n delete arg[1].nonce;\n console.log(...arg);\n } else {\n console.log(arg);\n }\n await sleep(sd*1000);\n ret = await protectedKapi(arg,sd>300?sd:2*sd);\n // For error conditions that can be ignored.\n } else if( /Unknown order/.test(err.message) && /CancelOrder/.test(arg[0])) {\n console.log(\"Ignoring: \", err.message, ...arg);\n ret = { result: { descr: \"Ignored\" }};\n // For error conditions that can be retried later.\n } else if(FLAGS.risky && /Insufficient initial margin/.test(err.message)) {\n console.log(172,`${err.message} Maybe next time.`);\n ret = { result: { descr: \"Postponed\" }};\n } else {\n\t\t// console.log(174,\"API key: \", portfolio.key);\n throw err;\n }\n await sleep(1000);\n }\n // if(FLAGS.verbose||!cached) console.log(ret);\n if(!cached || !cached.answer) tfc.store(cached.id,ret);\n return ret;\n }\n\n const mutex = {\n locked: false,\n queue: [] as Function[],\n lock: async function lock() {\n if (this.locked) {\n // eslint-disable-next-line no-promise-executor-return\n await new Promise(resolve => this.queue.push(resolve));\n }\n this.locked = true;\n },\n unlock: function unlock() {\n this.locked = false;\n const next: Function | undefined = this.queue.shift();\n if (next) next();\n }\n }\n \n async function kapi(...args: [string | [string, Record<string, any>], number?]) {\n await mutex.lock();\n try {\n return await protectedKapi(...args);\n } finally {\n mutex.unlock();\n }\n }\n\n async function cachePairs() {\n console.log(\"Reading Asset Pairs...\");\n const kp = await kapi('AssetPairs');\n const ret = {};\n Object.keys(kp.result).forEach(k => {\n ret[k] = kp.result[k];\n ret[k].pair = k;\n ret[kp.result[k].altname] = ret[k];\n });\n return ret;\n }\n\n async function cacheTickers() {\n await console.log(\"Reading Tickers...\");\n const kp = await kapi('Assets');\n const ret = Object.keys(kp.result);\n ret.forEach(t => {\n if(kp.result[t].altname !== t) alts[kp.result[t].altname] = t;\n });\n return ret;\n }\n\n // init initializes the bot and accepts a password for testing.\n async function init(pwd = \"\") { \n tfc = TFC(process.TESTING,process.argv[2]);\n // eslint-disable-next-line no-param-reassign\n config.bot.tfc = tfc; // `this` here is not the object, config.bot is.\n if(!exchange) {\n safestore = ssModule(pwd);\n if(/^TestPW/.test(safestore.getPW()) && !process.TESTING) \n process.TESTING = 'implied';\n // eslint-disable-next-line no-param-reassign\n config.stored = safestore;\n const p = await safestore.read();\n Extra = p.Extra || Extra;\n exchange = await new ClientCon(p.key, p.secret, config);\n // eslint-disable-next-line no-param-reassign\n config.exchange = exchange;\n exchange.inKraken = ClientCon.inKraken\n || ((x) => {return x;});\n config.bot.portfolio = portfolio;\n portfolio.Pairs = new Set(Array.isArray(p.Pairs) ? p.Pairs : []);\n portfolio.Numeraire = p.Numeraire || 'ZUSD';\n pairs = await cachePairs();\n tickers = await cacheTickers();\n Savings.init(this as BotInstance);\n // eslint-disable-next-line no-param-reassign\n portfolio.key = p.key;\n portfolio.secret = p.secret;\n portfolio.Savings = p.savings ? p.savings : []; \n\t portfolio.Closed = p.Closed || {orders: {}, offset: 0}; // Must be something for new accounts.\n portfolio.Tickers = new Set();\n portfolio.limits = p.limits ? p.limits : [0,-1];\n portfolio.lastUpdate = p.lastUpdate ? p.lastUpdate : null;\n portfolio.Allocation = await AllocCon(config, \n p.Alloc ? p.Alloc.assets : undefined);\n Reports = ReportCon(this);\n config.report = Reports;\n }\n return portfolio;\n };\n\n // return array of unique values for a property of Pair\n function fromPairs(what) {\n const qc=new Set;\n Object.keys(pairs).forEach(key => {\n qc.add(pairs[key][what]);\n });\n return Array.from(qc);\n }\n\n // Collect all the bases represented in Pairs.\n function basesFromPairs() {\n if(!Bases)\n Bases = fromPairs('base');\n return Bases;\n }\n\n // Collect all the numeraires represented in Pairs.\n function numerairesFromPairs() {\n if(!Numeraires)\n Numeraires = fromPairs('quote');\n return Numeraires;\n }\n\n // Create a user reference number.\n function makeUserRef(buysell, market, price) {\n const ret = Number((buysell==='buy'?'1':'0')\n + (`00${Object.keys(pairs)\n .indexOf(findPair(market,portfolio.Numeraire))}`).slice(-3)\n + String(`000000${price}`).replace('.','').slice(-6));\n if(FLAGS.verbose) console.log(\"Created userref \",ret);\n return ret;\n }\n\n // Place an order:\n // buysell indicates whether this is a 'buy' or a 'sell'\n // market identifies the pair for this trade.\n // price specifies how much of the quote (what gets paid)\n // we're willing to pay/receive for one of the base (what's bought or sold)\n // amt is how much of the base we want to buy or sell\n // lev indicates the level of leverage\n // uref can be used to specify the userreference.\n // closeO is the price at which to close the trade profitably.\n/**\n * @return {Promise<any>}\n */\n async function order(buysell, market, price, amt, lev='none', \n inUref=0, closeO:number = 0) {\n let cO = Number(closeO);\n const p = Number(price);\n const a = Number(amt);\n const qCost = p*a;\n let ret: any = '';\n let uref = inUref;\n const pairA = findPair(market,portfolio.Numeraire,-1);\n const pair = pairA[0];\n const pairO = pairA[1];\n const ticker = pairO.base;\n const {quote} = pairO;\n const nuFactor = portfolio[quote][1]; // Multiply to get value in Numeraire\n const maxInNum = portfolio.limits[1]; // This is \n let d; const notTrade = (maxInNum !== -1 && (qCost*nuFactor>maxInNum) \n || (qCost*nuFactor>25 && FLAGS.safe));\n\n if(pair === \"undefined\") \n return `${market} is not yet supported.`;\n if(uref===0) uref = makeUserRef(buysell, market, price);\n if(pairO.ordermin > a || pairO.costmin > qCost) {\n console.log( `${a+ticker}@${p} is too small for the exchange.` );\n return {txid:\"\", uref};\n }\n if( cO === price ) cO = 0;\n\n console.log(`${(notTrade ? `(>$${maxInNum} not safe, so NOT) ` : '')\n +buysell}ing ${a} ${market} at ${p} with leverage ${lev\n }${cO===0 ? \"\" : ` to close at ${isNaN(cO)?`${closeO} is NaN!`:cO}` } as ${uref}`);\n if( cO>0 && (buysell === 'buy' ? cO <= price : cO >= price) )\n throw new Error(`Close price, ${cO} is on the wrong side of ${buysell} at ${price}!`);\n if(process.argv[2]==='fakeTrade') // Just fake it\n return {txid:'AAAAA-1234-ZZZ',uref};\n ret = ['AddOrder',\n { pair,\n userref: uref,\n type: buysell,\n ordertype: 'limit',\n price: p,\n volume: a,\n leverage: lev,\n close: (cO>0 ? {ordertype:'limit',price:cO} : null)\n }];\n if(!notTrade) {\n const response = await kapi(ret);\n d = response.result;\n if(d) { \n ret = {txid:d.txid,uref};\n if(d.descr) {\n console.log(40,response,d.descr); \n } else {\n console.log(40,response,'No result.descr from kapi');\n }\n } else console.log(40,response,\"No kapi response.\");\n console.log(42,\"Cooling it for a second...\");\n await sleep(1000);\n } else console.log(204,p*a*nuFactor,\"is not in range:\",portfolio.limits);\n if(notTrade) await sleep(5000);\n return ret;\n }\n\n // Return a string description of a grid point.\n function gpToStr(gp) { \n return `${gp.userref}:${gp.buy}-${gp.sell} ${gp.bought}/${gp.sold}`; \n }\n\n // Pass a negative numbr for count to collect all orders.\n async function moreOrders(count = 5) {\n const pc = portfolio.Closed;\n do {\n // eslint-disable-next-line no-await-in-loop\n const closed = await Reports.getExecuted(count < 0 ? 20 \n : count, portfolio.Closed);\n // If count < 0, keep going until we have the first one.\n } while( (count < 0 && !portfolio.Closed?.hasFirst) );\n return portfolio.Closed;\n }\n // Initialize the grid by reading closed orders if necessary\n async function initGrid() {\n let gPrices: GridPoint[] = portfolio?.G || [];\n if(gPrices.length === 0) { // When we have no grid prices, collect orders.\n console.log(\"Reading grid from 20 closed orders...\");\n const closed = await moreOrders(20);\n const closedIDs = closed.keysFwd();\n if(closedIDs.length > 0) {\n let counter = closedIDs.length-1;\n lCOts = closed.orders[closedIDs[counter]].closetm;\n console.log(\"Last five executed orders:\");\n closedIDs.forEach((o) => { // fill in the grid prices from existing orders.\n const oo = closed.orders[o];\n const od = oo.descr;\n const op = od.price;\n const ur = oo.userref;\n const cd = new Date(oo.closetm * 1000);\n let gp:GridPoint | undefined = gPrices.find((x:any) => x.userref===ur); // If we already saw this grid point.\n\t if( counter < 5 ) {\n console.log(o,ur,op,od.type,od.close,`${cd.getFullYear()}/${1+cd.getMonth()\n }/${cd.getDate()}`,cd.getHours(),cd.getMinutes(),cd.getSeconds());\n }\n counter -= 1;\n if(portfolio && portfolio.Pairs) {\n const pair2Add = findPair(od.pair);\n portfolio.Pairs.add(pair2Add); // Which pairs are in open orders?\n } \n if(ur>0) {\n if(!gp) {\n gp = {userref:ur,buy:'?',sell:'?', bought: 0, sold: 0};\n gp[od.type] = op;\n gp[(od.type==='buy') ? 'bought' : 'sold'] = Number(oo.vol_exec); // was rv ??\n gPrices.push(gp);\n if(FLAGS.verbose) \n console.log(gp.userref,`(${od.type})`,\n 'buy:',gp.buy,'sell:',gp.sell);\n } else {\n gp[(od.type==='buy') ? 'bought' : 'sold'] += Number(oo.vol_exec); // was rv ??\n gp[od.type] = op;\n }\n }\n });\n }\n }\n portfolio.G = gPrices;\n }\n\n // opens: Open orders collected from Kraken\n // oldRefs: The OrderIDs collected previously\n // This function:\n // * Build bSidesR (Refs - which UserRefs have both buys and sells)\n // * Build bSidesP (Pair - to find highest sell and lowest buy for each pair)\n // * Identify orders that are new and orders that are now gone\n // * Create an array of orders (\"comps\") resulting from conditional closes\n // so that we can combine them into a new order with its own conditional close.\n // * Update how much of each asset remains available (not reserved for these\n // open orders).\n // It returns [bSidesR, bSidesP, comps]\n // -----------------------------------------------------------------------------\n function processOpens(opens, oldRefs, isFresh) {\n const bSidesR: BothSidesRef[] = [];\n const bSidesP: BothSidesPair[] = [];\n const comps: any[] = [];\n const opensA: OrderEntry[] = [];\n const pnum = portfolio.Numeraire;\n const gPrices = portfolio.G;\n\n Object.entries(opens).forEach(([o,oo]:any) => {\n const od = oo.descr;\n const op = od.price;\n const rv = oo.vol-oo.vol_exec;\n const ur = oo.userref;\n\n if(ur > 0) {\n // bothSides record for userref\n // ----------------------------\n let bs: BothSidesRef | BothSidesPair | undefined \n = bSidesR.find(b => b.userref===ur);\n if(!bs) {\n bs = {userref:ur,buy:false,sell:false,trades:0};\n bSidesR.push(bs);\n }\n bs[od.type]=true;\n bs.trades += 1;\n\n // bothSides record for grid extension\n // -----------------------------------\n bs = bSidesP.find(b => b.pair===od.pair);\n if(!bs) {\n bs = {\n pair: od.pair,\n price: op,\n buy: od.type==='buy',\n sell: od.type==='sell'\n };\n bSidesP.push(bs);\n } else if(!bs[od.type]) {\n bs[od.type] = true;\n } else if(bs.buy !== bs.sell) {\n // Set bs.price to the lowest if there are only sells (bs.sell is true),\n // or the highest if there are only buys (bs.buy is true).\n // If both, it won't matter.\n // --------------------------------------------------\n if((bs.buy && Number(bs.price) < Number(op))\n || (bs.sell && Number(bs.price) > Number(op))) bs.price = op;\n }\n }\n\n // Record open trades\n // ------------------\n opensA.push([o,oo]);\n const ct = od.type==='buy'?'sell':'buy'; // Order's close is of opposite type.\n let cp:Number = 0; // Close Price\n // Record the opening price for use in the closing\n // order of the closing order into which we combine.\n // -------------------------------------------------\n if(od.close && ur>0) { // Externally added orders have userref=0\n cp = Number(/[0-9.]+$/.exec(od.close)?.[0]) || 0;\n let gp = gPrices.find(gprice => gprice.userref===ur);\n if(!gp) {\n gp = {userref:ur,buy:'?',sell:'?', bought: 0, sold: 0};\n gPrices.push(gp);\n if(FLAGS.verbose) console.log(329,\n gp.userref,`(${od.type})`,'buy:',gp.buy,'sell:',gp.sell);\n }\n gp[od.type] = op;\n gp[ct] = cp;\n }\n const gp = gPrices.find(gprice => gprice.userref===ur&&ur>0);\n cp = gp ? gp[ct] : '?';\n const {pair} = od;\n const ci = od.pair+od.price+od.type; // pair picks up externals\n if(FLAGS.verbose) console.log(`comps index: ${ci}`);\n if(!comps[ci]) {\n if(FLAGS.verbose) console.log(\"Creating ci for\",o);\n comps[ci]={\n total: rv,\n volume: Number(oo.vol),\n type: od.type,\n sym: pair,\n ctype: ct,\n lev: od.leverage,\n ids: [o],\n userref: ur,\n open: cp,\n price: od.price,\n hasClose: Boolean(od.close)\n };\n } else {\n if(FLAGS.verbose) console.log(\"Adding\",o);\n comps[ci].total+=rv; // Volume for combined order.\n comps[ci].ids.push(o);\n comps[ci].volume += Number(oo.vol); // Volume for extended order.\n // If any of them are missing a close, combine them all\n // ----------------------------------------------------\n comps[ci].hasClose &&= Boolean(od.close);\n // Fix a comp created from an external order.\n // ------------------------------------------\n if(comps[ci].userref === 0) comps[ci].userref = ur;\n }\n if(!od.close) {\n console.log(154,`${od.order} (${ur}) had no close.`);\n }\n const orid = oldRefs.indexOf(o); // Remove it from oldRefs because it isn't gone. \n if((orid) > -1) {\n oldRefs.splice(orid, 1);\n } else { // It wasn't in there, so it must be new.\n console.log(159, \"New: \",o,opensA.length, od.order, oo.userref, cp);\n // if(FLAGS.verbose) console.log(160,oo);\n }\n\n if(portfolio && isFresh && od.leverage === \"none\") {\n if(od.type === \"buy\") {\n if(/USD$/.test(od.pair)) { // Deplete our cash\n portfolio[pnum][2] -= od.price*opens[o].vol; // #USD Refactor and basePair()\n } else if(/XBT$/.test(od.pair)) { // Deplete our BTC\n portfolio.XXBT[0] -= od.price*opens[o].vol;\n }\n } else {\n // Deplete available crypto\n // ------------------------\n const p396 = findPair(od.pair,pnum,1);\n// console.log({p396});\n portfolio[p396.base][0] -= opens[o].vol;\n }\n }\n });\n portfolio.O = opensA;\n if(oldRefs.length > 0) {\n console.log(`Gone: ${oldRefs}`);\n // If trades are gone, check for freshly executed orders.\n moreOrders(100);\n }\n\n return [bSidesR, bSidesP, comps];\n }\n\n // How to cancel orders, either a TxID, an array of them,\n // ALL of them (pass 0), or a line number from the list\n // of orders, or all orders with a particular User\n // Reference Number.\n async function kill(o,oa):Promise<APIResponse> {\n let killed;\n if(o === 0) {\n const killAll = prompt(\"Cancel ALL orders? [y/N]\");\n if(/^y/i.test(killAll)) {\n killed = await kapi('CancelAll');\n console.log(314,killed);\n } else { console.log(\"Maybe be more careful.\"); }\n \n } else if(FLAGS.safe) {\n console.log(`In Safemode(!), so NOT killing ${o}`);\n \n } else if(Array.isArray(o) && o.length > 1) {\n console.log(\"Killing\",o,'...');\n killed = await kapi(['CancelOrderBatch',{orders:o}]);\n console.log(546,killed);\n } else if(Array.isArray(o) && o.length > 0) {\n console.log(\"Killing\",o[0],'...');\n killed = await kapi(['CancelOrder',{txid:o[0]}]);\n console.log(568,killed);\n } else if(typeof(o)==='string' && o.match(/-/)) {\n console.log(`Killing ${o}...`);\n killed = await kapi(['CancelOrder', {txid: o}]);\n console.log(320,killed);\n } else if(o < 100000) {\n const idxo = oa[o-1];\n console.log(`Killing ${idxo[0]}(described as ${idxo[1].descr.order}...`);\n killed = await kapi(['CancelOrder', {txid: idxo[0]}]);\n console.log(325,killed);\n idxo[0] = `Killed: ${ idxo[0]}`;\n idxo[1].descr.order = `Killed: ${idxo[1].descr.order}`;\n } else {\n console.log(`Killing userref ${o}...`);\n killed = await kapi(['CancelOrder', {txid: o}]);\n console.log(329,killed);\n }\n return killed;\n // console.log(331,\"Waiting a second.\");\n // await sleep(1000);\n }\n\n async function getPrice(tkr) { \n if(portfolio[tkr]) return portfolio[tkr][1];\n if(portfolio.Numeraire === tkr) return 1;\n if(Savings.pricers[tkr]) {\n const ret = await Savings.pricers[tkr].price(tkr);\n return toDec(ret, 2);\n }\n const pair = findPair(tkr,portfolio.Numeraire);\n const newPrice: TickerResponse = pair ? await kapi([\"Ticker\",{pair}]) : false;\n if(newPrice) return Object.values(newPrice.result)[0].c[0];\n console.log( `No way to get price for ${tkr}` );\n return 0;\n }\n\n // howMuch is adapted from the code recently developed\n // for the client that shows how much to trade if the\n // price changes (to np = NewPrice).\n // ---------------------------------------------------\n async function howMuch(tkr, np) {\n const // tkr = findPair(mkt),\n p = await getPrice(tkr);\n const dp = (np - p)/p; // % change in price\n const [,desired,adjust,ranges] = await portfolio.Allocation.Allocations();\n const t = portfolio.Allocation.getTotal();\n let [hp,lp] = ranges[tkr] || [0,0];\n const [b,ma] = (adjust[tkr] \n ? adjust[tkr].split('+')\n : [desired[0],0]).map(Number);\n let f = Math.min(1,(hp - Math.min(hp,np))/(hp-lp));\n let tot1 = 0; // How much of this crypto is off the Exchange?\n let ov = 0; // What is the value of everything else?\n const tt = {};\n\n // If new price beyond range, adjust range, recalculate factor.\n if(np > hp || np < lp) {\n [hp,lp] = [hp,lp].map(x => x*(np/(np<lp?lp:hp)));\n f = Math.min(1,(hp - Math.min(hp,np))/(hp-lp));\n }\n Array.from<string>(portfolio.Tickers)\n .forEach((pt)=>{tt[pt]=portfolio[pt];\n });\n portfolio.Savings.forEach((s) => { s.assets.forEach((aa) => {\n tot1 += aa.ticker===tkr?aa.amount:0;\n ov += [tkr,'ZUSD'].includes(aa.ticker)?0:aa.amount;\n });});\n Object.keys(tt).forEach((s) => {\n ov += [tkr,'ZUSD'].includes(s)\n ? 0\n : tt[s][3] * tt[s][1]; });\n const a = tot1 + tt[tkr][3];\n const t2 = t + (dp*(p*a + ov));\n const t2s = t + (dp*p*a); // If other asset values are constant.\n const a2 = (b+ma*f) * t2/np;\nconsole.log(\"[p,np,dp,t,hp,lp,b,ma,f,tot1,ov,a,a2,t2,t2s]:\",\n [p,np,dp,t,hp,lp,b,ma,f,tot1,ov,a,a2,t2,t2s]);\n return a2 - a;\n }\n\n // getLev is NOT idempotent: It depletes availability.\n // ---------------------------------------------------\n function getLev(portfolio2,buysell,price,amt,market,posP) {\n let lev = 'none';\n const pnum = portfolio.Numeraire;\n const psym = findPair(market,pnum,1).base;\n if(buysell === 'buy') {\n if(1*price > 1*portfolio[psym][1] && posP)\n return `Buying ${market} @ ${price} isn't a limit order.`;\n if(price*amt > 1*portfolio[pnum][2]) { // #USD Refactor - This doesn't support leverage\n lev = '2'; // on non-USD pairs. Hunt ZUSD and add basePair(pair) to get base.\n } else {\n portfolio[pnum][2] -= price*amt; // #USD Refactor and basePair()\n }\n } else {\n if(price*1 < 1*portfolio[psym][1] && posP) return `Selling ${market} @ ${price} isn't a limit order.`;\n // console.log(\"We have \"+portfolio[market][2]+\" \"+market);\n if(amt*1 > 1*portfolio[psym][2]) {\n lev = '2';\n } else {\n portfolio[psym][2] -= amt;\n }\n // console.log(\"Now we have \"+portfolio[market][2]+\" \"+market);\n }\n if(FLAGS.verbose) console.log(`Leverage will be ${lev}`);\n return lev;\n }\n\n // We want extend() to update allocation for ranges\n // and thereby set the amount properly.\n // ------------------------------------------------\n async function listOpens(isFresh=false) {\n const response = await kapi('OpenOrders');\n const opens = response.result.open;\n let comps:any[] = []; // Orders resulting from partial executions\n let bSidesR:BothSidesRef[] = []; // Which userrefs have both buys and sells.\n let bSidesP:BothSidesPair[] = []; // Find highest sell and lowest buy for a pair.\n // let ci; let oo; let od; let rv; let ur; let op; let cp; let gpi; let gp; let ct; \n const pnum = portfolio.Numeraire;\n // Index for comps, Closing Price, index to grid prices,\n // and bs is \"both sides\", holding an array of objects\n // holding userref, and two booleans, buy and sell.\n\n await initGrid(); // Also sets portfolio['G'] (the grid).\n const gPrices = portfolio.G;\n if(Object.keys(opens).length === 0) {\n console.log(\"There are no open orders.\");\n return;\n }\n\n // Save the old order array so we can see the diff\n // -----------------------------------------------\n const oldRefs: string[] = [];\n if(portfolio && portfolio.O) {\n portfolio.O.forEach((x) => { oldRefs.push(x[0]); });\n }\n // With the list of open orders (opens) we will:\n // * Build bSidesR (Refs - which UserRefs have both buys and sells)\n // * Build bSidesP (Pair - to find highest sell and lowest buy for each pair)\n // * Identify orders that are new and orders that are now gone\n // * Create an array of orders (\"comps\") resulting from conditional closes\n // so that we can combine them into a new order with its own conditional close.\n // * Update how much of each asset remains available (not reserved for these\n // open orders).\n [bSidesR, bSidesP, comps] = processOpens(opens, oldRefs, isFresh);\n\n let nexes = 0; // Orders not requiring extension\n\n const usdEntries = Object.entries(comps).filter(([comp]) => /USD/.test(comp));\n await Promise.all(usdEntries.map(async ([comp, c]) => {\n let bs; \n let pair:string; \n let sym;\n let price:string;\n let gp = gPrices.find(gprice => gprice.userref===c.userref);\n bs = bSidesR.find(b => b.userref===c.userref);\n if(!gp) {\n gp = {userref:c.userref,buy:'?',sell:'?',bought:0,sold:0};\n gPrices.push(gp);\n console.log(gp.userref,`(${comp.slice(-4)})`,'buy:',gp.buy,'sell:',gp.sell);\n }\n gp[c.ctype] = String(c.open);\n gp[c.type] = c.price;\n [,pair,price] = /([A-Z]+)([0-9.]+)/.exec(comp) || ['','',''];\n sym = pairs[pair].base;\n if(FLAGS.verbose) console.log(`Checking: ${ c.type } ${\n sym } ${ price } ${ toDec(c.total,4)\n }${c.open ? ` to ${c.ctype}-close @${c.open}` : '' } (${ c.userref }):`);\n if(!isNaN(c.open)) {\n if(!c.hasClose) { // If any doesn't have a close, combine them and add one.\n console.log(421,Object.values(c.ids));\n const cleared = await kill(c.ids.length>1?c.ids:c.ids[0], portfolio.O);\n if( cleared.result.descr === 'Ignored') \n throw new Error('No such order(s).');\n await order(c.type,sym,price, toDec(c.total,4),\n c.lev,c.userref,c.open);\n if(FLAGS.verbose) console.log(425,\n {buysell:c.type,sym,price,lev:c.lev,ur:c.userref,close:c.open});\n // eslint-disable-next-line no-param-reassign\n c.hasClose = true;\n // Store the trades in gp\n // ----------------------\n const traded = c.type==='buy' ? 'sold' : 'bought';\n gp[traded]+=c.total;\n }\n // Do we need to extend the grid?\n // If we don't have a buy and a sell, then yes.\n // --------------------------------------------\n bs = bSidesP.find(b => b.pair===c.sym); // Was sym+'USD' but #USD Refactor\n if(bs && bs.buy && bs.sell) {\n // console.log(\"Still between buy and sell.\");\n nexes += 1;\n } else if(bs && bs.price===c.price) { // The lowest sell or highest buy\n if(gp.sell - gp.buy <= 0) {\n console.log(\"Somethig is wrong with this grid:\\n\",\n JSON.stringify(gPrices));\n return;\n }\n // Calculate price for missing side\n // --------------------------------\n const dp = gp.buy.indexOf('.');\n const decimals=10**(dp > 0\n ? gp.buy.length - dp - 1\n : 0);\n let ngp; let sp; let bp;\n if(bs.buy) { // Missing the sell\n do {\n sp = Math.round(decimals*gp.sell*gp.sell/gp.buy)/decimals;\n // eslint-disable-next-line no-param-reassign\n c.userref = makeUserRef('sell', c.sym, sp);\n // We may already have this grid price but the order\n // was deleted, so search for it first.\n ngp = gPrices.find(n => n.userref===c.userref);\n if(!ngp) {\n ngp = {userref:c.userref,\n buy:gp.sell,\n sell:String(sp),\n bought: 0, sold: 0};\n gPrices.push(ngp);\n console.log(ngp.userref,'(sell)',\n 'buy:',ngp.buy,'sell:',ngp.sell);\n console.log(249,`sell ${c.sym} ${sp} ${c.volume\n } to close at ${gp.sell}`);\n }\n // eslint-disable-next-line no-await-in-loop\n const newVol = -1 * await howMuch(sym, sp);\n if(newVol < 0) {\n console.log(\"At\",sp,\"you'd have to 'sell'\",\n `${newVol}, which means we're way out of balance.`);\n return;\n }\n // eslint-disable-next-line no-await-in-loop\n await order('sell',c.sym,sp,newVol,\n getLev(portfolio,'sell',sp,newVol,c.sym,false),c.userref,\n gp.sell);\n gp = ngp;\n } while(sp <= 1*portfolio[findPair(c.sym,pnum,1).base][1]);\n } else {\n do {\n bp = Math.round(decimals*gp.buy*gp.buy/gp.sell)/decimals;\n // eslint-disable-next-line no-param-reassign\n c.userref = makeUserRef('buy', c.sym, bp);\n // We may already have this grid price but the order\n // was deleted, so search for it first.\n ngp = gPrices.find(n => n.userref===c.userref);\n if(!ngp) {\n ngp = {userref:c.userref,\n buy:String(bp),\n sell:gp.buy,\n bought: 0, sold: 0};\n gPrices.push(ngp);\n console.log(ngp.userref,'( buy)',\n 'buy:',ngp.buy,'sell:',ngp.sell);\n console.log(264,`buy ${c.sym} ${bp} ${c.volume\n } to close at ${gp.buy}`);\n if(ngp.buy === ngp.sell) throw new Error(\"Bad Grid Point\");\n }\n // eslint-disable-next-line no-await-in-loop\n const newVol = await howMuch(sym, bp);\n if(newVol < 0) {\n console.log(\"At\",bp,\"you'd have to 'buy'\",\n `${newVol}, which means we're way out of balance.`);\n return;\n }\n // eslint-disable-next-line no-await-in-loop\n await order('buy',c.sym,bp,newVol,\n getLev(portfolio,'buy',bp,newVol,c.sym,false),c.userref,\n gp.buy);\n gp = ngp;\n } while(bp >= 1*portfolio[findPair(c.sym,pnum,1).base][1])\n }\n }\n }\n }));\n // console.log(gPrices);\n // console.log(nexes,\"orders did NOT require extension.\");\n // console.log(comps);\n }\n\n // How to adjust the size of one or more trades.\n async function lessmore(less, oid, amt, all = null) {\n const opensA:OrderEntry[] = portfolio.O;\n let matches:OrderEntry[] = [];\n let newAmt; let partial; let sym; let cp; let lev;\n if(!opensA[oid]) {\n console.log(`Order ${oid} not found.`);\n return;\n } if(all) {\n // If all, then this order only identifies the crypto and the amount to match\n // --------------------------------------------------------------------------\n const [,o] = opensA[oid];\n matches = opensA.filter(oae => {\n const [,io] = oae;\n return io.descr.pair===o.descr.pair\n && Math.round(o.vol*1000)===Math.round(io.vol*1000);\n });\n } else {\n matches.push(opensA[oid]);\n }\n const diff = (less ? -1 : 1);\n await Promise.all(matches.map(([oRef,o]) => {\n // If some has been executed, then we won't replace the old one.\n // The old one's original volume might be needed to extend the grid.\n // -----------------------------------------------------------------\n partial = o.vol_exec > 0;\n if(!/USD$/.test(o.descr.pair)) { // #USD Refactor\n console.log(\"Size update to non-USD orders is not yet supported.\");\n return;\n } if(partial && diff === -1) {\n console.log(\"Skipping\",o.descr.order,\"because of partial execution.\",o);\n } else if(!o.descr.close) {\n console.log(\"Skipping\",o.descr.order,\"because it has no close.\",o.descr);\n } else {\n [,sym] = /(.*)USD$/.exec(o.descr.pair) || ['',''];\n [cp,] = / [0-9.]+$/.exec(o.descr.close) || ['',''];\n lev = o.descr.leverage[0]==='n'?\"none\":'2';\n newAmt = Number(o.vol) + diff*Number(amt);\n if(newAmt < 0) {\n console.log(\"Skipping\",o.descr.order,\"because amount would go negative.\",o.descr);\n } else {\n console.log(\"To: \",o.descr.type,sym,o.descr.price,newAmt,cp);\n kill(oRef, portfolio.O);\n order(o.descr.type,sym,o.descr.price,newAmt,lev,o.userref,cp);\n }\n }\n }));\n if(FLAGS.verbose) console.log(\"Lessmore called with \",oid,amt,all);\n }\n\n async function marginReport(show = true) {\n const positions = await kapi(['OpenPositions',{consolidation:\"market\",ctr:60}]);\n const brief:any[] = [];\n if(Object.keys(positions.result).length) { try {\n positions.result.forEach( (pos) => { \n let vol = (1*pos.vol-1*pos.vol_closed)*(pos.type==='sell' ? -1 : 1);\n const pair = findPair(pos.pair,'',1);\n const sym = pair.base;\n const cost = Number(pos.cost);\n vol = toDec(vol,8);\n brief[sym] = {\n open: vol,\n pair: pos.pair,\n cost,\n margin: pos.margin };\n });\n if(show) console.log(475,brief);\n } catch(e){console.trace(e,positions.result);} }\n return brief;\n }\n\n function w(n,x) { \n const s = n.toString(); \n return x>s.length \n ? s+' '.repeat(x-s.length)\n : s; \n }\n\n async function report(showBalance=true) {\n const balP = await kapi('Balance'); \n const tikP = await kapi(['TradeBalance',{ctr:30}]); \n const marP = marginReport(false);\n const [bal,trb,mar] = await Promise.all([balP,tikP,marP]); \n portfolio.M = mar;\n portfolio.lastUpdate = new Date;\n Object.keys(bal.result).forEach(p => {\n if(p !== portfolio.Numeraire)\n portfolio.Pairs.add(findPair(p,portfolio.Numeraire)||'XXBTZUSD');\n });\n const tik = await kapi(['Ticker',{ pair : portfolio.Pairs.size > 0\n ? (Array.from(portfolio.Pairs)).sort().join().replace(/,,+|^,|,$/g,',') \n : 'XXBTZUSD'}]);\n portfolio.Allocation.setRanges(tik.result);\n let price; let ts; \n const zeroes: string[] = []; \n const mCosts:number[] = [];\n // Sometimes the first request for balances lists a quote from\n // a margin position after the position's crypto, and this\n // means portfolio[quote-symbol] doesn't yet exist, so we can't\n // adjust it to reflect the position. We keep track of those\n // position costs in mCosts.\n // ------------------------------------------------------------\n Object.keys(bal.result).forEach( p => {\n const sym = p;\n const amt = toDec(bal.result[p],4); let q;\n if(p !== portfolio.Numeraire) {\n ts=findPair(p,portfolio.Numeraire);\n } \n if(ts) {\n if(alts[ts]) ts = alts[ts];\n if(ts in tik.result) [price,] = tik.result[ts].c;\n } else if(portfolio.Numeraire === p) {\n if(FLAGS.verbose) console.log(\"Using 1 as value of\",p);\n price = 1;\n }\n price = toDec(price,(sym==='EOS'?4:2));\n portfolio[sym]=[amt,price,amt,amt];\n portfolio.Tickers.add(sym);\n // holdings w/reserves, price, holdings w/o reserves\n // [3] will include reserves and margin:\n if(mar[sym]) {\n portfolio[sym][0] = toDec(portfolio[sym][0]+mar[sym].open,4);\n portfolio[sym][3] = amt + Number(mar[sym].open);\n q = findPair(mar[sym].pair,'',1).quote;\n mCosts[q] =(mar[sym].open < 0 ? 1 : -1)*mar[sym].cost \n + (mCosts[q] || 0);\n }\n if(amt > 0 && showBalance) console.log(`${p}\\t${w(portfolio[sym][0],16)}${price}`);\n else if(amt === 0) zeroes.push(p);\n });\n // A new account might not have any units of the numeraire. Mine didn't.\n // The code relies on the existing balance to create the property in\n // the portfolio, so we do it manually if it isn't there yet.\n // ----------------------------------------------------------------------\n if(!portfolio[portfolio.Numeraire]) portfolio[portfolio.Numeraire] = [0,1,0,0];\n Object.entries(mCosts).forEach(([sym,cost]) => { \n if( isNaN(mCosts[sym]) )\n throw new Error(`Problem with ${sym}, ${mCosts[sym]} in mCosts (895): `);\n portfolio[sym][3] += mCosts[sym]; \n });\n // The price of the numeraire is always 1\n // --------------------------------------\n portfolio[portfolio.Numeraire][1] = 1;\n\n // If assets has only one element, this is our chance to \n // correct it to reflect all assets on the exchange.\n // -----------------------------------------------------\n if(portfolio.Allocation.assets.length < 2) \n portfolio.Allocation.getAllocation(false, false);\n\n if(showBalance) {\n console.log(`Cost\\t${trb.result.c}`);\n console.log(`Value\\t${trb.result.v}`);\n console.log(`P & L\\t${trb.result.n}`);\n Object.keys(mar).forEach( s => {\n if(portfolio[s]) {\n console.log(`${s}: ${portfolio[s][2]} outright, and ${mar[s].open} on margin.`);\n } else {\n console.log(`Did not find ${s} in portfolio!`);\n }\n });\n }\n if(zeroes.length > 0 && showBalance) \n console.log(\"0-unit assets skipped: \",zeroes.join(','));\n // console.log(portfolio);\n // showState();\n await listOpens(true);\n }\n\n // How to see a list of orders, open or closed.\n async function list(args) {\n if(args[1] === '?') {\n console.log(\"Usage: list [X] [ur]\\n\" +\n \"X can be C or CR to see closed orders, and if so, then\\n\" +\n \"ur can be a userref and only those trades will be listed.\\n\" +\n \"If ur is less than 10000, it will tell the bot how many\\n\" +\n \"closed orders to return. To collect early orders, use a\\n\" +\n \"negative number. To ignore locally stored orders, use CR.\\n\" +\n \"X can also be a ticker (UPPER CASE) to see orders for it.\\n\" +\n \"Otherwise, X can be userref, opentm, vol, vol_exec, price,\\n\" +\n \"or userref and this will cause the specified field to be\\n\" +\n \"listed first, and the list to be ordered by that field.\");\n return;\n }\n if(!portfolio.O) await report(false);\n const sortedA:OrderEntry[] = []; \n let orders:OrderEntry[] = portfolio.O;\n if( ['C','CR'].includes(args[1]) ) {\n if(args[1] === 'CR') {\n console.log(\"Restting closed orders record.\");\n portfolio.Closed = {orders: {}, offset: 0};\n if(portfolio.Extra) delete portfolio.Extra.gemClosed;\n save();\n return;\n }\n let count = 50; \n let ur = args[2] ? Number(args.pop()) : 0;\n const early = ur < 0; \n if(ur && !isNaN(ur) && ur < 10000) {\n count = Math.abs(ur);\n ur = 0;\n }\n orders = [];\n const closed = await moreOrders(early ? -1 : count);\n (early ? closed.keysFwd() : closed.keysBkwd())\n .forEach((o) => {\n const oo = closed.orders[o];\n if(orders.length < count && (!ur || oo.userref===ur)) \n orders.push([o,oo]);\n }\n );\n console.log(\"Orders.length:\",orders.length,\"Era:\",\n early ? \"Earliest\" : \"Latest\");\n // Either way, we display the latest at the bottom by:\n if(!closed.forward) orders.reverse();\n args.pop();\n const isMore = !portfolio.Closed.hasFirst;\n console.log(`We have collected ${ isMore\n ? portfolio.Closed.keysFwd().length : \"all\"\n } orders. ${ isMore ? \"Try again for more.\" : \"\" }`);\n }\n orders.forEach((x,i) => {\n const ld = x[1].descr;\n const partDone = ![x[1].vol,\"0.00000000\"].includes(x[1].vol_exec);\n const ldo = partDone\n ? `${ld.type} ${x[1].vol_exec} ${ld.pair} @ limit ${x[1].price}`\n : ld.order;\n if(args.length===1 || RegExp(args[1]).test(ldo))\n console.log(`${x[0]} ${i+1} ${ldo} ${x[1].userref\n } ${(partDone || x[1].status === \"closed\")\n ? new Date(1000*x[1].closetm).toISOString()\n : x[1].descr.close}`);\n else if(x[1][args[1]]) sortedA[i+1]=x;\n else if(x[1].descr[args[1]]) sortedA[i+1]=x;\n });\n if(sortedA.length > 0) {\n sortedA.sort((a1,b1) => {\n let a; let b;\n if(a1[1].descr[args[1]]) {\n a = a1[1].descr[args[1]];\n b = b1[1].descr[args[1]];\n } else {\n a = a1[1][args[1]];\n b = b1[1][args[1]];\n }\n return isNaN(a)\n ? a.localeCompare(b)\n : a - b;\n });\n console.log(\"Outputting sortedA...\");\n sortedA.forEach((x,i) => {\n const ldo = x[1].descr.order;\n console.log(i+1, x[1].descr[args[1]]\n ? x[1].descr[args[1]] : x[1][args[1]],\n ldo,x[1].userref,x[1].descr.close);\n });\n };\n }\n\n // How to recreate an order with the correct userref.\n async function refnum(opensA,oid,newRef) {\n if(!opensA[oid]) {\n console.log(`Order ${oid} not found.`);\n return;\n } \n const [oRef,o] = opensA[oid];\n \n if(!/USD$/.test(o.descr.pair)) {\n console.log(\"Userref update to non-USD pairs is not yet supported.\");\n return;\n }\n if(o.userref === 0) {\n const bs=o.descr.type;\n const sym=(/^([A-Z]+)USD/.exec(o.descr.pair) || ['',''])[1];\n const p=o.descr.price;\n const amt=toDec(Number(o.vol) - Number(o.vol_exec),4);\n const lev=o.descr.leverage[0]==='n'?\"none\":'2';\n console.log(`Attempting ${bs} ${sym} ${p} ${amt} ${lev} ${newRef}...`);\n await kill(oid+1, opensA);\n await order(bs,sym,p,amt,lev,newRef);\n } else {\n console.log(`${oRef} already has userref ${o.userref}`);\n }\n }\n\n // How to alter an order so we don't borrow to execute it.\n async function deleverage(opensA,oid,undo=false) {\n let placed;\n if(!opensA[oid]) {\n console.log(`Order ${oid} not found.`);\n return;\n } \n const [oRef,o] = opensA[oid];\n \n if(!/USD$/.test(o.descr.pair)) {\n console.log(\"Creating/deleveraging non-USD pairs is not yet supported.\");\n return;\n }\n // eslint-disable-next-line no-bitwise\n if(undo !== (o.descr.leverage === 'none')) {\n console.log(`${oRef} is ${ undo ? \"already leveraged\" : \"not leveraged.\"}`);\n return;\n }\n if(!o.descr.close) {\n placed = await order(o.descr.type,(/^([A-Z]+)USD/.exec(o.descr.pair)||[])[1],\n o.descr.price,toDec(Number(o.vol) - Number(o.vol_exec),4),\n (undo ? '2' : 'none'),o.userref);\n } else {\n placed = await order(o.descr.type,(/^([A-Z]+)USD/.exec(o.descr.pair)||[])[1],\n o.descr.price,toDec(Number(o.vol) - Number(o.vol_exec),4),\n (undo ? '2' : 'none'),o.userref,\n Number((/[0-9.]+$/.exec(o.descr.close)||[])[0]) );\n }\n if(placed.txid \n && /^[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+$/.test(placed.txid)) { // Depends on Exchange's TxID\n await kill(oid+1, opensA);\n }\n }\n\n // How to set the price of a grid point\n async function set(ur,type,price) {\n const p = portfolio;\n if(ur && price) {\n let gp = p.G.find(g => g.userref===ur);\n if(!gp) {\n gp = {userref:Number(ur),buy:'?',sell:'?'};\n p.G.push(gp);\n }\n console.log(405,gp);\n gp[type] = price;\n }\n p.G.sort((a,b) => a.userref-b.userref);\n let count = 0; let once = false;\n let since = lCOts; let haveAll = false;\n const closed = await moreOrders(50);\n // eslint-disable-next-line no-param-reassign\n p.Closed = closed;\n // If p.Closed.hasFirst, then we have\n // collected all completed orders and we can search them\n // for this Userref.\n if(p.Closed.hasFirst) {\n haveAll = true;\n once = false; // We have everything, so we can update all grid points.\n if(!once) console.log(\"All orders have been retrieved.\");\n }\n let profits = 0; \n await Promise.all(p.G.map(async (x) => {\n let f; \n let data: any; \n let drc: { [orderId: string]: Order; }; \n let datad; \n since = new Date().getTime()/1000;\n f = toDec(((x.sell-x.buy)*Math.min(x.bought,x.sold)),2);\n if(!isNaN(f) && (once || x.since)) profits += f;\n else if(!once && !x.open && x.userref !== 0) { // We do this once for each call to set\n // and remember which grid points are in play so need to stay.\n if(!haveAll) {\n once = true;\n data = await kapi(['ClosedOrders',{userref:x.userref}]);\n drc = data.result?.closed || {};\n // For trades with a close price, we can search for and include\n // any 'other' grid point that is only different because it\n // started on the other side.\n let closePrice; let aur; // Alternate UserRef\n // eslint-disable-next-line no-param-reassign\n x.bought = 0; x.sold = 0;\n if(drc && Object.values(drc).length > 0) {\n count = data.result.count;\n // Check for a close and build alternate userRef\n const {close} = Object.values(drc)[0].descr;\n if(close) {\n closePrice = Number(close.match(/[0-9.]+/)[0]);\n aur = RegExp(`1?[0-9]{3}${String(closePrice).replace('.','')}`);\n aur = p.G.find((x2) => aur.test(x2.userref) && x!==x2);\n if(aur && aur.buy === x.buy) {\n // eslint-disable-next-line no-param-reassign\n x.aur = aur.userref;\n aur.aur = x.userref;\n const data2 = await kapi(['ClosedOrders',{userref:x.aur}]);\n const drc2 = data2.result?.closed || {};\n Object.assign(drc, drc2);\n count += data2.result.count;\n }\n }\n }\n console.log(\"Retrieved\",count,\"closed orders for\",`${x.userref }.`);\n } else { // p.Closed has ALL orders.\n // Include orders if they are sells with a close at the buy\n // price or buys with a close at the sell price.\n drc = Object.fromEntries(Object.entries(p.Closed.orders).filter((o) =>\n (!o[0].includes('-') ? false :\n ((Number(x.buy) === Number(o[1].descr.close.match(/[0-9.]+/)[0])\n && o[1].descr.type === 'sell')\n || (Number(x.sell) === Number(o[1].descr.close.match(/[0-9.]+/)[0])\n && o[1].descr.type === 'buy')))));\n if(FLAGS.verbose)\n console.log(drc.length,\"found from\",x.buy,\"to\",x.sell,\"for\",x.userref, drc);\n }\n Object.keys(drc).forEach((d) => {\n data = drc[d];\n if(data.status === 'closed' \n && data.descr.ordertype !== 'settle-position') {\n datad = data.descr;\n since = Math.min(since,data.closetm);\n // eslint-disable-next-line no-param-reassign\n x.since = since;\n // eslint-disable-next-line no-param-reassign\n x[datad.type==='buy'?'bought':'sold'] += Number(data.vol_exec);\n if(datad.close)\n {\n if(isNaN(x.buy) || isNaN(x.sell)) {\n // eslint-disable-next-line no-param-reassign\n x[datad.type] = data.price;\n // eslint-disable-next-line no-param-reassign\n x[datad.type==='buy'?'sell':'buy'] = \n Number(datad.close.match(/[0-9.]+/)[0]);\n }\n }\n }\n });\n f = toDec(((x.sell-x.buy)*Math.min(x.bought,x.sold)),2);\n data = p.O.find(o => o.userref===x.userref);\n // eslint-disable-next-line no-param-reassign\n x.open = (data !== undefined);\n if(!isNaN(f)) profits += f; // Profits from just-retrieved trades.\n }\n const s2 = (new Date((x.since>1?x.since:since)*1000)).toLocaleString();\n console.log(`${x.userref}: ${x.buy}-${x.sell\n }${(x.bought+x.sold)>0\n ? (`, bought ${toDec(x.bought,2)\n } and sold ${toDec(x.sold,2)} for ${ f\n } since ${ s2}`)\n : ''}`);\n }));\n console.log(`That's ${toDec(profits,2)} altogether.`);\n }\n\n // The bot's job is to make roundtrips. This function reports them.\n // This does not address capital gains because it doesn't take into\n // account the cost basis.\n function roundTrips() {}\n\n function showState(prefix = '') {\n const ret = `${prefix + (FLAGS.risky?'R':'.') \n + (FLAGS.safe?'S':'.')} at ${ new Date}`;\n console.log(ret);\n return ret;\n }\n\n // eslint-disable-next-line no-param-reassign\n const bot: BotInstance = {order, set, listOpens, deleverage, w, ExchangeSavings,\n refnum, list, kapi, lessmore, kill, report, howMuch,\n sleep, marginReport, getLev, showState, getExtra,\n pairInfo, showPair, FLAGS, save, basesFromPairs, findPair,\n numerairesFromPairs, init, keys, getPrice, tfc,\n getPairs, getTickers, getAlts, getPortfolio, getConfig};\n\n config.bot = bot;\n return config.bot;\n}"]}
|