最初に、完成形のPRを貼っておく。
まず、持っているポジションを参照して、その反対となる売買を同数でできるメソッドを用意した。ポジションがない場合、途中で早期リターンする。
# https://github.com/dogwood008/stock-trading-system/pull/25/commits/f5a59d360c2a7b2eb006815394b257500d498587 def _close_operation(self): position: bt.position.Position = self.position size: int = position.size # https://github.com/mementum/backtrader/blob/e22205427bc0ac55723677c88573737a172590ef/backtrader/position.py#L130-L132 if not size: return is_buy_position: bool = size > 0 reverse_op: Callable = \ self._sell_operation if is_buy_position else self._buy_operation reverse_op(size=size, price=self.CLOSE_POSITION_ORDER_PRICE)
あとは「5本連続」で上げ/下げの場合に、買い/売りというロジックにしていたが、これを可変にした。
# https://github.com/dogwood008/stock-trading-system/pull/25/commits/8af8e19dbde866cc266c85e5b191b544fc29f183 def _is_increasing_over_n_ticks(self, n: int) -> bool: ''' Returns --------------- もしn本連続で上がっているならTrue ''' return all(map( lambda x: self._dataclose[-x] >= self._dataclose[-(x+1)], range(n)))
可変にして色々試し、 10
に設定した際の勝ち負けは下記のような感じになった。
上図の時、10,000,000 円から初めて、最終的な時価総額は 10,022,000 円 (+0.22%)となった。