For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/

Share my customized commission scheme for cryptocurrencies



  • I wrote two customized commission scheme for cryptocurrencies, one for spot market and the other for contracts:

    class CryptoSpotCommissionInfo(bt.CommissionInfo):
        '''Commission scheme for cryptocurrency spot market.
        
            Required Args:
                commission: commission fee in percentage, between 0.0 and 1.0
        '''
        params = (
            ('stocklike', True),
            ('commtype', bt.CommInfoBase.COMM_PERC), # apply % commission
        )
    
        def __init__(self):
            assert abs(self.p.commission) < 1.0 # commission is a percentage
            assert self.p.mult == 1.0
            assert self.p.margin is None
            assert self.p.commtype == bt.CommInfoBase.COMM_PERC
            assert self.p.stocklike
            assert self.p.percabs
            assert self.p.leverage == 1.0
            assert self.p.automargin == False
    
            super().__init__()
    
        def getsize(self, price, cash):
            '''Support fractional size.
            
                More details at https://www.backtrader.com/blog/posts/2019-08-29-fractional-sizes/fractional-sizes/.
            '''
            return self.p.leverage * (cash / price)
    
    class CryptoContractCommissionInfo(bt.CommissionInfo):
        '''Commission scheme for cryptocurrency contracts.
        
            Including futures contracts and perpetual swap contracts.
            
            Required Args:
                commission: commission fee in percentage, between 0.0 and 1.0
                mult: leverage, for example 10 means 10x leverage
        '''
        params = (
            ('stocklike', False),
            ('commtype', bt.CommInfoBase.COMM_PERC), # apply % commission
        )
        
        def __init__(self):
            assert abs(self.p.commission) < 1.0 # commission is a percentage
            assert self.p.mult > 1.0
            assert self.p.margin is None
            assert self.p.commtype == bt.CommInfoBase.COMM_PERC
            assert not self.p.stocklike
            assert self.p.percabs
            assert self.p.leverage == 1.0
            self.p.automargin = 1 / self.p.mult
    
            super().__init__()
    
        def getsize(self, price, cash):
            '''Support fractional size.
            
                More details at https://www.backtrader.com/blog/posts/2019-08-29-fractional-sizes/fractional-sizes/.
            '''
            return self.p.leverage * (cash / price)
    
        def _getcommission(self, size, price, pseudoexec):
            '''Percentage based commission fee.
            
                More details at https://www.backtrader.com/docu/user-defined-commissions/commission-schemes-subclassing/.
            '''
            return abs(size) * self.p.commission * price * self.p.mult
    

    Hope it helps!



  • Thank you! I'm using it myself now, slightly better than the one I had before


Log in to reply
 

});