チャネルブレイクアウトbotコード(by スナフキン氏)読解メモ35

の続きです。
題材コードは https://sshuhei.com/entry/channelbreakout/ です。

judgeメソッドの続きから。

    def judge(self, df_candleStick, entryHighLine, entryLowLine, closeHighLine,
            closeLowLine, entryTerm):
      """
      売り買い判断.ローソク足の高値が期間高値を上抜けたら買いエントリー.
      (2)ローソク足の安値が期間安値を下抜けたら売りエントリー.
      judgementリストは[買いエントリー,売りエントリー,買いクローズ(売り),売りクローズ(買い)]
      のリストになっている.
      (二次元リスト)リスト内リストはの要素は,0(シグナルなし),価格(シグナル点灯)を取る.
      """
      judgement = [[0, 0, 0, 0] for i in range(len(df_candleStick.index))]
      for i in range(len(df_candleStick.index)):
          # 上抜けでエントリー
          if df_candleStick["high"][i] > entryHighLine[i] and i >= entryTerm:
              judgement[i][0] = entryHighLine[i]
          # 下抜けでエントリー
          if df_candleStick["low"][i] < entryLowLine[i] and i >= entryTerm:
              judgement[i][1] = entryLowLine[i]
          # 下抜けでクローズ
          if df_candleStick["low"][i] < closeLowLine[i] and i >= entryTerm:
              judgement[i][2] = closeLowLine[i]
          # 上抜けでクローズ
          if df_candleStick["high"][i] > closeHighLine[i] and i >= entryTerm:
              judgement[i][3] = closeHighLine[i]
          #
          else:
              pass
      return judgement
          # 下抜けでクローズ
          if df_candleStick["low"][i] < closeLowLine[i] and i >= entryTerm:
              judgement[i][2] = closeLowLine[i]

ローソク足の安値がentryTerm毎の安値よりも下かつループの回数がentryTerm以上であれば、judgement配列のi行2列にentryTerm毎の安値を入れます。

          # 上抜けでクローズ
          if df_candleStick["high"][i] > closeHighLine[i] and i >= entryTerm:
              judgement[i][3] = closeHighLine[i]

ローソク足の高値がentryTerm毎の高値よりも上かつループの回数がentryTerm以上であれば、judgement配列のi行3列にentryTerm毎の高値を入れます。

          else:
              pass
      return judgement

条件に当てはまらなければ何もせず、forブロックがloopし終わったら生成したjudgement配列を返します。

describeResultメソッドに戻ります。

        judgement = self.judge(df_candleStick, entryHighLine, entryLowLine,
                              closeHighLine, closeLowLine, entryTerm)

judgeメソッドで生成したjudgement配列を受け取ります。

        pl, buyEntrySignals, sellEntrySignals, buyCloseSignals,\
        sellCloseSignals, nOfTrade, plPerTrade \
            = self.backtest(
            judgement, df_candleStick, 1, rangeTh, rangeTerm,
            originalWaitTerm=originalWaitTerm, waitTh=waitTh,
            cost=cost)

backtestメソッドを実行します。
backtestメソッドを見ていきます。

   # エントリーラインおよびクローズラインで約定すると仮定する.
   def backtest(self, judgement, df_candleStick, lot, rangeTh, rangeTerm,
                originalWaitTerm=10, waitTh=10000, cost=0):

コメントによると、先ほど生成したjudgement配列に格納されているエントリーラインとクローズラインで約定すると仮定したテストを行うようです。

       # エントリーポイント,クローズポイントを入れるリスト
       buyEntrySignals = []
       sellEntrySignals = []
       buyCloseSignals = []
       sellCloseSignals = []
       nOfTrade = 0
       pos = 0
       pl = []
       pl.append(0)
       # トレードごとの損益
       plPerTrade = []
       # 取引時の価格を入れる配列.この価格でバックテストのplを計算する.(ので,どの価格で約定するかはテストのパフォーマンスに大きく影響を与える.)
       buy_entry = []
       buy_close = []
       sell_entry = []
       sell_close = []

テスト実行中に格納していくための空配列を生成します。

       # 各ローソク足について,レンジ相場かどうかの判定が入っている配列
       isRange = self.isRange(df_candleStick, rangeTerm, rangeTh)

isRangeメソッドは↓あたりで見たので割愛します。

isRangeにはレンジ相場かどうかを表すTrue, Falseが入っています。j

       # 基本ロット.勝ちトレードの直後はロットを落とす.
       originalLot = lot
       # 勝ちトレード後,何回のトレードでロットを落とすか.
       waitTerm = 0

実取引処理でも見た勝った後にlotを落とすための準備です。

15分経ったので今日はここまで。

↓次


この記事が気に入ったらサポートをしてみませんか?