@@ -65,23 +65,22 @@ symbolsDetails =
65
65
Generic. pub @ 'SymbolsDetails [] ()
66
66
67
67
marketAveragePrice ::
68
- forall (act :: BuyOrSell ) m .
68
+ forall (bos :: BuyOrSell ) m .
69
69
( MonadUnliftIO m ,
70
70
MonadThrow m ,
71
- ToRequestParam (Money (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| act )),
72
- Typeable act
71
+ SingI bos
73
72
) =>
74
- Money ( Tags 'Unsigned |+| 'Base |+| ' MoneyAmount |+| act ) ->
73
+ MoneyAmount ->
75
74
CurrencyPair ->
76
- m ( Money ( Tags 'Unsigned |+| ' QuotePerBase |+| act ))
77
- marketAveragePrice amt sym =
75
+ m QuotePerBase
76
+ marketAveragePrice baseAmt sym =
78
77
Generic. pub
79
78
@ 'MarketAveragePrice
80
- [ SomeQueryParam " amount" amt ,
79
+ [ SomeQueryParam " amount" (demote @ bos , Base , baseAmt) ,
81
80
SomeQueryParam " symbol" sym
82
81
]
83
82
MarketAveragePrice. Request
84
- { MarketAveragePrice. amount = amt ,
83
+ { MarketAveragePrice. baseAmount = baseAmt ,
85
84
MarketAveragePrice. symbol = sym
86
85
}
87
86
@@ -119,9 +118,9 @@ spendableExchangeBalance ::
119
118
) =>
120
119
Env ->
121
120
CurrencyCode ->
122
- m ( Money ( Tags 'Unsigned |+| ' MoneyAmount))
121
+ m MoneyAmount
123
122
spendableExchangeBalance env cc =
124
- maybe (Tagged 0 ) Wallets. availableBalance
123
+ maybe (MoneyAmount 0 ) Wallets. availableBalance
125
124
. Map. lookup Wallets. Exchange
126
125
. Map. findWithDefault mempty cc
127
126
<$> wallets env
@@ -215,8 +214,8 @@ verifyOrder env id0 req = do
215
214
orderClientId =
216
215
SubmitOrder. clientId opts
217
216
<|> orderClientId remOrd,
218
- orderAmount =
219
- SubmitOrder. amount req,
217
+ orderBaseAmount =
218
+ SubmitOrder. baseAmount req,
220
219
orderSymbol =
221
220
SubmitOrder. symbol req,
222
221
orderRate =
@@ -239,21 +238,21 @@ submitOrder ::
239
238
forall (bos :: BuyOrSell ) m .
240
239
( MonadUnliftIO m ,
241
240
MonadThrow m ,
242
- ToRequestParam (Money (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| bos )),
243
- ToRequestParam (Money (Tags 'Unsigned |+| 'QuotePerBase |+| bos )),
241
+ -- ToRequestParam (Money (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| bos)),
242
+ -- ToRequestParam (Money (Tags 'Unsigned |+| 'QuotePerBase |+| bos)),
244
243
Typeable bos ,
245
244
SingI bos
246
245
) =>
247
246
Env ->
248
- Money ( Tags 'Unsigned |+| 'Base |+| ' MoneyAmount |+| bos ) ->
247
+ MoneyAmount ->
249
248
CurrencyPair ->
250
- Money ( Tags 'Unsigned |+| ' QuotePerBase |+| bos ) ->
249
+ QuotePerBase ->
251
250
SubmitOrder. Options bos ->
252
251
m (Order bos 'Remote)
253
- submitOrder env amt sym rate opts = do
252
+ submitOrder env baseAmt sym rate opts = do
254
253
let req =
255
254
SubmitOrder. Request
256
- { SubmitOrder. amount = amt ,
255
+ { SubmitOrder. baseAmount = baseAmt ,
257
256
SubmitOrder. symbol = sym,
258
257
SubmitOrder. rate = rate,
259
258
SubmitOrder. options = opts
@@ -265,20 +264,22 @@ submitOrderMaker ::
265
264
forall (bos :: BuyOrSell ) m .
266
265
( MonadUnliftIO m ,
267
266
MonadThrow m ,
268
- ToRequestParam (Money (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| bos )),
269
- ToRequestParam (Money (Tags 'Unsigned |+| 'QuotePerBase |+| bos )),
270
- MoneyTags (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| bos ),
271
- MoneyTags (Tags 'Unsigned |+| 'QuotePerBase |+| bos ),
272
- HasTag bos (Tags 'Unsigned |+| 'QuotePerBase |+| bos )
267
+ Typeable bos ,
268
+ SingI bos
269
+ -- ToRequestParam (Money (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| bos)),
270
+ -- ToRequestParam (Money (Tags 'Unsigned |+| 'QuotePerBase |+| bos)),
271
+ -- MoneyTags (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| bos),
272
+ -- MoneyTags (Tags 'Unsigned |+| 'QuotePerBase |+| bos),
273
+ -- HasTag bos (Tags 'Unsigned |+| 'QuotePerBase |+| bos)
273
274
) =>
274
275
Env ->
275
- Money ( Tags 'Unsigned |+| 'Base |+| ' MoneyAmount |+| bos ) ->
276
+ MoneyAmount ->
276
277
CurrencyPair ->
277
- Money ( Tags 'Unsigned |+| ' QuotePerBase |+| bos ) ->
278
+ QuotePerBase ->
278
279
SubmitOrder. Options bos ->
279
280
m (Order bos 'Remote)
280
- submitOrderMaker env amt sym rate0 opts0 =
281
- submitOrderMakerRec @ bos env amt sym 0 rate0 opts
281
+ submitOrderMaker env baseAmt sym rate0 opts0 =
282
+ submitOrderMakerRec @ bos env baseAmt sym 0 rate0 opts
282
283
where
283
284
opts =
284
285
opts0
@@ -290,30 +291,32 @@ submitOrderMakerRec ::
290
291
forall (bos :: BuyOrSell ) m .
291
292
( MonadUnliftIO m ,
292
293
MonadThrow m ,
293
- ToRequestParam (Money (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| bos )),
294
- ToRequestParam (Money (Tags 'Unsigned |+| 'QuotePerBase |+| bos )),
295
- MoneyTags (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| bos ),
296
- MoneyTags (Tags 'Unsigned |+| 'QuotePerBase |+| bos ),
297
- HasTag bos (Tags 'Unsigned |+| 'QuotePerBase |+| bos )
294
+ Typeable bos ,
295
+ SingI bos
296
+ -- ToRequestParam (Money (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| bos)),
297
+ -- ToRequestParam (Money (Tags 'Unsigned |+| 'QuotePerBase |+| bos)),
298
+ -- MoneyTags (Tags 'Unsigned |+| 'Base |+| 'MoneyAmount |+| bos),
299
+ -- MoneyTags (Tags 'Unsigned |+| 'QuotePerBase |+| bos),
300
+ -- HasTag bos (Tags 'Unsigned |+| 'QuotePerBase |+| bos)
298
301
) =>
299
302
Env ->
300
- Money ( Tags 'Unsigned |+| 'Base |+| ' MoneyAmount |+| bos ) ->
303
+ MoneyAmount ->
301
304
CurrencyPair ->
302
305
Int ->
303
- Money ( Tags 'Unsigned |+| ' QuotePerBase |+| bos ) ->
306
+ QuotePerBase ->
304
307
SubmitOrder. Options bos ->
305
308
m (Order bos 'Remote)
306
- submitOrderMakerRec env amt sym attempt rate opts = do
307
- order :: Order bos 'Remote <- submitOrder @ bos env amt sym rate opts
309
+ submitOrderMakerRec env baseAmt sym attempt rate opts = do
310
+ order :: Order bos 'Remote <- submitOrder @ bos env baseAmt sym rate opts
308
311
if orderStatus order /= PostOnlyCancelled
309
312
then pure order
310
313
else do
311
314
when (attempt >= 10 )
312
315
. throw
313
316
. ErrorOrderState
314
317
$ SomeOrder (sing :: Sing bos ) order
315
- newRate <- Math. tweakMakerRate rate
316
- submitOrderMakerRec env amt sym (attempt + 1 ) newRate opts
318
+ newRate <- Math. tweakMakerRate (demote @ bos ) rate
319
+ submitOrderMakerRec env baseAmt sym (attempt + 1 ) newRate opts
317
320
318
321
cancelOrderMulti ::
319
322
( MonadUnliftIO m ,
@@ -376,9 +379,10 @@ submitCounterOrder ::
376
379
) =>
377
380
Env ->
378
381
OrderId ->
379
- Money (Tags 'Unsigned |+| 'FeeRate |+| 'Base) ->
380
- Money (Tags 'Unsigned |+| 'FeeRate |+| 'Quote) ->
381
- Money (Tags 'Unsigned |+| 'ProfitRate) ->
382
+ (MoneyAmount -> QuotePerBase -> Math. CounterArgs ) ->
383
+ -- Money (Tags 'Unsigned |+| 'FeeRate |+| 'Base) ->
384
+ -- Money (Tags 'Unsigned |+| 'FeeRate |+| 'Quote) ->
385
+ -- Money (Tags 'Unsigned |+| 'ProfitRate) ->
382
386
SubmitOrder. Options 'Sell ->
383
387
m (Order 'Sell 'Remote)
384
388
submitCounterOrder =
@@ -390,9 +394,7 @@ submitCounterOrderMaker ::
390
394
) =>
391
395
Env ->
392
396
OrderId ->
393
- Money (Tags 'Unsigned |+| 'FeeRate |+| 'Base) ->
394
- Money (Tags 'Unsigned |+| 'FeeRate |+| 'Quote) ->
395
- Money (Tags 'Unsigned |+| 'ProfitRate) ->
397
+ (MoneyAmount -> QuotePerBase -> Math. CounterArgs ) ->
396
398
SubmitOrder. Options 'Sell ->
397
399
m (Order 'Sell 'Remote)
398
400
submitCounterOrderMaker =
@@ -403,37 +405,33 @@ submitCounterOrder' ::
403
405
MonadThrow m
404
406
) =>
405
407
( Env ->
406
- Money ( Tags 'Unsigned |+| 'Base |+| ' MoneyAmount |+| 'Sell) ->
408
+ MoneyAmount ->
407
409
CurrencyPair ->
408
- Money ( Tags 'Unsigned |+| ' QuotePerBase |+| 'Sell) ->
410
+ QuotePerBase ->
409
411
SubmitOrder. Options 'Sell ->
410
412
m (Order 'Sell 'Remote)
411
413
) ->
412
414
Env ->
413
415
OrderId ->
414
- Money (Tags 'Unsigned |+| 'FeeRate |+| 'Base) ->
415
- Money (Tags 'Unsigned |+| 'FeeRate |+| 'Quote) ->
416
- Money (Tags 'Unsigned |+| 'ProfitRate) ->
416
+ (MoneyAmount -> QuotePerBase -> Math. CounterArgs ) ->
417
417
SubmitOrder. Options 'Sell ->
418
418
m (Order 'Sell 'Remote)
419
- submitCounterOrder' submit env id0 feeB feeQ prof opts = do
419
+ submitCounterOrder' submit env id0 mkCounter opts = do
420
420
someRemOrd@ (SomeOrder remSing remOrder) <- getOrder env id0
421
+ let sym = orderSymbol remOrder
421
422
case remSing of
422
423
SBuy | orderStatus remOrder == Executed -> do
423
- (_, exitAmt, exitRate) <-
424
+ counter <-
424
425
Math. newCounterOrder
425
- (tag @ 'Gross (orderAmount remOrder))
426
- (tag @ 'Net (orderRate remOrder))
427
- feeB
428
- feeQ
429
- (tag @ 'Quote . tag @ 'Buy $ tag @ 'Net prof)
430
- currentRate <-
431
- marketAveragePrice (unTag @ 'Net exitAmt)
432
- $ orderSymbol remOrder
426
+ . mkCounter (orderBaseAmount remOrder)
427
+ $ orderRate remOrder
428
+ let exitAmt = Math. counterExitNetBaseLoss counter
429
+ let exitRate = Math. counterExitQuotePerBase counter
430
+ currentRate <- marketAveragePrice @ 'Sell exitAmt sym
433
431
submit
434
432
env
435
- (unTag @ 'Net exitAmt)
436
- (orderSymbol remOrder)
433
+ exitAmt
434
+ sym
437
435
(max exitRate currentRate)
438
436
opts
439
437
_ ->
@@ -445,9 +443,9 @@ dumpIntoQuote' ::
445
443
MonadThrow m
446
444
) =>
447
445
( Env ->
448
- Money ( Tags 'Unsigned |+| 'Base |+| ' MoneyAmount |+| 'Sell) ->
446
+ MoneyAmount ->
449
447
CurrencyPair ->
450
- Money ( Tags 'Unsigned |+| ' QuotePerBase |+| 'Sell) ->
448
+ QuotePerBase ->
451
449
SubmitOrder. Options 'Sell ->
452
450
m (Order 'Sell 'Remote)
453
451
) ->
@@ -457,12 +455,12 @@ dumpIntoQuote' ::
457
455
m (Order 'Sell 'Remote)
458
456
dumpIntoQuote' submit env sym opts = do
459
457
amt <- spendableExchangeBalance env (currencyPairBase sym)
460
- rate <- marketAveragePrice (tag @ 'Sell $ tag @ 'Base amt) sym
458
+ rate <- marketAveragePrice @ 'Sell amt sym
461
459
catchAny
462
- (submit env (tag @ 'Sell $ tag @ 'Base amt) sym rate opts)
460
+ (submit env amt sym rate opts)
463
461
. const
464
462
$ do
465
- newAmt <- Math. tweakMoneyPip (tag @ ' Sell $ tag @ 'Base amt)
463
+ newAmt <- Math. tweakMoneyPip Sell amt
466
464
submit env newAmt sym rate opts
467
465
468
466
dumpIntoQuote ::
@@ -493,7 +491,7 @@ netWorth ::
493
491
) =>
494
492
Env ->
495
493
CurrencyCode ->
496
- m ( Money ( Tags 'Unsigned |+| ' MoneyAmount))
494
+ m MoneyAmount
497
495
netWorth env ccq = do
498
496
-- Simplify fees (assume it's alwayus Maker and Crypto2Crypto)
499
497
fee <- FeeSummary. makerCrypto2CryptoFee <$> feeSummary env
@@ -502,42 +500,34 @@ netWorth env ccq = do
502
500
res <-
503
501
foldrM
504
502
( \ (ccb, bs1) totalAcc -> do
505
- let localAcc :: Money ( Tags 'Unsigned |+| 'MoneyAmount) =
503
+ let localAcc =
506
504
foldr
507
505
( \ amt acc ->
508
- Wallets. balance amt `addMoney` acc
506
+ unMoneyAmount ( Wallets. balance amt) + acc
509
507
)
510
- ( Tagged 0 )
508
+ 0
511
509
$ Map. elems bs1
512
510
if ccb == ccq
513
- then pure $ totalAcc `addMoney` localAcc
511
+ then pure $ totalAcc + localAcc
514
512
else do
515
513
-- In this case we are dealing with Base
516
514
-- money, so we need transform from Quote
517
515
sym <- currencyPairCon (from ccb) $ Tagged @ 'Quote ccq
518
- baseMoney ::
519
- Money (Tags 'Unsigned |+| 'Base |+| 'Sell |+| 'MoneyAmount) <-
520
- fmap (tag @ 'Base . tag @ 'Sell) $ roundMoney localAcc
521
- if baseMoney == Tagged 0
516
+ baseMoney <- roundMoneyAmount $ MoneyAmount localAcc
517
+ if baseMoney == MoneyAmount 0
522
518
then pure totalAcc
523
519
else do
524
- price :: Money ( Tags 'Unsigned |+| 'QuotePerBase |+| 'Sell) <-
525
- marketAveragePrice baseMoney sym
520
+ price <-
521
+ marketAveragePrice @ 'Sell baseMoney sym
526
522
pure
527
- . addMoney totalAcc
528
- . unTag @ 'Net
529
- . unTag @ 'Sell
530
- . unTag @ 'Quote
531
- $ deductFee
532
- @ (Tags 'Unsigned |+| 'FeeRate |+| 'Maker)
533
- fee
534
- ( tag @ 'Gross
535
- $ exchangeMoney @ (Tags 'Unsigned |+| 'Sell)
536
- price
537
- baseMoney
523
+ $ ( totalAcc
524
+ + ( unMoneyAmount baseMoney
525
+ * unQuotePerBase price
526
+ * (1 - unFeeRate fee)
527
+ )
538
528
)
539
529
)
540
- ( Tagged 0 )
530
+ 0
541
531
. filter
542
532
( \ (cc, _) ->
543
533
fromRight
@@ -548,7 +538,7 @@ netWorth env ccq = do
548
538
|| (cc == ccq)
549
539
)
550
540
$ Map. assocs xs0
551
- roundMoney res
541
+ roundMoneyAmount $ MoneyAmount res
552
542
553
543
candlesLast ::
554
544
( MonadUnliftIO m ,
0 commit comments