DhanHQ 3.0.0 → 3.1.0
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/.rubocop.yml +2 -0
- data/.rubocop_todo.yml +7 -0
- data/CHANGELOG.md +51 -0
- data/README.md +152 -4
- data/docs/CONSTANTS_REFERENCE.md +3 -2
- data/exe/dhanhq-mcp +7 -0
- data/lib/DhanHQ/agent/order_preview.rb +50 -0
- data/lib/DhanHQ/agent/policy.rb +51 -0
- data/lib/DhanHQ/agent/tool_registry.rb +299 -0
- data/lib/DhanHQ/agent.rb +12 -0
- data/lib/DhanHQ/ai/context_builder.rb +145 -0
- data/lib/DhanHQ/ai/prompt_helpers.rb +114 -0
- data/lib/DhanHQ/ai.rb +27 -0
- data/lib/DhanHQ/auth.rb +0 -1
- data/lib/DhanHQ/client.rb +1 -3
- data/lib/DhanHQ/concerns/order_audit.rb +43 -1
- data/lib/DhanHQ/constants.rb +5 -2
- data/lib/DhanHQ/contracts/forever_order_contract.rb +1 -1
- data/lib/DhanHQ/contracts/iceberg_order_contract.rb +83 -0
- data/lib/DhanHQ/contracts/place_order_contract.rb +1 -1
- data/lib/DhanHQ/contracts/twap_order_contract.rb +106 -0
- data/lib/DhanHQ/core/auth_api.rb +0 -1
- data/lib/DhanHQ/errors.rb +4 -0
- data/lib/DhanHQ/events/base.rb +203 -0
- data/lib/DhanHQ/events/bus.rb +158 -0
- data/lib/DhanHQ/events.rb +40 -0
- data/lib/DhanHQ/indicators.rb +283 -0
- data/lib/DhanHQ/market_data/market_snapshot.rb +97 -0
- data/lib/DhanHQ/market_data/ohlc_series.rb +169 -0
- data/lib/DhanHQ/market_data/option_snapshot.rb +223 -0
- data/lib/DhanHQ/market_data.rb +25 -0
- data/lib/DhanHQ/mcp/server.rb +235 -0
- data/lib/DhanHQ/mcp.rb +10 -0
- data/lib/DhanHQ/models/funds.rb +12 -0
- data/lib/DhanHQ/models/holding.rb +42 -0
- data/lib/DhanHQ/models/iceberg_order.rb +139 -0
- data/lib/DhanHQ/models/instrument.rb +80 -14
- data/lib/DhanHQ/models/order.rb +95 -0
- data/lib/DhanHQ/models/position.rb +66 -0
- data/lib/DhanHQ/models/search_result.rb +12 -0
- data/lib/DhanHQ/models/trade.rb +13 -0
- data/lib/DhanHQ/models/twap_order.rb +136 -0
- data/lib/DhanHQ/option_analytics/black_scholes.rb +194 -0
- data/lib/DhanHQ/option_analytics/max_pain.rb +119 -0
- data/lib/DhanHQ/option_analytics.rb +36 -0
- data/lib/DhanHQ/rate_limiter.rb +5 -3
- data/lib/DhanHQ/resources/alert_orders.rb +1 -0
- data/lib/DhanHQ/resources/forever_orders.rb +1 -0
- data/lib/DhanHQ/resources/iceberg_orders.rb +62 -0
- data/lib/DhanHQ/resources/orders.rb +2 -0
- data/lib/DhanHQ/resources/pnl_exit.rb +1 -0
- data/lib/DhanHQ/resources/super_orders.rb +1 -0
- data/lib/DhanHQ/resources/twap_orders.rb +62 -0
- data/lib/DhanHQ/risk/checks/asm_gsm.rb +17 -0
- data/lib/DhanHQ/risk/checks/concentration.rb +37 -0
- data/lib/DhanHQ/risk/checks/market_hours.rb +37 -0
- data/lib/DhanHQ/risk/checks/max_loss.rb +24 -0
- data/lib/DhanHQ/risk/checks/options.rb +46 -0
- data/lib/DhanHQ/risk/checks/order_type.rb +20 -0
- data/lib/DhanHQ/risk/checks/position_limits.rb +24 -0
- data/lib/DhanHQ/risk/checks/product_support.rb +34 -0
- data/lib/DhanHQ/risk/checks/quantity.rb +32 -0
- data/lib/DhanHQ/risk/checks/trading_permission.rb +16 -0
- data/lib/DhanHQ/risk/pipeline.rb +72 -0
- data/lib/DhanHQ/risk.rb +250 -0
- data/lib/DhanHQ/skills/base.rb +183 -0
- data/lib/DhanHQ/skills/builtin/bear_call_spread.rb +87 -0
- data/lib/DhanHQ/skills/builtin/bull_put_spread.rb +87 -0
- data/lib/DhanHQ/skills/builtin/buy_atm_call.rb +84 -0
- data/lib/DhanHQ/skills/builtin/covered_call.rb +85 -0
- data/lib/DhanHQ/skills/builtin/iron_condor.rb +89 -0
- data/lib/DhanHQ/skills/builtin/market_data_summarizer.rb +195 -0
- data/lib/DhanHQ/skills/builtin/protective_put.rb +90 -0
- data/lib/DhanHQ/skills/builtin/square_off_all.rb +42 -0
- data/lib/DhanHQ/skills/builtin/square_off_position.rb +50 -0
- data/lib/DhanHQ/skills/builtin/straddle.rb +88 -0
- data/lib/DhanHQ/skills/builtin/strangle.rb +93 -0
- data/lib/DhanHQ/skills/registry.rb +101 -0
- data/lib/DhanHQ/skills/workflow.rb +66 -0
- data/lib/DhanHQ/skills.rb +29 -0
- data/lib/DhanHQ/strategy/base.rb +189 -0
- data/lib/DhanHQ/strategy.rb +40 -0
- data/lib/DhanHQ/version.rb +1 -1
- data/lib/DhanHQ/ws/decoder.rb +57 -19
- data/lib/DhanHQ.rb +3 -0
- data/lib/dhan_hq/agent.rb +3 -0
- data/lib/dhan_hq/mcp.rb +3 -0
- data/lib/dhan_hq.rb +74 -2
- data/lib/ta/technical_analysis.rb +3 -1
- data/skills/dhanhq-ruby/SKILL.md +207 -0
- data/skills/dhanhq-ruby/examples/fetch_option_chain.rb +54 -0
- data/skills/dhanhq-ruby/examples/gtt_forever_order.rb +65 -0
- data/skills/dhanhq-ruby/examples/historical_data_analysis.rb +89 -0
- data/skills/dhanhq-ruby/examples/iron_condor.rb +137 -0
- data/skills/dhanhq-ruby/examples/live_feed_setup.rb +43 -0
- data/skills/dhanhq-ruby/examples/margin_check.rb +42 -0
- data/skills/dhanhq-ruby/examples/order_management.rb +105 -0
- data/skills/dhanhq-ruby/examples/place_equity_order.rb +36 -0
- data/skills/dhanhq-ruby/examples/place_fno_order.rb +76 -0
- data/skills/dhanhq-ruby/examples/portfolio_summary.rb +74 -0
- data/skills/dhanhq-ruby/examples/super_order_with_sl.rb +57 -0
- data/skills/dhanhq-ruby/references/backtesting-with-dhan.md +65 -0
- data/skills/dhanhq-ruby/references/common-workflows.md +76 -0
- data/skills/dhanhq-ruby/references/error-codes.md +50 -0
- data/skills/dhanhq-ruby/references/funds.md +67 -0
- data/skills/dhanhq-ruby/references/instruments.md +85 -0
- data/skills/dhanhq-ruby/references/live-feed.md +83 -0
- data/skills/dhanhq-ruby/references/market-data.md +119 -0
- data/skills/dhanhq-ruby/references/option-chain.md +71 -0
- data/skills/dhanhq-ruby/references/options-analysis-patterns.md +76 -0
- data/skills/dhanhq-ruby/references/orders.md +201 -0
- data/skills/dhanhq-ruby/references/portfolio.md +93 -0
- data/skills/dhanhq-ruby/references/scanx-data.md +62 -0
- data/skills/dhanhq-ruby/scripts/dhan_helpers.rb +323 -0
- data/skills/dhanhq-ruby/scripts/resolve_security.rb +168 -0
- data/skills/dhanhq-ruby/scripts/trade_logger.rb +131 -0
- data/skills/dhanhq-ruby/scripts/validate_order.rb +169 -0
- metadata +95 -20
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
# rubocop:disable Metrics/AbcSize
|
|
4
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
5
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
6
|
+
# rubocop:disable Metrics/ParameterLists
|
|
7
|
+
# rubocop:disable Style/FormatString
|
|
8
|
+
|
|
9
|
+
require "date"
|
|
10
|
+
|
|
11
|
+
LOT_SIZES = {
|
|
12
|
+
"NIFTY" => 75,
|
|
13
|
+
"BANKNIFTY" => 15,
|
|
14
|
+
"FINNIFTY" => 25,
|
|
15
|
+
"MIDCPNIFTY" => 50,
|
|
16
|
+
"SENSEX" => 10
|
|
17
|
+
}.freeze
|
|
18
|
+
|
|
19
|
+
FREEZE_QTY = {
|
|
20
|
+
"NIFTY" => 1800,
|
|
21
|
+
"BANKNIFTY" => 900,
|
|
22
|
+
"FINNIFTY" => 1000,
|
|
23
|
+
"MIDCPNIFTY" => 2800,
|
|
24
|
+
"SENSEX" => 500
|
|
25
|
+
}.freeze
|
|
26
|
+
|
|
27
|
+
VALID_EXCHANGE_SEGMENTS = %w[
|
|
28
|
+
NSE_EQ BSE_EQ NSE_FNO BSE_FNO MCX_COMM NSE_CURRENCY BSE_CURRENCY
|
|
29
|
+
].freeze
|
|
30
|
+
|
|
31
|
+
EQUITY_SEGMENTS = %w[NSE_EQ BSE_EQ].freeze
|
|
32
|
+
DERIVATIVE_SEGMENTS = %w[NSE_FNO BSE_FNO MCX_COMM NSE_CURRENCY BSE_CURRENCY].freeze
|
|
33
|
+
|
|
34
|
+
EQUITY_PRODUCT_TYPES = %w[CNC INTRADAY MARGIN MTF].freeze
|
|
35
|
+
DERIVATIVE_PRODUCT_TYPES = %w[INTRADAY MARGIN].freeze
|
|
36
|
+
|
|
37
|
+
VALID_ORDER_TYPES = %w[LIMIT MARKET STOP_LOSS STOP_LOSS_MARKET].freeze
|
|
38
|
+
VALID_TRANSACTION_TYPES = %w[BUY SELL].freeze
|
|
39
|
+
VALID_VALIDITY = %w[DAY IOC].freeze
|
|
40
|
+
|
|
41
|
+
NOTIONAL_WARNING_THRESHOLD = 50_000
|
|
42
|
+
|
|
43
|
+
def _infer_lot_size(trading_symbol)
|
|
44
|
+
return nil if trading_symbol.nil? || trading_symbol.to_s.empty?
|
|
45
|
+
|
|
46
|
+
symbol_upper = trading_symbol.to_s.upcase
|
|
47
|
+
LOT_SIZES.each do |name, lot_size|
|
|
48
|
+
return lot_size if symbol_upper.include?(name)
|
|
49
|
+
end
|
|
50
|
+
nil
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def _infer_freeze_qty(trading_symbol)
|
|
54
|
+
return nil if trading_symbol.nil? || trading_symbol.to_s.empty?
|
|
55
|
+
|
|
56
|
+
symbol_upper = trading_symbol.to_s.upcase
|
|
57
|
+
FREEZE_QTY.each do |name, freeze_qty|
|
|
58
|
+
return freeze_qty if symbol_upper.include?(name)
|
|
59
|
+
end
|
|
60
|
+
nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def validate_order(
|
|
64
|
+
security_id: nil,
|
|
65
|
+
exchange_segment: nil,
|
|
66
|
+
transaction_type: nil,
|
|
67
|
+
quantity: nil,
|
|
68
|
+
order_type: nil,
|
|
69
|
+
product_type: nil,
|
|
70
|
+
price: 0.0,
|
|
71
|
+
trigger_price: 0.0,
|
|
72
|
+
validity: DhanHQ::Constants::Validity::DAY,
|
|
73
|
+
after_market_order: false,
|
|
74
|
+
trading_symbol: nil,
|
|
75
|
+
lot_size: nil
|
|
76
|
+
)
|
|
77
|
+
errors = []
|
|
78
|
+
warnings = []
|
|
79
|
+
|
|
80
|
+
exchange_segment = exchange_segment&.to_s&.upcase
|
|
81
|
+
transaction_type = transaction_type&.to_s&.upcase
|
|
82
|
+
order_type = order_type&.to_s&.upcase
|
|
83
|
+
product_type = product_type&.to_s&.upcase
|
|
84
|
+
validity = validity&.to_s&.upcase
|
|
85
|
+
|
|
86
|
+
errors << "security_id is required" if security_id.nil? || security_id.to_s.empty?
|
|
87
|
+
errors << "exchange_segment is required" if exchange_segment.nil? || exchange_segment.to_s.empty?
|
|
88
|
+
errors << "transaction_type is required" if transaction_type.nil? || transaction_type.to_s.empty?
|
|
89
|
+
errors << "quantity must be a positive integer" if quantity.nil? || quantity.to_i <= 0
|
|
90
|
+
errors << "order_type is required" if order_type.nil? || order_type.to_s.empty?
|
|
91
|
+
errors << "product_type is required" if product_type.nil? || product_type.to_s.empty?
|
|
92
|
+
|
|
93
|
+
errors << "Invalid exchange_segment: #{exchange_segment}" if exchange_segment && !VALID_EXCHANGE_SEGMENTS.include?(exchange_segment)
|
|
94
|
+
errors << "Invalid transaction_type: #{transaction_type}" if transaction_type && !VALID_TRANSACTION_TYPES.include?(transaction_type)
|
|
95
|
+
errors << "Invalid order_type: #{order_type}" if order_type && !VALID_ORDER_TYPES.include?(order_type)
|
|
96
|
+
errors << "Invalid validity: #{validity}" if validity && !VALID_VALIDITY.include?(validity)
|
|
97
|
+
|
|
98
|
+
errors << "price is required for #{order_type} orders" if %w[LIMIT STOP_LOSS].include?(order_type) && price.to_f <= 0
|
|
99
|
+
errors << "trigger_price is required for #{order_type} orders" if %w[STOP_LOSS STOP_LOSS_MARKET].include?(order_type) && trigger_price.to_f <= 0
|
|
100
|
+
|
|
101
|
+
if exchange_segment && EQUITY_SEGMENTS.include?(exchange_segment) && product_type && !EQUITY_PRODUCT_TYPES.include?(product_type)
|
|
102
|
+
errors << "Invalid product_type '#{product_type}' for equity segment '#{exchange_segment}'. Valid values: #{EQUITY_PRODUCT_TYPES.sort}"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
if exchange_segment && DERIVATIVE_SEGMENTS.include?(exchange_segment) && product_type && !DERIVATIVE_PRODUCT_TYPES.include?(product_type)
|
|
106
|
+
errors << "Invalid product_type '#{product_type}' for derivative segment '#{exchange_segment}'. Valid values: #{DERIVATIVE_PRODUCT_TYPES.sort}"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
warnings << "Dhan's current order docs say API market orders are converted to limit orders with MPP." if order_type == DhanHQ::Constants::OrderType::MARKET
|
|
110
|
+
|
|
111
|
+
effective_lot_size = lot_size || _infer_lot_size(trading_symbol)
|
|
112
|
+
if exchange_segment && DERIVATIVE_SEGMENTS.include?(exchange_segment) && quantity
|
|
113
|
+
if effective_lot_size && quantity.to_i % effective_lot_size != 0
|
|
114
|
+
errors << "Derivative quantity must be a multiple of lot size #{effective_lot_size}. Got #{quantity}."
|
|
115
|
+
elsif effective_lot_size.nil?
|
|
116
|
+
warnings << "Could not resolve a lot size from the provided data. Confirm lot size from the security master before placing."
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
freeze_qty = _infer_freeze_qty(trading_symbol)
|
|
120
|
+
if freeze_qty && quantity.to_i > freeze_qty
|
|
121
|
+
warnings << "Quantity #{quantity} exceeds fallback freeze quantity #{freeze_qty}. Consider place_slice_order() after verifying the latest exchange freeze limits."
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
if price.to_f.positive? && quantity
|
|
126
|
+
notional = price.to_f * quantity.to_i
|
|
127
|
+
warnings << "High notional value: Rs. #{"%.2f" % notional} exceeds the Rs. 50,000 warning threshold." if notional > NOTIONAL_WARNING_THRESHOLD
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
unless after_market_order
|
|
131
|
+
now = Time.now
|
|
132
|
+
if now.saturday? || now.sunday?
|
|
133
|
+
warnings << "Market is closed on weekends. Use AMO only if that is intentional."
|
|
134
|
+
elsif now.hour < 9 || (now.hour == 9 && now.min < 15)
|
|
135
|
+
warnings << "Regular market is not yet open."
|
|
136
|
+
elsif now.hour > 15 || (now.hour == 15 && now.min > 30)
|
|
137
|
+
warnings << "Regular market is closed. Use AMO only if that is intentional."
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
{
|
|
142
|
+
"valid" => errors.empty?,
|
|
143
|
+
"errors" => errors,
|
|
144
|
+
"warnings" => warnings
|
|
145
|
+
}
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def print_validation(result)
|
|
149
|
+
if result["valid"]
|
|
150
|
+
puts "Order validation: PASS"
|
|
151
|
+
else
|
|
152
|
+
puts "Order validation: FAIL"
|
|
153
|
+
result["errors"].each { |error| puts " ERROR: #{error}" }
|
|
154
|
+
end
|
|
155
|
+
result["warnings"].each { |warning| puts " WARNING: #{warning}" }
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
if __FILE__ == $PROGRAM_NAME
|
|
159
|
+
sample = validate_order(
|
|
160
|
+
security_id: "2885",
|
|
161
|
+
exchange_segment: DhanHQ::Constants::ExchangeSegment::NSE_EQ,
|
|
162
|
+
transaction_type: DhanHQ::Constants::TransactionType::BUY,
|
|
163
|
+
quantity: 10,
|
|
164
|
+
order_type: DhanHQ::Constants::OrderType::LIMIT,
|
|
165
|
+
product_type: DhanHQ::Constants::ProductType::CNC,
|
|
166
|
+
price: 2450
|
|
167
|
+
)
|
|
168
|
+
print_validation(sample)
|
|
169
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: DhanHQ
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.
|
|
4
|
+
version: 3.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Shubham Taywade
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-07-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -112,30 +112,16 @@ dependencies:
|
|
|
112
112
|
name: faraday
|
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
|
114
114
|
requirements:
|
|
115
|
-
- - "
|
|
115
|
+
- - "~>"
|
|
116
116
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: '
|
|
117
|
+
version: '2.14'
|
|
118
118
|
type: :runtime
|
|
119
119
|
prerelease: false
|
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
121
|
requirements:
|
|
122
|
-
- - "
|
|
123
|
-
- !ruby/object:Gem::Version
|
|
124
|
-
version: '0'
|
|
125
|
-
- !ruby/object:Gem::Dependency
|
|
126
|
-
name: faraday_middleware
|
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
|
128
|
-
requirements:
|
|
129
|
-
- - ">="
|
|
122
|
+
- - "~>"
|
|
130
123
|
- !ruby/object:Gem::Version
|
|
131
|
-
version: '
|
|
132
|
-
type: :runtime
|
|
133
|
-
prerelease: false
|
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
-
requirements:
|
|
136
|
-
- - ">="
|
|
137
|
-
- !ruby/object:Gem::Version
|
|
138
|
-
version: '0'
|
|
124
|
+
version: '2.14'
|
|
139
125
|
- !ruby/object:Gem::Dependency
|
|
140
126
|
name: faye-websocket
|
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -186,6 +172,7 @@ email:
|
|
|
186
172
|
- shubhamtaywade82@gmail.com
|
|
187
173
|
executables:
|
|
188
174
|
- DhanHQ
|
|
175
|
+
- dhanhq-mcp
|
|
189
176
|
extensions: []
|
|
190
177
|
extra_rdoc_files: []
|
|
191
178
|
files:
|
|
@@ -230,6 +217,15 @@ files:
|
|
|
230
217
|
- docs/WEBSOCKET_PROTOCOL.md
|
|
231
218
|
- docs/architecture-overview.svg
|
|
232
219
|
- exe/DhanHQ
|
|
220
|
+
- exe/dhanhq-mcp
|
|
221
|
+
- lib/DhanHQ.rb
|
|
222
|
+
- lib/DhanHQ/agent.rb
|
|
223
|
+
- lib/DhanHQ/agent/order_preview.rb
|
|
224
|
+
- lib/DhanHQ/agent/policy.rb
|
|
225
|
+
- lib/DhanHQ/agent/tool_registry.rb
|
|
226
|
+
- lib/DhanHQ/ai.rb
|
|
227
|
+
- lib/DhanHQ/ai/context_builder.rb
|
|
228
|
+
- lib/DhanHQ/ai/prompt_helpers.rb
|
|
233
229
|
- lib/DhanHQ/auth.rb
|
|
234
230
|
- lib/DhanHQ/auth/token_generator.rb
|
|
235
231
|
- lib/DhanHQ/auth/token_manager.rb
|
|
@@ -244,6 +240,7 @@ files:
|
|
|
244
240
|
- lib/DhanHQ/contracts/expired_options_data_contract.rb
|
|
245
241
|
- lib/DhanHQ/contracts/forever_order_contract.rb
|
|
246
242
|
- lib/DhanHQ/contracts/historical_data_contract.rb
|
|
243
|
+
- lib/DhanHQ/contracts/iceberg_order_contract.rb
|
|
247
244
|
- lib/DhanHQ/contracts/instrument_list_contract.rb
|
|
248
245
|
- lib/DhanHQ/contracts/intraday_historical_data_contract.rb
|
|
249
246
|
- lib/DhanHQ/contracts/margin_calculator_contract.rb
|
|
@@ -259,6 +256,7 @@ files:
|
|
|
259
256
|
- lib/DhanHQ/contracts/trade_by_order_id_contract.rb
|
|
260
257
|
- lib/DhanHQ/contracts/trade_contract.rb
|
|
261
258
|
- lib/DhanHQ/contracts/trade_history_contract.rb
|
|
259
|
+
- lib/DhanHQ/contracts/twap_order_contract.rb
|
|
262
260
|
- lib/DhanHQ/contracts/user_ip_contract.rb
|
|
263
261
|
- lib/DhanHQ/core/auth_api.rb
|
|
264
262
|
- lib/DhanHQ/core/base_api.rb
|
|
@@ -267,13 +265,23 @@ files:
|
|
|
267
265
|
- lib/DhanHQ/core/error_handler.rb
|
|
268
266
|
- lib/DhanHQ/error_object.rb
|
|
269
267
|
- lib/DhanHQ/errors.rb
|
|
268
|
+
- lib/DhanHQ/events.rb
|
|
269
|
+
- lib/DhanHQ/events/base.rb
|
|
270
|
+
- lib/DhanHQ/events/bus.rb
|
|
270
271
|
- lib/DhanHQ/helpers/api_helper.rb
|
|
271
272
|
- lib/DhanHQ/helpers/attribute_helper.rb
|
|
272
273
|
- lib/DhanHQ/helpers/model_helper.rb
|
|
273
274
|
- lib/DhanHQ/helpers/request_helper.rb
|
|
274
275
|
- lib/DhanHQ/helpers/response_helper.rb
|
|
275
276
|
- lib/DhanHQ/helpers/validation_helper.rb
|
|
277
|
+
- lib/DhanHQ/indicators.rb
|
|
276
278
|
- lib/DhanHQ/json_loader.rb
|
|
279
|
+
- lib/DhanHQ/market_data.rb
|
|
280
|
+
- lib/DhanHQ/market_data/market_snapshot.rb
|
|
281
|
+
- lib/DhanHQ/market_data/ohlc_series.rb
|
|
282
|
+
- lib/DhanHQ/market_data/option_snapshot.rb
|
|
283
|
+
- lib/DhanHQ/mcp.rb
|
|
284
|
+
- lib/DhanHQ/mcp/server.rb
|
|
277
285
|
- lib/DhanHQ/models/alert_order.rb
|
|
278
286
|
- lib/DhanHQ/models/concerns/api_response_handler.rb
|
|
279
287
|
- lib/DhanHQ/models/edis.rb
|
|
@@ -282,6 +290,7 @@ files:
|
|
|
282
290
|
- lib/DhanHQ/models/funds.rb
|
|
283
291
|
- lib/DhanHQ/models/historical_data.rb
|
|
284
292
|
- lib/DhanHQ/models/holding.rb
|
|
293
|
+
- lib/DhanHQ/models/iceberg_order.rb
|
|
285
294
|
- lib/DhanHQ/models/instrument.rb
|
|
286
295
|
- lib/DhanHQ/models/instrument_helpers.rb
|
|
287
296
|
- lib/DhanHQ/models/kill_switch.rb
|
|
@@ -295,9 +304,14 @@ files:
|
|
|
295
304
|
- lib/DhanHQ/models/position.rb
|
|
296
305
|
- lib/DhanHQ/models/postback.rb
|
|
297
306
|
- lib/DhanHQ/models/profile.rb
|
|
307
|
+
- lib/DhanHQ/models/search_result.rb
|
|
298
308
|
- lib/DhanHQ/models/super_order.rb
|
|
299
309
|
- lib/DhanHQ/models/token_response.rb
|
|
300
310
|
- lib/DhanHQ/models/trade.rb
|
|
311
|
+
- lib/DhanHQ/models/twap_order.rb
|
|
312
|
+
- lib/DhanHQ/option_analytics.rb
|
|
313
|
+
- lib/DhanHQ/option_analytics/black_scholes.rb
|
|
314
|
+
- lib/DhanHQ/option_analytics/max_pain.rb
|
|
301
315
|
- lib/DhanHQ/rate_limiter.rb
|
|
302
316
|
- lib/DhanHQ/requests/optionchain/nifty.json
|
|
303
317
|
- lib/DhanHQ/requests/optionchain/nifty_expiries.json
|
|
@@ -309,6 +323,7 @@ files:
|
|
|
309
323
|
- lib/DhanHQ/resources/funds.rb
|
|
310
324
|
- lib/DhanHQ/resources/historical_data.rb
|
|
311
325
|
- lib/DhanHQ/resources/holdings.rb
|
|
326
|
+
- lib/DhanHQ/resources/iceberg_orders.rb
|
|
312
327
|
- lib/DhanHQ/resources/instruments.rb
|
|
313
328
|
- lib/DhanHQ/resources/ip_setup.rb
|
|
314
329
|
- lib/DhanHQ/resources/kill_switch.rb
|
|
@@ -323,6 +338,36 @@ files:
|
|
|
323
338
|
- lib/DhanHQ/resources/super_orders.rb
|
|
324
339
|
- lib/DhanHQ/resources/trader_control.rb
|
|
325
340
|
- lib/DhanHQ/resources/trades.rb
|
|
341
|
+
- lib/DhanHQ/resources/twap_orders.rb
|
|
342
|
+
- lib/DhanHQ/risk.rb
|
|
343
|
+
- lib/DhanHQ/risk/checks/asm_gsm.rb
|
|
344
|
+
- lib/DhanHQ/risk/checks/concentration.rb
|
|
345
|
+
- lib/DhanHQ/risk/checks/market_hours.rb
|
|
346
|
+
- lib/DhanHQ/risk/checks/max_loss.rb
|
|
347
|
+
- lib/DhanHQ/risk/checks/options.rb
|
|
348
|
+
- lib/DhanHQ/risk/checks/order_type.rb
|
|
349
|
+
- lib/DhanHQ/risk/checks/position_limits.rb
|
|
350
|
+
- lib/DhanHQ/risk/checks/product_support.rb
|
|
351
|
+
- lib/DhanHQ/risk/checks/quantity.rb
|
|
352
|
+
- lib/DhanHQ/risk/checks/trading_permission.rb
|
|
353
|
+
- lib/DhanHQ/risk/pipeline.rb
|
|
354
|
+
- lib/DhanHQ/skills.rb
|
|
355
|
+
- lib/DhanHQ/skills/base.rb
|
|
356
|
+
- lib/DhanHQ/skills/builtin/bear_call_spread.rb
|
|
357
|
+
- lib/DhanHQ/skills/builtin/bull_put_spread.rb
|
|
358
|
+
- lib/DhanHQ/skills/builtin/buy_atm_call.rb
|
|
359
|
+
- lib/DhanHQ/skills/builtin/covered_call.rb
|
|
360
|
+
- lib/DhanHQ/skills/builtin/iron_condor.rb
|
|
361
|
+
- lib/DhanHQ/skills/builtin/market_data_summarizer.rb
|
|
362
|
+
- lib/DhanHQ/skills/builtin/protective_put.rb
|
|
363
|
+
- lib/DhanHQ/skills/builtin/square_off_all.rb
|
|
364
|
+
- lib/DhanHQ/skills/builtin/square_off_position.rb
|
|
365
|
+
- lib/DhanHQ/skills/builtin/straddle.rb
|
|
366
|
+
- lib/DhanHQ/skills/builtin/strangle.rb
|
|
367
|
+
- lib/DhanHQ/skills/registry.rb
|
|
368
|
+
- lib/DhanHQ/skills/workflow.rb
|
|
369
|
+
- lib/DhanHQ/strategy.rb
|
|
370
|
+
- lib/DhanHQ/strategy/base.rb
|
|
326
371
|
- lib/DhanHQ/utils/network_inspector.rb
|
|
327
372
|
- lib/DhanHQ/version.rb
|
|
328
373
|
- lib/DhanHQ/ws.rb
|
|
@@ -354,7 +399,9 @@ files:
|
|
|
354
399
|
- lib/DhanHQ/ws/sub_state.rb
|
|
355
400
|
- lib/DhanHQ/ws/websocket_packet_parser.rb
|
|
356
401
|
- lib/dhan_hq.rb
|
|
402
|
+
- lib/dhan_hq/agent.rb
|
|
357
403
|
- lib/dhan_hq/analysis.rb
|
|
404
|
+
- lib/dhan_hq/mcp.rb
|
|
358
405
|
- lib/dhan_hq/ta.rb
|
|
359
406
|
- lib/dhanhq/analysis/helpers/bias_aggregator.rb
|
|
360
407
|
- lib/dhanhq/analysis/helpers/moneyness_helper.rb
|
|
@@ -369,6 +416,34 @@ files:
|
|
|
369
416
|
- lib/ta/market_calendar.rb
|
|
370
417
|
- lib/ta/technical_analysis.rb
|
|
371
418
|
- sig/DhanHQ.rbs
|
|
419
|
+
- skills/dhanhq-ruby/SKILL.md
|
|
420
|
+
- skills/dhanhq-ruby/examples/fetch_option_chain.rb
|
|
421
|
+
- skills/dhanhq-ruby/examples/gtt_forever_order.rb
|
|
422
|
+
- skills/dhanhq-ruby/examples/historical_data_analysis.rb
|
|
423
|
+
- skills/dhanhq-ruby/examples/iron_condor.rb
|
|
424
|
+
- skills/dhanhq-ruby/examples/live_feed_setup.rb
|
|
425
|
+
- skills/dhanhq-ruby/examples/margin_check.rb
|
|
426
|
+
- skills/dhanhq-ruby/examples/order_management.rb
|
|
427
|
+
- skills/dhanhq-ruby/examples/place_equity_order.rb
|
|
428
|
+
- skills/dhanhq-ruby/examples/place_fno_order.rb
|
|
429
|
+
- skills/dhanhq-ruby/examples/portfolio_summary.rb
|
|
430
|
+
- skills/dhanhq-ruby/examples/super_order_with_sl.rb
|
|
431
|
+
- skills/dhanhq-ruby/references/backtesting-with-dhan.md
|
|
432
|
+
- skills/dhanhq-ruby/references/common-workflows.md
|
|
433
|
+
- skills/dhanhq-ruby/references/error-codes.md
|
|
434
|
+
- skills/dhanhq-ruby/references/funds.md
|
|
435
|
+
- skills/dhanhq-ruby/references/instruments.md
|
|
436
|
+
- skills/dhanhq-ruby/references/live-feed.md
|
|
437
|
+
- skills/dhanhq-ruby/references/market-data.md
|
|
438
|
+
- skills/dhanhq-ruby/references/option-chain.md
|
|
439
|
+
- skills/dhanhq-ruby/references/options-analysis-patterns.md
|
|
440
|
+
- skills/dhanhq-ruby/references/orders.md
|
|
441
|
+
- skills/dhanhq-ruby/references/portfolio.md
|
|
442
|
+
- skills/dhanhq-ruby/references/scanx-data.md
|
|
443
|
+
- skills/dhanhq-ruby/scripts/dhan_helpers.rb
|
|
444
|
+
- skills/dhanhq-ruby/scripts/resolve_security.rb
|
|
445
|
+
- skills/dhanhq-ruby/scripts/trade_logger.rb
|
|
446
|
+
- skills/dhanhq-ruby/scripts/validate_order.rb
|
|
372
447
|
- watchlist.csv
|
|
373
448
|
homepage: https://github.com/shubhamtaywade82/dhanhq-client
|
|
374
449
|
licenses:
|