schwab_rb 0.3.9 → 0.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/examples/fetch_price_history.rb +59 -0
- data/lib/schwab_rb/clients/base_client.rb +1 -1
- data/lib/schwab_rb/data_objects/price_history.rb +23 -19
- data/lib/schwab_rb/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1084951747e498f315643e3fa998378083f5890138f6d99f5a63a6fdb94c97bc
|
4
|
+
data.tar.gz: 9ab31db058490a30b788b26c9d77b1b6841cc00a3fa35e5662bab070d202ba24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3765ab31ba7197567363e71e40be4bfef74826c0cc49ab117d274ab31ce2d9905f4acba4ea8e1b60d991ecf7bf67711d3038fce94e3d00d44fd5f39da1065dc5
|
7
|
+
data.tar.gz: 5f45504b86351f2905fa6201ea9887cb79d06268fda40f93ca985928db7428087774d2c34127d56d8c364b523d40277d7d6f6d4e7c8441289c3d00fe088f2c3b
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Script to fetch price history data and save as fixture
|
5
|
+
# Usage: ruby examples/fetch_price_history.rb [SYMBOL]
|
6
|
+
|
7
|
+
require_relative "../lib/schwab_rb"
|
8
|
+
require "dotenv"
|
9
|
+
require "json"
|
10
|
+
require "fileutils"
|
11
|
+
require "pry"
|
12
|
+
|
13
|
+
Dotenv.load
|
14
|
+
|
15
|
+
def create_client
|
16
|
+
token_path = ENV["TOKEN_PATH"] || "schwab_token.json"
|
17
|
+
SchwabRb::Auth.init_client_easy(
|
18
|
+
ENV.fetch("SCHWAB_API_KEY", nil),
|
19
|
+
ENV.fetch("SCHWAB_APP_SECRET", nil),
|
20
|
+
ENV.fetch("APP_CALLBACK_URL", nil),
|
21
|
+
token_path
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def fetch_price_history(symbol = "$SPX",
|
26
|
+
start_date = Date.new(Date.today.year, Date.today.month, 1),
|
27
|
+
end_date = Date.today
|
28
|
+
)
|
29
|
+
client = create_client
|
30
|
+
puts "Fetching price history for #{symbol}..."
|
31
|
+
|
32
|
+
puts " - Fetching minute price history..."
|
33
|
+
price_hist = client.get_price_history(
|
34
|
+
symbol,
|
35
|
+
period_type: SchwabRb::PriceHistory::PeriodTypes::DAY,
|
36
|
+
period: SchwabRb::PriceHistory::Periods::ONE_DAY,
|
37
|
+
frequency_type: SchwabRb::PriceHistory::FrequencyTypes::MINUTE,
|
38
|
+
frequency: SchwabRb::PriceHistory::Frequencies::EVERY_MINUTE,
|
39
|
+
start_datetime: start_date,
|
40
|
+
end_datetime: end_date,
|
41
|
+
need_extended_hours_data: true,
|
42
|
+
need_previous_close: false,
|
43
|
+
return_data_objects: true
|
44
|
+
)
|
45
|
+
|
46
|
+
puts "Price history data collection complete!"
|
47
|
+
puts "Symbol: #{symbol}"
|
48
|
+
rescue StandardError => e
|
49
|
+
puts "Error fetching price history: #{e.message}"
|
50
|
+
puts e.backtrace.first(3)
|
51
|
+
end
|
52
|
+
|
53
|
+
if __FILE__ == $PROGRAM_NAME
|
54
|
+
symbol = ARGV[0] || "$SPX"
|
55
|
+
start_date = ARGV[1] ? Date.parse(ARGV[1]) : Date.new(2025, 8, 1)
|
56
|
+
end_date = ARGV[2] ? Date.parse(ARGV[2]) : Date.today
|
57
|
+
|
58
|
+
fetch_price_history(symbol, start_date, end_date)
|
59
|
+
end
|
@@ -892,7 +892,7 @@ module SchwabRb
|
|
892
892
|
def format_date_as_millis(var_name, dt)
|
893
893
|
assert_type(var_name, dt, [Date, DateTime])
|
894
894
|
dt = DateTime.new(dt.year, dt.month, dt.day) unless dt.is_a?(DateTime)
|
895
|
-
(dt.to_time.
|
895
|
+
(dt.to_time.to_i * 1000).to_i
|
896
896
|
end
|
897
897
|
|
898
898
|
def normalize_start_and_end_datetimes(start_datetime, end_datetime)
|
@@ -12,16 +12,18 @@ module SchwabRb
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def initialize(data)
|
15
|
-
|
16
|
-
|
17
|
-
@
|
15
|
+
# Convert string keys to symbols if needed
|
16
|
+
data = data.transform_keys(&:to_sym) if data.respond_to?(:transform_keys)
|
17
|
+
@symbol = data[:symbol]
|
18
|
+
@empty = data[:empty]
|
19
|
+
@candles = data[:candles]&.map { |candle_data| Candle.new(candle_data) } || []
|
18
20
|
end
|
19
21
|
|
20
22
|
def to_h
|
21
23
|
{
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
symbol: @symbol,
|
25
|
+
empty: @empty,
|
26
|
+
candles: @candles.map(&:to_h)
|
25
27
|
}
|
26
28
|
end
|
27
29
|
|
@@ -45,7 +47,7 @@ module SchwabRb
|
|
45
47
|
|
46
48
|
def candles_for_date_range(start_date, end_date)
|
47
49
|
start_timestamp = start_date.to_time.to_i * 1000
|
48
|
-
end_timestamp = end_date.to_time.to_i * 1000
|
50
|
+
end_timestamp = (end_date.to_time + 24 * 60 * 60 - 1).to_i * 1000
|
49
51
|
|
50
52
|
@candles.select do |candle|
|
51
53
|
candle.datetime >= start_timestamp && candle.datetime <= end_timestamp
|
@@ -105,22 +107,24 @@ module SchwabRb
|
|
105
107
|
attr_reader :open, :high, :low, :close, :volume, :datetime
|
106
108
|
|
107
109
|
def initialize(data)
|
108
|
-
|
109
|
-
|
110
|
-
@
|
111
|
-
@
|
112
|
-
@
|
113
|
-
@
|
110
|
+
# Convert string keys to symbols if needed
|
111
|
+
data = data.transform_keys(&:to_sym) if data.respond_to?(:transform_keys)
|
112
|
+
@open = data[:open]
|
113
|
+
@high = data[:high]
|
114
|
+
@low = data[:low]
|
115
|
+
@close = data[:close]
|
116
|
+
@volume = data[:volume]
|
117
|
+
@datetime = data[:datetime]
|
114
118
|
end
|
115
119
|
|
116
120
|
def to_h
|
117
121
|
{
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
122
|
+
open: @open,
|
123
|
+
high: @high,
|
124
|
+
low: @low,
|
125
|
+
close: @close,
|
126
|
+
volume: @volume,
|
127
|
+
datetime: @datetime
|
124
128
|
}
|
125
129
|
end
|
126
130
|
|
data/lib/schwab_rb/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schwab_rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Platta
|
@@ -205,6 +205,7 @@ files:
|
|
205
205
|
- doc/notes/data_objects_analysis.md
|
206
206
|
- doc/notes/data_objects_refactoring_plan.md
|
207
207
|
- examples/fetch_account_numbers.rb
|
208
|
+
- examples/fetch_price_history.rb
|
208
209
|
- examples/fetch_user_preferences.rb
|
209
210
|
- lib/schwab_rb.rb
|
210
211
|
- lib/schwab_rb/account.rb
|