読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

クロスアップ/クロスダウンを判定するユーティリティ

先行指標と遅行指標を受け取って、クロスアップ/クロスダウンを判定するユーティリティです。利用例と挙動の説明は以下。

require 'cross'

cross = Cross.new

# 先行指標、遅行指標を受け取って状態を返す。
# :cross .. クロスアップ、クロスダウン状態かどうかを返す。
#             - クロスアップ(:up)
#             - クロスダウン(:down)
#             - どちらでもない(:none)
# :trend .. 現在の指標が上向きか下向きかを返す。
#           「先行指標 <=> 遅行指標」した値。
#           trend >= 1なら上向き、trned <= -1なら下向き
p cross.next_data( 100, 90 )  # {:trend=>1, :cross=>:none}
p cross.next_data( 110, 100 ) # {:trend=>1, :cross=>:none}
p cross.next_data( 100, 100 ) # {:trend=>0, :cross=>:none}
p cross.next_data( 90, 100 )  # {:trend=>-1, :cross=>:down}
p cross.next_data( 80, 90 )   # {:trend=>-1, :cross=>:none}
p cross.next_data( 90, 90 )   # {:trend=>0, :cross=>:none}
p cross.next_data( 100, 100 ) # {:trend=>0, :cross=>:none}
p cross.next_data( 110, 100 ) # {:trend=>1, :cross=>:up}

ソースは次の通り。

#===交差状態を判定する
class Cross

  #コンストラクタ
  def initialize
    @cross_prev = nil
    @cross = :none
    @trend = 0
  end

  # 次の値を渡す
  #fast:: 先行指標
  #lazy:: 遅行指標
  def next_data( fast, lazy )
    return unless fast && lazy
    # 交差状態を算出
    @trend = fast <=> lazy
    if @cross_prev && @trend != @cross_prev && @trend != 0
      @cross = @trend > @cross_prev ? :up : :down
    else
      @cross = :none
    end
    @cross_prev = @trend
    return {:cross=>@cross,:trend=>@trend}
  end

  #クロスアップ状態かどうか判定する
  #「先行指標 < 遅行指標」 から 「先行指標 > 遅行指標」 になったらtrue
  def cross_up?
    @cross == :up
  end
  #クロスダウン状態かどうか判定する
  #「先行指標 > 遅行指標」 から 「先行指標 < 遅行指標」 になったらtrue
  def cross_down?
    @cross == :down
  end
  #上昇トレンド中かどうか判定する
  #「先行指標 > 遅行指標」 ならtrue
  def up?
    @trend > 0
  end
  #下降トレンド中かどうか判定する
  #「先行指標 < 遅行指標」 ならtrue
  def down?
    @trend < 0
  end

  #交差状態( :up, :down, :none )
  attr_reader :cross
  #トレンド ( 直近の falst <=> lazy 値。)
  attr_reader :trend
end

ver1.2で添付する予定です。