init push - laying out the project
This commit is contained in:
77
portal/app/lib/integrations/betfair/opportunity_hunter.rb
Normal file
77
portal/app/lib/integrations/betfair/opportunity_hunter.rb
Normal file
@ -0,0 +1,77 @@
|
||||
module Integrations
|
||||
module Betfair
|
||||
class OpportunityHunter < Base
|
||||
def events_in_timeframe(from:, to:)
|
||||
raise "Timeframe not set " unless from.present? && to.present?
|
||||
|
||||
timeframe = { from: from.iso8601, to: to.iso8601 }
|
||||
filter = { marketStartTime: timeframe }
|
||||
body = { filter: filter }
|
||||
|
||||
r = self.class.post("#{API_BETTING_ENDPOINT}/listEvents/", { headers: @connection.api_headers, body: body.to_json })
|
||||
events = []
|
||||
r.each do |e|
|
||||
ev = e['event']
|
||||
events << BetfairEvent.new(event_id: ev['id'], event_name: ev['name'], event_start: DateTime.parse(ev['openDate']))
|
||||
end
|
||||
import_result = BetfairEvent.import(events, on_duplicate_key_ignore: true)
|
||||
puts "#{import_result.ids.size} events added"
|
||||
end
|
||||
|
||||
def event_markets_and_selections
|
||||
batches = []
|
||||
batch = 0
|
||||
limit = 10
|
||||
BetfairEvent.open.order(created_at: :desc).pluck(:event_id).each do |eid|
|
||||
batches[batch] ||= []
|
||||
if batches[batch].size < limit
|
||||
batches[batch] << eid
|
||||
else
|
||||
batch += 1
|
||||
end
|
||||
end
|
||||
batches.each { |b| batch_event_runners b }
|
||||
end
|
||||
|
||||
def runner_odds(runner)
|
||||
body = { marketId: runner.market_id, selectionId: runner.selection_id }
|
||||
body[:priceProjection] = { priceData: ['EX_BEST_OFFERS'], virtualise: true }
|
||||
r = self.class.post("#{API_BETTING_ENDPOINT}/listRunnerBook/", { headers: @connection.api_headers, body: body.to_json })
|
||||
runners = r[0]['runners']
|
||||
raise '[Odds] - cannot identify prices' unless runners
|
||||
|
||||
rs = runners.first
|
||||
raise '[Odds] - cannot identify prices' unless rs && rs['ex'] && rs['ex']['availableToBack']
|
||||
|
||||
imports = []
|
||||
rs['ex']['availableToBack'].each do |ex|
|
||||
imports << BetfairRunnerOdd.new(betfair_event_runner_id: runner.id, odds: ex['price'], total_matched: 0, total_available: ex['size'], bet_type: 'back')
|
||||
end
|
||||
rs['ex']['availableToLay'].each do |ex|
|
||||
imports << BetfairRunnerOdd.new(betfair_event_runner_id: runner.id, odds: ex['price'], total_matched: 0, total_available: ex['size'], bet_type: 'lay')
|
||||
end
|
||||
|
||||
BetfairRunnerOdd.import(imports, on_duplicate_key_ignore: true)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def batch_event_runners(batch)
|
||||
body = { maxResults: 1000 - (10 * (batch.size - 1)), filter: { eventIds: batch }, marketProjection: ['EVENT', 'RUNNER_DESCRIPTION'] }
|
||||
markets = self.class.post("#{API_BETTING_ENDPOINT}/listMarketCatalogue/", { headers: @connection.api_headers, body: body.to_json })
|
||||
import = []
|
||||
markets.each do |market|
|
||||
market_fragment = { event_id: market['event']['id'], market_id: market['marketId'], market_name: market['marketName'] }
|
||||
runners = market['runners']
|
||||
runners&.each do |runner|
|
||||
rec = { selection_id: runner['selectionId'] || runner['runnerName'], selection_name: runner['runnerName'] }.merge(market_fragment)
|
||||
import << BetfairEventRunner.new(rec)
|
||||
end
|
||||
end
|
||||
import_result = BetfairEventRunner.import(import, on_duplicate_key_ignore: true)
|
||||
puts "#{import_result.ids.size} runners added"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user