Class: TradingviewScreener::ScreenData::Converter

Inherits:
Object
  • Object
show all
Defined in:
lib/tradingview_screener/screen_data.rb

Constant Summary collapse

COLUMN_MAP =
{
  "Price" => "close",
  "Exchange" => "exchange",
  "Change" => "change",
  "Volume" => "volume",
  "MarketCap" => "market_cap_basic",
  "PriceToEarnings" => "price_earnings_ttm",
  "EpsDiluted" => "earnings_per_share_diluted_ttm",
  "EpsDilutedGrowth" => "earnings_per_share_diluted_yoy_growth_ttm",
  "DividendsYield" => "dividends_yield_current",
  "Sector" => "sector",
  "AnalystRating" => "AnalystRating",
  "PreMarketChange" => "premarket_change",
  "PreMarketVolume" => "premarket_volume",
  "PreMarketGap" => "premarket_gap",
  "TickerUniversal" => "ticker-view",
  "RelativeVolume" => "relative_volume_10d_calc",
  "RelativeVolumeAtTime" => "relative_volume_intraday|5",
  "AverageTrueRangePercent" => "ATRP",
  "PriceAvgVolume" => "AvgValue.Traded_10d",
  "AverageVolume" => "average_volume_10d_calc",
  "Performance" => "Perf.W",
  "RevenueGrowth" => "total_revenue_yoy_growth_ttm",
  "PriceToEarningsToGrowth" => "price_earnings_growth_ttm",
  "ReturnOnEquity" => "return_on_equity",
  "Beta" => "beta_1_year",
  "Ma" => "SMA"
}.freeze
SORT_MAP =
{
  "PreMarketVolume" => "premarket_volume",
  "MarketCap" => "market_cap_basic",
  "Volume" => "volume",
  "Change" => "change",
  "Price" => "close",
  "PreMarketChange" => "premarket_change",
  "RelativeVolume" => "relative_volume_10d_calc"
}.freeze
DEFAULT_COLUMNS =
%w[
  ticker-view close type typespecs pricescale minmov fractional minmove2 currency
  change volume relative_volume_10d_calc market_cap_basic fundamental_currency_code
  price_earnings_ttm earnings_per_share_diluted_ttm earnings_per_share_diluted_yoy_growth_ttm
  dividends_yield_current sector.tr market sector AnalystRating AnalystRating.tr
  premarket_change premarket_volume
].freeze
OPERATION_MAP =
{
  "above" => "greater",
  "greater" => "greater",
  "below" => "less",
  "less" => "less",
  "aboveOrEqual" => "egreater",
  "above_or_equal" => "egreater",
  "egreater" => "egreater",
  "belowOrEqual" => "eless",
  "below_or_equal" => "eless",
  "eless" => "eless",
  "equal" => "equal",
  "eq" => "equal",
  "notEqual" => "nequal",
  "not_equal" => "nequal",
  "nequal" => "nequal",
  "between" => "in_range",
  "inRange" => "in_range",
  "in_range" => "in_range",
  "outside" => "not_in_range",
  "notBetween" => "not_in_range",
  "not_between" => "not_in_range",
  "notInRange" => "not_in_range",
  "not_in_range" => "not_in_range",
  "crosses" => "crosses",
  "crossesUp" => "crosses_above",
  "crossesAbove" => "crosses_above",
  "crosses_above" => "crosses_above",
  "crossesDown" => "crosses_below",
  "crossesBelow" => "crosses_below",
  "crosses_below" => "crosses_below"
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(screen_data, field_contract: nil) ⇒ Converter

Returns a new instance of Converter.



220
221
222
223
# File 'lib/tradingview_screener/screen_data.rb', line 220

def initialize(screen_data, field_contract: nil)
  @data = deep_stringify(screen_data)
  @field_contract = field_contract
end

Instance Method Details

#marketsObject



225
226
227
228
# File 'lib/tradingview_screener/screen_data.rb', line 225

def markets
  values = Array(@data.dig("market_settings", "markets"))
  values.empty? ? ["america"] : values.map(&:to_s)
end

#to_payloadObject



230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/tradingview_screener/screen_data.rb', line 230

def to_payload
  filters = convert_filters(Array(@data["filters"]))
  if @data.dig("market_settings", "is_primary_listing")
    validate_field!("is_primary")
    filters << { "left" => "is_primary", "operation" => "equal", "right" => true }
  end
  %w[type typespecs].each { |field| validate_field!(field) }

  {
    "markets" => markets,
    "symbols" => {},
    "options" => { "lang" => "en" },
    "columns" => convert_columns(Array(@data["default_custom_column_set"])),
    "filter" => filters,
    "filter2" => deep_dup(Relation::STOCK_TYPE_FILTER2),
    "sort" => convert_sort,
    "range" => [0, 100],
    "ignore_unknown_fields" => false,
    "meta" => {
      "id" => @data["id"],
      "title" => @data["title"],
      "version" => @data["version"],
      "date_created" => @data["date_created"],
      "date_updated" => @data["date_updated"],
      "date_used" => @data["date_used"]
    }.compact
  }
end