Maurizio-Ciullo

Strategia ITB - Mean Reversion GBP/CAD 30 MIN

Apr 19th, 2022 (edited)
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.04 KB | None | 0 0
  1.                                                  
  2.                                               Strategia ITB - Mean Reversion GBP/CAD 30 MIN
  3.  
  4. !pip install backtrader
  5. !pip install matplotlib==3.2.2
  6.  
  7. ------------------------------------------------------------------------------------------------
  8. import backtrader as bt
  9.  
  10.  
  11. class TrendInversionBollinger(bt.Strategy):
  12.    
  13.     params = (
  14.         ('atrPeriodo', 14),
  15.         ('atrMin', 0.0020),
  16.         ('stopLoss', 0.0020),
  17.         ('takeProfit', 0.0030),
  18.         ('printLog', True),
  19.     )
  20.  
  21.     def __init__(self):
  22.         self.bb = bt.ind.BollingerBands(period=20, devfactor=2, plot=True, plotname='Bollinger Bands', subplot=False)
  23.         self.atr = bt.ind.ATR(period=self.params.atrPeriodo)
  24.  
  25.         self.openPrice = self.datas[0].open
  26.         self.highPrice = self.datas[0].high
  27.         self.lowPrice = self.datas[0].low
  28.         self.closePrice = self.datas[0].close
  29.  
  30.         self.entryShort = bt.ind.CrossDown(self.highPrice, self.bb.lines.top)
  31.  
  32.     def next(self):
  33.  
  34.         if self.position.size == 0 and self.entryShort and self.atr >= self.params.atrMin:
  35.            
  36.             stopLoss = self.closePrice + self.params.stopLoss
  37.             takeProfit = self.closePrice - self.params.takeProfit
  38.             self.sell_bracket(size=50000, stopprice=stopLoss, limitprice=takeProfit, exectype=bt.Order.Market)
  39.  
  40.     def log(self, txt):
  41.         print("[{} {}] {}".format(self.datas[0].datetime.date(), self.datas[0].datetime.time(), txt))
  42.  
  43.     def notify_order(self, order):
  44.         if order.status == order.Completed and self.params.printLog:
  45.             self.log("Inserito ordine {}@{} size@{}".format('BUY' if order.isbuy() else 'SELL', order.executed.price,
  46.                                                             order.size))
  47.  
  48.     def notify_trade(self, trade):
  49.         if trade.isclosed and self.params.printLog:
  50.             self.log("Trade chiuso: PNL Lordo@{} PNL netto@{}".format(trade.pnl, trade.pnlcomm))
  51. ------------------------------------------------------------------------------------------------
  52. import backtrader as bt
  53. from datetime import datetime
  54.  
  55. from backtrader import CommInfoBase
  56.  
  57.  
  58. initCapital = 10000
  59. cerebro = bt.Cerebro()
  60.  
  61. cerebro.broker.setcommission(leverage=30, commission=0.00001, commtype=CommInfoBase.COMM_FIXED)
  62. cerebro.broker.set_slippage_fixed(0.0001)
  63.  
  64.  
  65. data = bt.feeds.GenericCSVData(
  66.     dataname='FXCM_GBPCAD_30m.csv',
  67.     timeframe=bt.TimeFrame.Minutes,
  68.     compression=30,
  69.     fromdate=datetime(2018, 1, 1),
  70.     todate=datetime(2021, 10, 27),
  71.     dtformat=('%Y%m%d'),
  72.     tmformat=('%H%M'),
  73.     date=0,
  74.     time=1,
  75.     open=2,
  76.     high=3,
  77.     low=4,
  78.     close=5,
  79.     volume=6,
  80.     openinterest=-1
  81. )
  82.  
  83. cerebro.adddata(data)
  84. cerebro.broker.setcash(initCapital)
  85.  
  86. cerebro.addanalyzer(bt.analyzers.DrawDown, _name="drawdown")
  87. cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name="trade")
  88. cerebro.addanalyzer(bt.analyzers.TimeReturn, _name="timereturn")
  89.  
  90.  
  91. cerebro.addstrategy(TrendInversionBollinger)
  92.  
  93. result = cerebro.run(tradehistory=True)
  94. ------------------------------------------------------------------------------------------------
  95.     finalCapital = initCapital + result[0].analyzers.trade.get_analysis()['pnl']['net']['total']
  96.  
  97.     print("+++++++++++++++++++++++++++++++++++++++++++++++++++++")
  98.     print("+++++++++++++++++++++ Backtest ++++++++++++++++++++++")
  99.     print("+++++++++++++++++++++++++++++++++++++++++++++++++++++")
  100.     print("")
  101.     print("Ordini Totali..........: {}".format(result[0].analyzers.trade.get_analysis()['total']['total']))
  102.     print("Ordini Streak vinti....: {}".format(result[0].analyzers.trade.get_analysis()['streak']['won']['current']))
  103.     print("Ordini Streak persi....: {}".format(result[0].analyzers.trade.get_analysis()['streak']['lost']['current']))
  104.     print("Profit Factor..........: {}".format(
  105.         abs(result[0].analyzers.trade.get_analysis()['won']['pnl']['total']) / abs(
  106.             result[0].analyzers.trade.get_analysis()['lost']['pnl']['total'])))
  107.     print("Drawdown Max...........: {}".format(result[0].analyzers.drawdown.get_analysis()['max']['drawdown']))
  108.     print("Capitale finale........: {}".format(finalCapital))
  109.     print("Profitto %.............: {}".format(((finalCapital - initCapital) / initCapital) * 100))
  110.     print("PNL lorda..............: {}".format(result[0].analyzers.trade.get_analysis()['pnl']['gross']['total']))
  111.     print("PNL netta..............: {}".format(result[0].analyzers.trade.get_analysis()['pnl']['net']['total']))
  112.     print("---------------- Vincite -------------")
  113.     print("Trade totali...........: {}".format(result[0].analyzers.trade.get_analysis()['won']['total']))
  114.     print("Trade PNL totale.......: {}".format(result[0].analyzers.trade.get_analysis()['won']['pnl']['total']))
  115.     print("Trade PNL medio........: {}".format(result[0].analyzers.trade.get_analysis()['won']['pnl']['average']))
  116.     print("Trade PNL massimo......: {}".format(result[0].analyzers.trade.get_analysis()['won']['pnl']['max']))
  117.     print("---------------- Perdite -------------")
  118.     print("Trade totali...........: {}".format(result[0].analyzers.trade.get_analysis()['lost']['total']))
  119.     print("Trade PNL totale.......: {}".format(result[0].analyzers.trade.get_analysis()['lost']['pnl']['total']))
  120.     print("Trade PNL medio........: {}".format(result[0].analyzers.trade.get_analysis()['lost']['pnl']['average']))
  121.     print("Trade PNL massimo......: {}".format(result[0].analyzers.trade.get_analysis()['lost']['pnl']['max']))
  122.     print("----------------- Short ---------------")
  123.     print("Trade totali...........: {}".format(result[0].analyzers.trade.get_analysis()['short']['total']))
  124.     print("Trade vinti............: {}".format(result[0].analyzers.trade.get_analysis()['short']['won']))
  125.     print("Trade persi............: {}".format(result[0].analyzers.trade.get_analysis()['short']['lost']))
  126.     print("Win/Loss Ratio.........: {}".format(
  127.         result[0].analyzers.trade.get_analysis()['short']['won'] / result[0].analyzers.trade.get_analysis()['short'][
  128.             'total']))
  129.     print("Trade PNL totale.......: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['total']))
  130.     print("Trade PNL Medio........: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['average']))
  131.     print(
  132.         "Trade Vincite Totali...: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['won']['total']))
  133.     print("Trade Vincita Media....: {}".format(
  134.         result[0].analyzers.trade.get_analysis()['short']['pnl']['won']['average']))
  135.     print("Trade Vincita Massima..: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['won']['max']))
  136.     print(
  137.         "Trade Perdita Totali...: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['lost']['total']))
  138.     print("Trade Perdita Media....: {}".format(
  139.         result[0].analyzers.trade.get_analysis()['short']['pnl']['lost']['average']))
  140.     print("Trade Perdita Massima..: {}".format(result[0].analyzers.trade.get_analysis()['short']['pnl']['lost']['max']))
Add Comment
Please, Sign In to add comment