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
SYMBOL_TYPE_COLUMN_ID =
"SymbolType"
SYMBOL_TYPE_ORDER =
%w[CommonStock PreferredStock DepositaryReceipt].freeze

Instance Method Summary collapse

Constructor Details

#initialize(screen_data, field_contract: nil) ⇒ Converter

Returns a new instance of Converter.



223
224
225
226
# File 'lib/tradingview_screener/screen_data.rb', line 223

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

Instance Method Details

#marketsObject



228
229
230
231
# File 'lib/tradingview_screener/screen_data.rb', line 228

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

#to_payloadObject



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
258
259
260
261
262
# File 'lib/tradingview_screener/screen_data.rb', line 233

def to_payload
  source_filters = Array(@data["filters"])
  filter2 = convert_symbol_type_filter2(source_filters)
  filters = convert_filters(source_filters.reject { |filter| symbol_type_filter?(filter) })
  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" => 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