@@ -18,8 +18,6 @@ module Bfx
18
18
cancelOrderById ,
19
19
cancelOrderByClientId ,
20
20
cancelOrderByGroupId ,
21
- submitCounterOrder ,
22
- submitCounterOrderMaker ,
23
21
dumpIntoQuote ,
24
22
dumpIntoQuoteMaker ,
25
23
netWorth ,
@@ -28,6 +26,8 @@ module Bfx
28
26
tickers ,
29
27
MkOrder (.. ),
30
28
mkOrder ,
29
+ MkCounterOrder (.. ),
30
+ mkCounterOrder ,
31
31
module X ,
32
32
)
33
33
where
@@ -332,79 +332,6 @@ cancelOrderByGroupId env gid = do
332
332
. CancelOrderMulti. ByOrderGroupId
333
333
$ Set. singleton gid
334
334
335
- submitCounterOrder ::
336
- ( MonadThrow m ,
337
- MonadUnliftIO m
338
- ) =>
339
- Env ->
340
- OrderId ->
341
- CounterRates ->
342
- SubmitOrder. Options ->
343
- m Order
344
- submitCounterOrder =
345
- mkSubmitCounterOrder submitOrder
346
-
347
- submitCounterOrderMaker ::
348
- ( MonadThrow m ,
349
- MonadUnliftIO m
350
- ) =>
351
- Env ->
352
- OrderId ->
353
- CounterRates ->
354
- SubmitOrder. Options ->
355
- m Order
356
- submitCounterOrderMaker =
357
- mkSubmitCounterOrder submitOrderMaker
358
-
359
- mkSubmitCounterOrder ::
360
- ( MonadThrow m ,
361
- MonadUnliftIO m
362
- ) =>
363
- ( Env -> SubmitOrder. Request -> m Order
364
- ) ->
365
- Env ->
366
- OrderId ->
367
- CounterRates ->
368
- SubmitOrder. Options ->
369
- m Order
370
- mkSubmitCounterOrder submit env id0 rates opts = do
371
- remOrder <- getOrder env id0
372
- let sym = orderSymbol remOrder
373
- case orderBuyOrSell remOrder of
374
- Buy | orderStatus remOrder == Executed -> do
375
- counter <-
376
- mkCounterOrder
377
- CounterArgs
378
- { counterArgsEnterBuyOrSell = Buy ,
379
- counterArgsEnterGrossBase =
380
- orderBaseAmount remOrder,
381
- counterArgsEnterQuotePerBase =
382
- orderRate remOrder,
383
- counterArgsRates =
384
- rates
385
- }
386
- let exitAmt = counterExitGrossBase counter
387
- let exitRate = counterExitQuotePerBase counter
388
- currentRate <-
389
- marketAveragePrice
390
- MarketAveragePrice. Request
391
- { MarketAveragePrice. buyOrSell = Sell ,
392
- MarketAveragePrice. baseAmount = exitAmt,
393
- MarketAveragePrice. symbol = sym
394
- }
395
- submit
396
- env
397
- SubmitOrder. Request
398
- { SubmitOrder. buyOrSell = Sell ,
399
- SubmitOrder. baseAmount = exitAmt,
400
- SubmitOrder. symbol = sym,
401
- SubmitOrder. rate = max exitRate currentRate,
402
- SubmitOrder. options = opts
403
- }
404
- _ ->
405
- throw
406
- $ ErrorRemoteOrderState remOrder
407
-
408
335
mkDumpIntoQuote ::
409
336
( MonadThrow m ,
410
337
MonadUnliftIO m
@@ -640,3 +567,114 @@ mkOrder args = do
640
567
where
641
568
bos = mkOrderBuyOrSell args
642
569
sym = mkOrderCurrencyPair args
570
+
571
+ data MkCounterOrder = MkCounterOrder
572
+ { mkCounterOrderEnterBuyOrSell :: BuyOrSell ,
573
+ mkCounterOrderEnterGrossBase :: MoneyAmount ,
574
+ mkCounterOrderEnterQuotePerBase :: QuotePerBase ,
575
+ mkCounterOrderCurrencyPair :: CurrencyPair ,
576
+ mkCounterOrderEnterFee :: FeeRate ,
577
+ mkCounterOrderExitFee :: FeeRate ,
578
+ mkCounterOrderProfit :: ProfitRate
579
+ }
580
+ deriving stock
581
+ ( Eq ,
582
+ Ord ,
583
+ Show ,
584
+ Read ,
585
+ Data ,
586
+ Generic
587
+ )
588
+
589
+ mkCounterOrder ::
590
+ ( MonadThrow m ,
591
+ MonadUnliftIO m
592
+ ) =>
593
+ MkCounterOrder ->
594
+ m SubmitOrder. Request
595
+ mkCounterOrder args = do
596
+ exitBase <-
597
+ tweakMoneyAmount exitBos exitGrossBase
598
+ exitRate <-
599
+ roundQuotePerBase
600
+ . QuotePerBase
601
+ $ unMoneyAmount exitGrossQuote
602
+ / unMoneyAmount exitBase
603
+ currentRate <-
604
+ marketAveragePrice
605
+ MarketAveragePrice. Request
606
+ { MarketAveragePrice. buyOrSell = exitBos,
607
+ MarketAveragePrice. baseAmount = exitBase,
608
+ MarketAveragePrice. symbol = sym
609
+ }
610
+ let bestRate =
611
+ case exitBos of
612
+ Buy -> min exitRate currentRate
613
+ Sell -> max exitRate currentRate
614
+ pure
615
+ SubmitOrder. Request
616
+ { SubmitOrder. buyOrSell = exitBos,
617
+ SubmitOrder. baseAmount = exitBase,
618
+ SubmitOrder. symbol = sym,
619
+ SubmitOrder. rate = bestRate,
620
+ SubmitOrder. options = SubmitOrder. optsDef
621
+ }
622
+ where
623
+ sym :: CurrencyPair
624
+ sym = mkCounterOrderCurrencyPair args
625
+ enterBos :: BuyOrSell
626
+ enterBos = mkCounterOrderEnterBuyOrSell args
627
+ exitBos :: BuyOrSell
628
+ exitBos = nextEnum enterBos
629
+ enterRate :: QuotePerBase
630
+ enterRate = mkCounterOrderEnterQuotePerBase args
631
+ enterBase :: MoneyAmount
632
+ enterBase = mkCounterOrderEnterGrossBase args
633
+ enterNetLoss :: MoneyAmount
634
+ enterNetLoss =
635
+ MoneyAmount $ case enterBos of
636
+ Buy ->
637
+ -- Quote
638
+ unMoneyAmount enterBase
639
+ * unQuotePerBase enterRate
640
+ Sell ->
641
+ -- Base
642
+ unMoneyAmount enterBase
643
+ enterNetGain :: MoneyAmount
644
+ enterNetGain =
645
+ MoneyAmount $ case enterBos of
646
+ Buy ->
647
+ -- Base
648
+ unMoneyAmount enterBase
649
+ * (1 - unFeeRate enterFeeRate)
650
+ Sell ->
651
+ -- Quote
652
+ unMoneyAmount enterBase
653
+ * unQuotePerBase enterRate
654
+ * (1 - unFeeRate enterFeeRate)
655
+ exitGrossGain :: MoneyAmount
656
+ exitGrossGain =
657
+ --
658
+ -- Buy = Quote
659
+ -- Sell = Base
660
+ --
661
+ MoneyAmount
662
+ $ unMoneyAmount enterNetLoss
663
+ * (1 + unProfitRate profitRate)
664
+ / (1 - unFeeRate exitFeeRate)
665
+ exitGrossBase :: MoneyAmount
666
+ exitGrossBase =
667
+ case enterBos of
668
+ Buy -> enterNetGain
669
+ Sell -> exitGrossGain
670
+ exitGrossQuote :: MoneyAmount
671
+ exitGrossQuote =
672
+ case enterBos of
673
+ Buy -> exitGrossGain
674
+ Sell -> enterNetGain
675
+ enterFeeRate :: FeeRate
676
+ enterFeeRate = mkCounterOrderEnterFee args
677
+ exitFeeRate :: FeeRate
678
+ exitFeeRate = mkCounterOrderExitFee args
679
+ profitRate :: ProfitRate
680
+ profitRate = mkCounterOrderProfit args
0 commit comments