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

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

getSpecifiedCandlestickメソッドの続きから。

  def getSpecifiedCandlestick(self, number, period, start_timestamp,
                              end_timestamp):
      """
      number:ローソク足の数.period:ローソク足の期間(文字列で秒数を指定,
      Ex:1分足なら"60").cryptowatchはときどきおかしなデータ(price=0)が含まれるので
      それを除く
      """
      # ローソク足の時間を指定
      periods = [period]
      # クエリパラメータを指定
      query = {"periods": ','.join(periods),
               "after": str(int(start_timestamp)),
               "before": str(int(end_timestamp))}
      # ローソク足取得
      try:
          res = json.loads(requests.get(
              "https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",
              params=query).text)
          res = res["result"]
      except:
          print(res)
      # ローソク足のデータを入れる配列.
      data = []
      for i in periods:
          row = res[i]
          length = len(row)
          for column in row[:length - (number + 1):-1]:
              # dataへローソク足データを追加.
              if column[4] != 0:
                  column = column[0:6]
                  data.append(column)
      return data[::-1]
      for i in periods:
          row = res[i]
          length = len(row)
          for column in row[:length - (number + 1):-1]:
              # dataへローソク足データを追加.
              if column[4] != 0:
                  column = column[0:6]
                  data.append(column)

rowにはperiodで指定した分足のデータが入っています。
len(row)でその配列の長さを計算します。
row配列の後ろからlength - (number+1)まで1ステップずつさかのぼります。
numberで指定したローソク足の数ぶんloopが回ることになります。
column[4]はclose priceです。
終値が0出なければcolumn[0:6]つまりdate, open, high, low, closeをdata配列にいれます。

      return data[::-1]

data配列には直近のローソクから順番に入っているので、時間順にするため配列を逆順に並び替えて返します。

describeResultメソッドに戻ります。

            candleStick = self.getSpecifiedCandlestick(number, "60",
                                                      start_timestamp,
                                                      end_timestamp)

candleStickにnumberで指定した長さのローソク足が入りました。

       else:
           candleStick = self.readDataFromFile(fileName)

ファイル名が渡されている場合はそのファイルからローソク足を取得します。

readDataFromFileメソッドを見てみます。

   # csvファイル(ヘッダなし)からohlcデータを作成.
   def readDataFromFile(self, filename):
       for i in range(1, 10, 1):
           with open(filename, 'r', encoding="utf-8") as f:
               reader = csv.reader(f)
               header = next(reader)
               for row in reader:
                   candleStick = [row for row in reader if row[4] != "0"]
       dtDate = [datetime.datetime.strptime(data[0], '%Y-%m-%d %H:%M:%S') for
                 data in candleStick]
       dtTimeStamp = [dt.timestamp() for dt in dtDate]
       for i in range(len(candleStick)):
           candleStick[i][0] = dtTimeStamp[i]
       candleStick = [[float(i) for i in data] for data in candleStick]
       return candleStick
   # csvファイル(ヘッダなし)からohlcデータを作成.

ということなので、ヘッダを入れていると正しくパースされなさそうです。

   def readDataFromFile(self, filename):

ファイル名を引数として渡します。

       for i in range(1, 10, 1):

1から10未満の整数(=9)まで1ずつiに入れていきます。

           with open(filename, 'r', encoding="utf-8") as f:

渡されたファイル名を指定してファイルをreadで開き、そのファイルをfとして管理します。
参考: https://python.civic-apps.com/file-io/

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

↓次


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