Class: Tda::Option
- Inherits:
-
Object
- Object
- Tda::Option
- Includes:
- HTTParty
- Defined in:
- app/models/tda/option.rb
Class Method Summary collapse
-
.get_chain(params) ⇒ Object
- 2023-02-05 vp
-
Gets the entire chain.
-
.get_quote(params) ⇒ Object
2023-03-18 vp This is what I should be using to check if a position should be rolled.
-
.get_quotes(params) ⇒ Object
params: contractType, strike, expirationDate, ticker.
Class Method Details
.get_chain(params) ⇒ Object
- 2023-02-05 vp
-
Gets the entire chain
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/models/tda/option.rb', line 13 def self.get_chain params opts = { symbol: params[:ticker] } ## use 'GME' as symbol here even though a symbol is eg 'GME_021023P2.5' query = { apikey: ::TD_AMERITRADE[:apiKey] }.merge opts puts! query, 'input opts' path = "/v1/marketdata/chains" out = self.get path, { query: query } = DateTime.parse out.headers['date'] out = out.parsed_response.deep_symbolize_keys outs = [] %w| put call |.each do |contractType| tmp_sym = "#{contractType}ExpDateMap".to_sym _out = out[tmp_sym] _out.each do |date, vs| ## date="2023-02-10:5" vs.each do |strike, _v| ## strike="18.5" v = _v[0] ## v={} many attrs v = v.except( :lastSize, :optionDeliverablesList, :settlementType, :deliverableNote, :pennyPilot, :mini ) v.each do |k, i| if i == 'NaN' v[k] = nil end end v[:timestamp] = v[:ticker] = params[:ticker] outs.push( v ) end end end outs.each do |x| opi = ::Iro::OptionPriceItem.create( x ) if !opi.persisted? puts! opi.errors., "Cannot create OptionPriceItem" end end end |
.get_quote(params) ⇒ Object
2023-03-18 vp This is what I should be using to check if a position should be rolled.
57 58 59 |
# File 'app/models/tda/option.rb', line 57 def self.get_quote params OpenStruct.new ::Tda::Option.get_quotes(params)[0] end |
.get_quotes(params) ⇒ Object
params: contractType, strike, expirationDate, ticker
ow = { contractType: ‘PUT’, ticker: ‘GME’, date: ‘2022-12-09’ } query = :toDate=>“2022-12-09”, :fromDate=>“2022-12-09”, :symbol=>“GME”
- 2023-02-04 vp
-
Too specific, but I want the entire chain, every 1-min
- 2023-02-06 vp
-
Continue.
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'app/models/tda/option.rb', line 70 def self.get_quotes params puts! params, 'Tda::Option#get_quotes' opts = {} # # Validate input ??? # validOpts = %i| contractType | validOpts.each do |s| if params[s] opts[s] = params[s] else raise Iro::InputError.new("Invalid input, missing '#{s}'.") end end if params[:expirationDate] opts[:fromDate] = opts[:toDate] = params[:expirationDate] else raise Iro::InputError.new("Invalid input, missing 'date'.") end if params[:ticker] opts[:symbol] = params[:ticker].upcase else raise Iro::InputError.new("Invalid input, missing 'ticker'.") end if params[:strike] opts[:strike] = params[:strike] end query = { apikey: ::TD_AMERITRADE[:apiKey] }.merge opts puts! query, 'input opts' path = "/v1/marketdata/chains" out = self.get path, { query: query } = DateTime.parse out.headers['date'] ## out = HTTParty.get "https://api.tdameritrade.com#{path}", { query: query } out = out.parsed_response.deep_symbolize_keys tmp_sym = "#{opts[:contractType].to_s.downcase}ExpDateMap".to_sym outs = [] out = out[tmp_sym] out.each do |date, vs| vs.each do |strike, _v| v = _v[0] v = v.except( :lastSize, :optionDeliverablesList, :settlementType, :deliverableNote, :pennyPilot, :mini ) v[:timestamp] = outs.push( v ) end end puts! outs, 'outs' return outs end |