# @name MOEX Market # @desc MOEX stocks and futures price display # @author Avemer # @version 1.0 class MOEXMarket # USER VARIABLES var MARKET_TYPE var TICKER var TICKER_LETTERS var TICKER_COLOR var PRICE_COLOR_MODE var PRICE_COLOR var UPDATE_TICKS var GAP # INTERNAL VARIABLES var result var oldPrice var previousPrice var ticks var color var displayTICKER # ================ START OF USER SETTINGS ================ def init() # MARKET TYPE # 0 = stock # 1 = futures self.MARKET_TYPE = 1 # STOCK TIKER # Stock examples: SBER, BSPB, PHOR # Futures examples: CRU6, SiU6, BRU6 self.TICKER = "CRU6" # NUMBER OF TICKER LETTERS DISPLAYED # 0 = hide # 1 = S # 2 = SB # 3 = SBE # 4 = SBER # 5+ = full ticker self.TICKER_LETTERS = 2 # TICKER COLOR # Format: 0xRRGGBB # Examples: # 0xFFFFFF White # 0xFF0000 Red # 0x00FF00 Green # 0x0000FF Blue # 0xFFFF00 Yellow # 0x00FFFF Cyan # 0xFF00FF Magenta self.TICKER_COLOR = 0xFFFFFF # PRICE COLOR MODE # 0 = white # 1 = custom PRICE_COLOR # 2 = green/red automatically self.PRICE_COLOR_MODE = 2 # CUSTOM PRICE COLOR # Used when PRICE_COLOR_MODE = 1. self.PRICE_COLOR = 0xFFFFFF # UPDATE INTERVAL # 1 = approximately every 1 second (can be out of memory on ULANZI TC001) # 5 = approximately every 5 seconds (can be out of memory on ULANZI TC001) # 10 = approximately every 10 seconds (recommended) self.UPDATE_TICKS = 10 # DISTANCE BETWEEN TICKER AND PRICE self.GAP = 2 # ================ END OF USER SETTINGS ================ # INITIAL VALUES self.result = "..." self.oldPrice = 0 self.previousPrice = 0 self.ticks = 0 self.color = 0xFFFFFF self.displayTICKER = "" # CREATE DISPLAYED TICKER if self.TICKER_LETTERS <= 0 self.displayTICKER = "" elif self.TICKER_LETTERS == 1 self.displayTICKER = self.TICKER[0] elif self.TICKER_LETTERS == 2 self.displayTICKER = self.TICKER[0] + self.TICKER[1] elif self.TICKER_LETTERS == 3 self.displayTICKER = self.TICKER[0] + self.TICKER[1] + self.TICKER[2] elif self.TICKER_LETTERS == 4 self.displayTICKER = self.TICKER[0] + self.TICKER[1] + self.TICKER[2] + self.TICKER[3] else self.displayTICKER = self.TICKER end end # APPLY PRICE COLOR def update_color() # Fixed white mode. if self.PRICE_COLOR_MODE == 0 self.color = 0xFFFFFF return end # Custom color mode. if self.PRICE_COLOR_MODE == 1 self.color = self.PRICE_COLOR return end # Automatic green/red mode. # Compare the current price with # the previous price received by the script. if self.previousPrice > 0 if self.oldPrice > self.previousPrice self.color = 0x00FF00 elif self.oldPrice < self.previousPrice self.color = 0xFF0000 else self.color = 0xFFFFFF end end end # CURRENT PRICE def on_price(w, st) if w == nil return end var m # STOCK if self.MARKET_TYPE == 0 m = re.search( "\"TQBR\"\\s*,\\s*([0-9.]+)", w ) # FUTURES else m = re.search( "\"data\":\\s*\\[\\s*\\[\\s*\"[^\"]+\"\\s*,\\s*\"[^\"]+\"\\s*,\\s*([0-9.]+)", w ) end if m == nil return end var newPrice = num(m[1]) if newPrice == nil return end # Save previous price before replacing it. self.previousPrice = self.oldPrice # Save current price. self.oldPrice = newPrice self.result = m[1] # Recalculate color. self.update_color() end # MAIN LOOP def loop() if self.ticks <= 0 self.ticks = self.UPDATE_TICKS # CURRENT PRICE if self.MARKET_TYPE == 0 http.get( "https://iss.moex.com/iss/engines/stock/markets/shares/securities/" + self.TICKER + ".json?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,BOARDID,LAST", / b, st -> self.on_price(b, st) ) else http.get( "https://iss.moex.com/iss/engines/futures/markets/forts/securities/" + self.TICKER + ".json?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,BOARDID,LAST", / b, st -> self.on_price(b, st) ) end end self.ticks -= 1 end # DRAW def draw() clear() var tickerWidth = text_ink_width(self.displayTICKER) var priceWidth = text_ink_width(self.result) var totalWidth = tickerWidth + self.GAP + priceWidth var x = int((width() - totalWidth) / 2) if self.TICKER_LETTERS > 0 text( x, 7, self.displayTICKER, self.TICKER_COLOR ) end text( x + tickerWidth + self.GAP, 7, self.result, self.color ) end def on_button(btn) end end return MOEXMarket()