Skip to content

Instantly share code, notes, and snippets.

@alyoshenka
Last active October 21, 2021 23:19
Show Gist options
  • Save alyoshenka/af880ca471cc5d429413519a44a73423 to your computer and use it in GitHub Desktop.
Save alyoshenka/af880ca471cc5d429413519a44a73423 to your computer and use it in GitHub Desktop.
Stock Ticker
*.pyc
robin_stocks/
__pycache__/

A stock ticker retrieval and display program Data queried from Robinhood using robin_stocks Data displayed on ws2811 LED strip Running on a Raspberry Pi 3B+

video

def convert(num, h=8):
# if in even column
if num % (h * 2) < h:
return num
# offset from column start
offset = num % h
# column start
start = num - offset
# inverted value
inv = start + (h - 1) - offset
return inv
def test_convert():
assert convert(0) == 0
assert convert(7) == 7
assert convert(8) == 15
assert convert(15) == 8
assert convert(9) == 14
assert convert(10) == 13
test_convert()
# gui
from letters import SPACE, a
import pygame
from led import LED_GUI
from writing import (
FullDisplay,
Color,
convert_old_character_to_lines,
convert_string_to_data_array,
convert_10_to_colors,
)
import time
import threading
import stocks
import pprint
sleep_time = 0.05
W = 32
H = 8
S = 20
O = S * 2
green = Color(0, 150, 0)
blue = Color(0, 0, 150)
red = Color(150, 0, 0)
# add new stock data to the end
def add_stock_data(sym, display_data):
stock = stocks.Stock(sym)
arr = convert_string_to_data_array(stock.get_display() + " ")
arr = convert_old_character_to_lines(arr)
arr = convert_10_to_colors(arr, green if stock.delta_up() else red)
print("adding", len(arr), "lines of data")
for line in arr:
display_data.data.append(line)
# initialize led position
def initialize_leds(leds):
for c in range(0, W):
for r in range(0, H):
i = c * H + r
pos = (20 + c * O, 20 + r * O)
led = LED_GUI(position=pos, size=S)
led.turn_on()
leds.append(led)
# text loop
def loop(screen, display_data, leds, col_idx):
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
screen.fill((30, 30, 30))
colors = display_data.get_data_slice(col_idx)
for i in range(W * H):
leds[i].color = colors[i]
leds[i].draw(screen)
pygame.display.flip()
time.sleep(sleep_time)
return True
def run():
leds = []
initialize_leds(leds)
stocks.login()
syms = stocks.get_stock_symbols()
sym_idx = 0
display_data = FullDisplay(_wrap=True)
display_data.add_front_padding()
for i in range(3):
add_stock_data(syms[sym_idx], display_data)
sym_idx = sym_idx + 1
screen = pygame.display.set_mode([W * 40, H * 40])
pygame.init()
col_idx = 0
running = True
thread = None
while running:
running = loop(screen, display_data, leds, col_idx)
col_idx = col_idx + 1
if col_idx >= display_data.data_length():
col_idx = 0
if col_idx > W * 3:
print(">")
if col_idx == W * 3:
display_data.cut(W * 3)
col_idx = 0
print("lines:", display_data.data_length())
if display_data.data_length() < W * 4 and (
thread == None or not thread.is_alive()
):
thread = threading.Thread(
target=add_stock_data,
args=(
(
syms[sym_idx],
display_data,
)
),
)
thread.start()
sym_idx = sym_idx + 1
if sym_idx >= len(syms):
sym_idx = 0
pygame.quit()
from letters import *
uppercase = [
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
]
lowercase = [
a,
b,
c,
d,
e,
f,
g,
h,
i,
j,
k,
l,
m,
n,
o,
p,
q,
r,
s,
t,
u,
v,
w,
x,
y,
z,
]
symbols = {
"$": DOLLAR,
"%": PERCENT,
"↑": UP,
"↓": DOWN,
"(": OPEN,
")": CLOSE,
"-": MINUS,
".": PERIOD,
":": COLON,
"=": EQUALS,
"~": TILDE,
"!": EXCLAMATION,
"@": AT,
"&": AMPERSAND,
"*": ASTERISK,
"?": QUESTION,
"<": LESSTHAN,
">": GREATERTHAN,
";": SEMICOLON,
"|": PIPE,
"{": OPENCURLY,
"}": CLOSECURLY,
'"': DOUBLEQUOTE,
"'": SINGLEQUOTE,
" ": SPACE,
}
numbers = [ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE]
# leds
from sys import setprofile
import pygame.draw as draw
# represents a GUI LED
class LED_GUI:
def __init__(self, position=(0, 0), size=0):
self.position = position
self.color = (0, 0, 0)
self.turn_on()
self.size = size
def draw(self, screen):
if self.color != (0, 0, 0):
try:
draw.circle(
screen,
(self.color.r, self.color.g, self.color.b),
self.position,
self.size,
)
except Exception as e:
print(e)
def turn_off(self):
self.color = (0, 0, 0)
def turn_on(self):
self.color = (0, 0, 255)
# represents a physical, addressable LED
class LED_Other:
def __init__(self):
self.idx = -1
# uppercase
def A():
return [[2, 3, 4, 5, 6], [9, 12], [17, 20], [25, 26, 27, 28, 29, 30]]
def B():
return [[1, 2, 3, 4, 5, 6], [9, 11, 14], [17, 19, 22], [26, 28, 29]]
def C():
return [[2, 3, 4, 5], [9, 14], [17, 22], [26, 29]]
def D():
return [[1, 2, 3, 4, 5, 6], [9, 14], [17, 22], [26, 27, 28, 29]]
def E():
return [[1, 2, 3, 4, 5, 6], [9, 12, 14], [17, 20, 22], [25, 30]]
def F():
return [[1, 2, 3, 4, 5, 6], [9, 12], [17, 20], [25]]
def G():
return [[2, 3, 4, 5], [9, 14], [17, 20, 22], [26, 28, 29]]
def H():
return [[1, 2, 3, 4, 5, 6], [12], [20], [25, 26, 27, 28, 29, 30]]
def I():
return [[1, 6], [9, 10, 11, 12, 13, 14], [17, 22]]
def J():
return [[1, 5], [9, 14], [17, 18, 19, 20, 21], [25]]
def K():
return [[1, 2, 3, 4, 5, 6], [11], [18, 20], [25, 29, 30]]
def L():
return [[1, 2, 3, 4, 5, 6], [14], [22], [30]]
def M():
return [
[1, 2, 3, 4, 5, 6],
[9],
[17, 18, 19, 20, 21, 22],
[25],
[34, 35, 36, 37, 38],
]
def N():
return [[1, 2, 3, 4, 5, 6], [11], [20], [25, 26, 27, 28, 29, 30]]
def O():
return [[2, 3, 4, 5], [9, 14], [17, 22], [26, 27, 28, 29]]
def P():
return [[1, 2, 3, 4, 5, 6], [9, 12], [17, 20], [26, 27]]
def Q():
return [[2, 3, 4, 5], [9, 14], [17, 21, 22], [26, 27, 28, 29, 30]]
def R():
return [[1, 2, 3, 4, 5, 6], [9, 12], [17, 20, 21], [26, 27, 30]]
def S():
return [[2, 6], [9, 11, 14], [17, 19, 22], [25, 28, 29]]
def T():
return [[1], [9, 10, 11, 12, 13, 14], [17], [25]]
def U():
return [[1, 2, 3, 4, 5], [14], [22], [25, 26, 27, 28, 29]]
def V():
return [[1, 2, 3, 4], [13], [22], [25, 26, 27, 28, 29, 30]]
def W():
return [[1, 2, 3, 4, 5], [14], [17, 18, 19, 20, 21, 22], [30], [33, 34, 35, 36, 37]]
def X():
return [[1, 2, 4, 5, 6], [11], [19], [25, 26, 28, 29, 30]]
def Y():
return [[1, 2, 3, 6], [12, 14], [20, 22], [25, 26, 27, 28, 29]]
def Z():
return [[1, 5, 6], [9, 12, 14], [17, 19, 22], [25, 26, 30]]
# lowercase
def a():
return [[5], [10, 12, 14], [18, 20, 22], [27, 28, 29, 30]]
def b():
return [[1, 2, 3, 4, 5, 6], [11, 14], [19, 22], [28, 29]]
def c():
return [[3, 4, 5], [10, 14], [18, 22], [27, 29]]
def d():
return [[4, 5], [11, 14], [19, 22], [25, 26, 27, 28, 29, 30]]
def e():
return [[3, 4, 5], [10, 12, 14], [18, 20, 22], [27]]
def f():
return [[3], [9, 10, 11, 12, 13, 14], [17, 19]]
def g():
return [[3, 4], [10, 13, 15], [18, 21, 23], [27, 28, 29, 30]]
def h():
return [[1, 2, 3, 4, 5, 6], [11], [19], [28, 29, 30]]
def i():
return [[1, 3, 4, 5, 6]]
def j():
return [[3, 7], [9, 11, 12, 13, 14]]
def k():
return [[1, 2, 3, 4, 5, 6], [12], [19, 21], [26, 30]]
def l():
return [[1, 2, 3, 4, 5, 6], [14]]
def m():
return [[2, 3, 4, 5, 6], [10], [18, 19, 20, 21, 22], [26], [35, 36, 37, 38]]
def n():
return [[2, 3, 4, 5, 6], [10], [18], [27, 28, 29, 30]]
def o():
return [[3, 4, 5], [10, 14], [18, 22], [27, 28, 29]]
def p():
return [[2, 3, 4, 5, 6, 7], [10, 13], [18, 21], [27, 28]]
def q():
return [[3, 4], [10, 13], [18, 21], [26, 27, 28, 29, 30, 31]]
def r():
return [[2, 3, 4, 5, 6], [10], [19]]
def s():
return [[3, 6], [10, 12, 14], [18, 20, 22], [26, 29]]
def t():
return [[2], [9, 10, 11, 12, 13, 14], [18, 22]]
def u():
return [[2, 3, 4, 5], [14], [22], [26, 27, 28, 29]]
def v():
return [[2, 3, 4], [13], [22], [26, 27, 28, 29]]
def w():
return [[2, 3, 4, 5], [14], [18, 19, 20, 21, 22], [30], [34, 35, 36, 37]]
def x():
return [[2, 3, 5, 6], [12], [20], [26, 27, 29, 30]]
def y():
return [[2, 3, 4], [13, 15], [21, 23], [26, 27, 28, 29, 30]]
def z():
return [[2, 5, 6], [10, 12, 14], [18, 20, 22], [26, 27, 30]]
# symbols
def DOLLAR():
return [
[2, 6],
[9, 11, 14],
[16, 17, 18, 19, 20, 21, 22, 23],
[25, 27, 30],
[33, 36, 37],
]
def UP():
return [[3], [10], [17, 18, 19, 20, 21, 22], [26], [35]]
def DOWN():
return [[4], [13], [17, 18, 19, 20, 21, 22], [29], [36]]
def PERCENT():
return [[1, 5, 6], [12], [19], [25, 26, 30]]
def OPEN():
return [[1, 2, 3, 4, 5, 6], [9, 14]]
def CLOSE():
return [[1, 6], [9, 10, 11, 12, 13, 14]]
def MINUS():
return [[3], [11], [19]]
def PERIOD():
return [[6]]
def COLON():
return [[2, 4]]
def EQUALS():
return [[2, 4], [10, 12], [18, 20]]
def TILDE():
return [[2], [9], [18], [25]]
def EXCLAMATION():
return [[1, 2, 3, 4, 6]]
def AT():
return [[2, 3, 4, 5], [9, 14], [17, 19, 20, 22], [25, 26, 27, 28, 30]]
def AMPERSAND():
return [[2, 4, 5], [9, 11, 14], [18, 20, 22], [29], [36, 38]]
def ASTERISK():
return [[1, 3], [10], [17, 19]]
def QUESTION():
return [[2], [9, 12, 13, 15], [17, 19], [26]]
def LESSTHAN():
return [[3], [10, 12], [17, 21]]
def GREATERTHAN():
return [[1, 5], [10, 12], [19]]
def SEMICOLON():
return [[5], [10, 12]]
def PIPE():
return [[1, 2, 3, 4, 5, 6]]
def OPENCURLY():
return [[3], [9, 10, 11, 13], [17, 22]]
def CLOSECURLY():
return [[1, 5], [9, 10, 12, 13], [19]]
def DOUBLEQUOTE():
return [[1, 2], [], [17, 18]]
def SINGLEQUOTE():
return [[1, 2]]
def SPACE(width=4):
ret = []
for i in range(width):
ret.append([])
return ret
# numbers
def ZERO():
return [[2, 3, 4, 5], [9, 12, 14], [17, 18, 22], [26, 27, 28, 29]]
def ONE():
return [[3, 6], [10, 14], [17, 18, 19, 20, 21, 22], [30]]
def TWO():
return [[2, 5, 6], [9, 12, 14], [17, 20, 22], [26, 27, 30]]
def THREE():
return [[2, 5], [9, 14], [17, 19, 22], [26, 28, 29]]
def FOUR():
return [[3, 4], [10, 12], [17, 18, 19, 20, 21, 22], [28]]
def FIVE():
return [[1, 2, 3, 5], [9, 11, 14], [17, 19, 22], [25, 28, 29]]
def SIX():
return [[2, 3, 4, 5], [9, 11, 14], [17, 19, 22], [25, 28, 29]]
def SEVEN():
return [[1], [9, 12, 13, 14], [17, 19], [25, 26]]
def EIGHT():
return [[2, 4, 5], [9, 11, 14], [17, 19, 22], [26, 28, 29]]
def NINE():
return [[2, 3, 6], [9, 12, 14], [17, 20, 22], [26, 27, 28, 29]]
---
Time: 2021-08-31 21:03:13.887709
Error: <class 'IndexError'>
Message: list index out of range
---
Please enter a valid code.
Please enter a valid code.
def log_message(msg, fileName="/home/jay/StockTicker/log.txt"):
"""log message to file"""
file = open(fileName, "a")
file.write("---\n")
file.write(msg)
file.write("\n---\n\n")
file.close()
return True
def construct_error_message(msg, timeStr, errorType):
"""constructs an error message"""
errorMsg = (
"Time: " + timeStr + "\n" + "Error: " + errorType + "\n" + "Message: " + msg
)
return errorMsg
#!/usr/bin/env python3
# NeoPixel library strandtest example
# Author: Tony DiCola (tony@tonydicola.com)
#
# Direct port of the Arduino NeoPixel library strandtest example. Showcases
# various animations on a strip of NeoPixels.
from writing import FullDisplay
from stocks import get_stock_symbols, login
from display import add_stock_data
from strip import init_strip, set_display, clear_display, convert_to_lib_color
from operation_checker import connected_to_internet
from logger import log_message, construct_error_message
from math import floor
from datetime import datetime
import time
import threading
import sys
sleep_time = 0.1
WIDTH = 32
HEIGHT = 8
# display all stocks
def run_stocks(strip):
if not connected_to_internet():
print("Not connected to internet")
timeString = (str)(datetime.now())
msg = construct_error_message("Not connected to Internet", timeString, "")
log_message(msg)
return False
if not login():
timeString = (str)(datetime.now())
msg = construct_error_message("Unable to login", timeString, "")
log_message(msg)
return False
symbols = get_stock_symbols() # stock symbols
symbol_idx = 0 # current stock symbol
data_container = FullDisplay(_wrap=True)
data_container.add_front_padding()
for i in range(3):
add_stock_data(symbols[symbol_idx], data_container)
symbol_idx = symbol_idx + 1
column_idx = 0 # column to take color data from
thread = None
run = True
while run:
try:
# get current "frame" of colors
colors = data_container.get_data_slice(column_idx, flip=True)
for i in range(len(colors)):
c = colors[i]
bc = convert_to_lib_color(c.r, c.g, c.b)
strip.setPixelColor(i, bc)
# "publish" colors
strip.show()
# scroll
column_idx = column_idx + 1
if column_idx >= data_container.data_length():
column_idx = 0
# error checking
if column_idx > WIDTH * 3:
print(">")
# cut off front of array
if column_idx == WIDTH * 3:
data_container.cut(WIDTH * 3)
column_idx = 0
print("lines:", data_container.data_length())
# add new data (to end)
if data_container.data_length() < WIDTH * 4 and (
thread == None or not thread.is_alive()
):
thread = threading.Thread(
target=add_stock_data,
args=(
(
symbols[symbol_idx],
data_container,
)
),
)
thread.start()
# iterate through symbols
symbol_idx = symbol_idx + 1
if symbol_idx >= len(symbols):
symbol_idx = 0
time.sleep(sleep_time)
except KeyboardInterrupt: # ctrl + c
clear_display(strip)
exit()
except Exception as e: # else
timeString = (str)(datetime.now())
errorType = (str)((type)(e))
errorMsg = (str)(e)
msg = construct_error_message(errorMsg, timeString, errorType)
log_message(msg)
clear_display(strip)
exit()
if __name__ == "__main__":
try:
time.sleep(10)
strip = init_strip()
run_stocks(strip)
except Exception as e:
file = open("/home/jay/StockTicker/log.txt", 'a')
file.write((str)(e))
file.write("\n\n")
file.close()
def test_stocks(strip):
login()
my_stocks = build_stocks()
for stock in my_stocks:
stock.display()
strip.setBrightness(5)
writer = Writer(strip)
green = Color(0, 255, 0)
red = Color(255, 0, 0)
sym = Message()
for stock in my_stocks:
msg = stock.to_message()
sym.addMessage(msg)
# sym.addSpace(4)
while True:
clearDisplay()
writer.writeMessage(sym)
strip.show()
sym.scroll(-1)
time.sleep(0.1)
def test_letters(strip):
msg = Message()
for letter in uppercase:
msg.addLetter(Letter(letter()))
for letter in lowercase:
msg.addLetter(Letter(letter()))
for number in numbers:
msg.addLetter(Letter(number()))
# for symbol in symbols:
# msg.addLetter(Letter(symbols.get(symbol)()))
msg.addSpace()
msg1 = Message()
msg1.addLetter(Letter(m()))
msg1.addLetter(Letter(s()))
msg1.addLetter(Letter(g()))
msg2 = Message()
for i in range(6):
msg2.addLetter(Letter(SIX()))
msg = msg1
msg.addMessage(msg2)
strip.setBrightness(5)
writer = Writer(strip)
while True:
clearDisplay()
writer.writeMessage(msg)
strip.show()
msg.scroll(-1)
time.sleep(0.2)
def hello_world(strip):
msg = Message()
msg.addString("Hello World *$")
msg.addSpace(4)
strip.setBrightness(3)
writer = Writer(strip)
while True:
clearDisplay()
writer.writeMessage(msg)
strip.show()
msg.scroll(-1)
time.sleep(0.1)
def test_symbols(strip):
msg = Message()
for s in symbols:
msg.addLetter(Letter(symbols.get(s)()))
msg.addSpace(4)
strip.setBrightness(2)
writer = Writer(strip)
while True:
clearDisplay()
writer.writeMessage(msg)
strip.show()
msg.scroll(-1)
time.sleep(0.1)
import requests
def connected_to_internet():
"""returns whether an internet connection is detected"""
try:
requests.get("https://google.com", timeout=5)
return True
except (requests.ConnectionError, requests.Timeout) as e:
return False
else:
return True # not sure
import platform
def windows():
"""windows is current platform"""
return platform.platform().startswith("Windows")
requests==2.20.0
Copyright (c) 2018 Joshua M. Fernandes
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
#!/bin/bash
sudo /usr/bin/python3 /home/jay/StockTicker/main.py
#!/bin/bash
sudo python3 main.py
[
{
"Symbol": "AAL"
},
{
"Symbol": "AAME"
},
{
"Symbol": "AAOI"
},
{
"Symbol": "AAON"
},
{
"Symbol": "AAPL"
},
{
"Symbol": "AAWW"
},
{
"Symbol": "AAXJ"
},
{
"Symbol": "ABCB"
},
{
"Symbol": "ABMD"
},
{
"Symbol": "ACET"
},
{
"Symbol": "ACFN"
},
{
"Symbol": "ACGL"
},
{
"Symbol": "ACHC"
},
{
"Symbol": "ACIW"
},
{
"Symbol": "ACLS"
},
{
"Symbol": "ACNB"
},
{
"Symbol": "ACOR"
},
{
"Symbol": "ACRX"
},
{
"Symbol": "ACST"
},
{
"Symbol": "ACTG"
},
{
"Symbol": "ACUR"
},
{
"Symbol": "ACWI"
},
{
"Symbol": "ACWX"
},
{
"Symbol": "ADBE"
},
{
"Symbol": "ADES"
},
{
"Symbol": "ADI"
},
{
"Symbol": "ADMA"
},
{
"Symbol": "ADMP"
},
{
"Symbol": "ADMS"
},
{
"Symbol": "ADP"
},
{
"Symbol": "ADRA"
},
{
"Symbol": "ADRE"
},
{
"Symbol": "ADSK"
},
{
"Symbol": "ADTN"
},
{
"Symbol": "ADUS"
},
{
"Symbol": "ADXS"
},
{
"Symbol": "AEHR"
},
{
"Symbol": "AEIS"
},
{
"Symbol": "AERI"
},
{
"Symbol": "AEY"
},
{
"Symbol": "AEZS"
},
{
"Symbol": "AFMD"
},
{
"Symbol": "AGEN"
},
{
"Symbol": "AGIO"
},
{
"Symbol": "AGNC"
},
{
"Symbol": "AGNCP"
},
{
"Symbol": "AGRX"
},
{
"Symbol": "AGTC"
},
{
"Symbol": "AGYS"
},
{
"Symbol": "AGZD"
},
{
"Symbol": "AHPI"
},
{
"Symbol": "AIMC"
},
{
"Symbol": "AINV"
},
{
"Symbol": "AIQ"
},
{
"Symbol": "AIRR"
},
{
"Symbol": "AIRT"
},
{
"Symbol": "AKAM"
},
{
"Symbol": "AKBA"
},
{
"Symbol": "ALCO"
},
{
"Symbol": "ALDX"
},
{
"Symbol": "ALGN"
},
{
"Symbol": "ALGT"
},
{
"Symbol": "ALIM"
},
{
"Symbol": "ALKS"
},
{
"Symbol": "ALLT"
},
{
"Symbol": "ALNY"
},
{
"Symbol": "ALOT"
},
{
"Symbol": "ALTR"
},
{
"Symbol": "AMAT"
},
{
"Symbol": "AMBA"
},
{
"Symbol": "AMBC"
},
{
"Symbol": "AMCF"
},
{
"Symbol": "AMCX"
},
{
"Symbol": "AMD"
},
{
"Symbol": "AMED"
},
{
"Symbol": "AMGN"
},
{
"Symbol": "AMKR"
},
{
"Symbol": "AMNB"
},
{
"Symbol": "AMOT"
},
{
"Symbol": "AMOV"
},
{
"Symbol": "AMPH"
},
{
"Symbol": "AMRK"
},
{
"Symbol": "AMRN"
},
{
"Symbol": "AMRS"
},
{
"Symbol": "AMSC"
},
{
"Symbol": "AMSWA"
},
{
"Symbol": "AMTX"
},
{
"Symbol": "AMWD"
},
{
"Symbol": "ANAC"
},
{
"Symbol": "ANAT"
},
{
"Symbol": "ANDE"
},
{
"Symbol": "ANGI"
},
{
"Symbol": "ANGO"
},
{
"Symbol": "ANIK"
},
{
"Symbol": "ANIP"
},
{
"Symbol": "ANSS"
},
{
"Symbol": "ANTH"
},
{
"Symbol": "ANY"
},
{
"Symbol": "AOSL"
},
{
"Symbol": "APDN"
},
{
"Symbol": "APEI"
},
{
"Symbol": "APOG"
},
{
"Symbol": "APTO"
},
{
"Symbol": "APWC"
},
{
"Symbol": "ARAY"
},
{
"Symbol": "ARCB"
},
{
"Symbol": "ARCC"
},
{
"Symbol": "ARCW"
},
{
"Symbol": "ARDX"
},
{
"Symbol": "ARKR"
},
{
"Symbol": "ARLP"
},
{
"Symbol": "ARNA"
},
{
"Symbol": "AROW"
},
{
"Symbol": "ARRY"
},
{
"Symbol": "ARTNA"
},
{
"Symbol": "ARTW"
},
{
"Symbol": "ARWR"
},
{
"Symbol": "ASMB"
},
{
"Symbol": "ASML"
},
{
"Symbol": "ASPS"
},
{
"Symbol": "ASRV"
},
{
"Symbol": "ASRVP"
},
{
"Symbol": "ASTC"
},
{
"Symbol": "ASTE"
},
{
"Symbol": "ASTI"
},
{
"Symbol": "ASUR"
},
{
"Symbol": "ASYS"
},
{
"Symbol": "ATAI"
},
{
"Symbol": "ATEC"
},
{
"Symbol": "ATHN"
},
{
"Symbol": "ATHX"
},
{
"Symbol": "ATLC"
},
{
"Symbol": "ATLO"
},
{
"Symbol": "ATNI"
},
{
"Symbol": "ATOS"
},
{
"Symbol": "ATRA"
},
{
"Symbol": "ATRC"
},
{
"Symbol": "ATRI"
},
{
"Symbol": "ATRO"
},
{
"Symbol": "ATRS"
},
{
"Symbol": "ATSG"
},
{
"Symbol": "ATVI"
},
{
"Symbol": "AUBN"
},
{
"Symbol": "AUDC"
},
{
"Symbol": "AUPH"
},
{
"Symbol": "AVAV"
},
{
"Symbol": "AVEO"
},
{
"Symbol": "AVGO"
},
{
"Symbol": "AVID"
},
{
"Symbol": "AVNW"
},
{
"Symbol": "AWAY"
},
{
"Symbol": "AWRE"
},
{
"Symbol": "AXAS"
},
{
"Symbol": "AXDX"
},
{
"Symbol": "AXGN"
},
{
"Symbol": "AXTI"
},
{
"Symbol": "AZPN"
},
{
"Symbol": "BANF"
},
{
"Symbol": "BANFP"
},
{
"Symbol": "BANR"
},
{
"Symbol": "BANX"
},
{
"Symbol": "BBBY"
},
{
"Symbol": "BBC"
},
{
"Symbol": "BBGI"
},
{
"Symbol": "BBP"
},
{
"Symbol": "BBSI"
},
{
"Symbol": "BCBP"
},
{
"Symbol": "BCLI"
},
{
"Symbol": "BCOR"
},
{
"Symbol": "BCOV"
},
{
"Symbol": "BCPC"
},
{
"Symbol": "BCRX"
},
{
"Symbol": "BDSI"
},
{
"Symbol": "BEBE"
},
{
"Symbol": "BECN"
},
{
"Symbol": "BELFA"
},
{
"Symbol": "BELFB"
},
{
"Symbol": "BFIN"
},
{
"Symbol": "BGCP"
},
{
"Symbol": "BGFV"
},
{
"Symbol": "BGMD"
},
{
"Symbol": "BIB"
},
{
"Symbol": "BICK"
},
{
"Symbol": "BIDU"
},
{
"Symbol": "BIIB"
},
{
"Symbol": "BIOC"
},
{
"Symbol": "BIOL"
},
{
"Symbol": "BIS"
},
{
"Symbol": "BJRI"
},
{
"Symbol": "BKCC"
},
{
"Symbol": "BKEP"
},
{
"Symbol": "BKEPP"
},
{
"Symbol": "BKSC"
},
{
"Symbol": "BLCM"
},
{
"Symbol": "BLDP"
},
{
"Symbol": "BLDR"
},
{
"Symbol": "BLFS"
},
{
"Symbol": "BLIN"
},
{
"Symbol": "BLKB"
},
{
"Symbol": "BLMN"
},
{
"Symbol": "BLRX"
},
{
"Symbol": "BLUE"
},
{
"Symbol": "BMRC"
},
{
"Symbol": "BMRN"
},
{
"Symbol": "BMTC"
},
{
"Symbol": "BNDX"
},
{
"Symbol": "BNFT"
},
{
"Symbol": "BNSO"
},
{
"Symbol": "BOCH"
},
{
"Symbol": "BOKF"
},
{
"Symbol": "BOOM"
},
{
"Symbol": "BOSC"
},
{
"Symbol": "BOTJ"
},
{
"Symbol": "BPOP"
},
{
"Symbol": "BPOPM"
},
{
"Symbol": "BPOPN"
},
{
"Symbol": "BPTH"
},
{
"Symbol": "BRID"
},
{
"Symbol": "BRKL"
},
{
"Symbol": "BRKR"
},
{
"Symbol": "BRKS"
},
{
"Symbol": "BRLI"
},
{
"Symbol": "BSET"
},
{
"Symbol": "BSPM"
},
{
"Symbol": "BSQR"
},
{
"Symbol": "BSRR"
},
{
"Symbol": "BUR"
},
{
"Symbol": "BUSE"
},
{
"Symbol": "BV"
},
{
"Symbol": "BWEN"
},
{
"Symbol": "BWFG"
},
{
"Symbol": "BYFC"
},
{
"Symbol": "CAC"
},
{
"Symbol": "CACC"
},
{
"Symbol": "CACH"
},
{
"Symbol": "CALA"
},
{
"Symbol": "CALI"
},
{
"Symbol": "CALM"
},
{
"Symbol": "CAMP"
},
{
"Symbol": "CAR"
},
{
"Symbol": "CARZ"
},
{
"Symbol": "CASI"
},
{
"Symbol": "CASS"
},
{
"Symbol": "CBAN"
},
{
"Symbol": "CBAY"
},
{
"Symbol": "CBLI"
},
{
"Symbol": "CBNK"
},
{
"Symbol": "CBOE"
},
{
"Symbol": "CBRL"
},
{
"Symbol": "CBSH"
},
{
"Symbol": "CCBG"
},
{
"Symbol": "CCLP"
},
{
"Symbol": "CCMP"
},
{
"Symbol": "CCNE"
},
{
"Symbol": "CCOI"
},
{
"Symbol": "CCRN"
},
{
"Symbol": "CCXI"
},
{
"Symbol": "CDC"
},
{
"Symbol": "CDK"
},
{
"Symbol": "CDNA"
},
{
"Symbol": "CDNS"
},
{
"Symbol": "CDTI"
},
{
"Symbol": "CDW"
},
{
"Symbol": "CDXS"
},
{
"Symbol": "CDZI"
},
{
"Symbol": "CEMI"
},
{
"Symbol": "CENT"
},
{
"Symbol": "CENX"
},
{
"Symbol": "CERE"
},
{
"Symbol": "CERN"
},
{
"Symbol": "CEVA"
},
{
"Symbol": "CFA"
},
{
"Symbol": "CFBK"
},
{
"Symbol": "CFFI"
},
{
"Symbol": "CFFN"
},
{
"Symbol": "CFNB"
},
{
"Symbol": "CFO"
},
{
"Symbol": "CFRX"
},
{
"Symbol": "CG"
},
{
"Symbol": "CGEN"
},
{
"Symbol": "CGNX"
},
{
"Symbol": "CGO"
},
{
"Symbol": "CHCI"
},
{
"Symbol": "CHCO"
},
{
"Symbol": "CHDN"
},
{
"Symbol": "CHEF"
},
{
"Symbol": "CHI"
},
{
"Symbol": "CHKP"
},
{
"Symbol": "CHMG"
},
{
"Symbol": "CHNR"
},
{
"Symbol": "CHRS"
},
{
"Symbol": "CHRW"
},
{
"Symbol": "CHSCM"
},
{
"Symbol": "CHSCN"
},
{
"Symbol": "CHSCO"
},
{
"Symbol": "CHSCP"
},
{
"Symbol": "CHTR"
},
{
"Symbol": "CHUY"
},
{
"Symbol": "CHW"
},
{
"Symbol": "CHY"
},
{
"Symbol": "CIDM"
},
{
"Symbol": "CINF"
},
{
"Symbol": "CIZ"
},
{
"Symbol": "CJJD"
},
{
"Symbol": "CLDX"
},
{
"Symbol": "CLFD"
},
{
"Symbol": "CLIR"
},
{
"Symbol": "CLMT"
},
{
"Symbol": "CLNE"
},
{
"Symbol": "CLRB"
},
{
"Symbol": "CLRO"
},
{
"Symbol": "CLSN"
},
{
"Symbol": "CLVS"
},
{
"Symbol": "CLWT"
},
{
"Symbol": "CMCO"
},
{
"Symbol": "CMCSA"
},
{
"Symbol": "CMCT"
},
{
"Symbol": "CME"
},
{
"Symbol": "CMLS"
},
{
"Symbol": "CMPR"
},
{
"Symbol": "CMRX"
},
{
"Symbol": "CMTL"
},
{
"Symbol": "CNBKA"
},
{
"Symbol": "CNCE"
},
{
"Symbol": "CNET"
},
{
"Symbol": "CNMD"
},
{
"Symbol": "CNOB"
},
{
"Symbol": "CNSL"
},
{
"Symbol": "CNTY"
},
{
"Symbol": "COHR"
},
{
"Symbol": "COHU"
},
{
"Symbol": "COKE"
},
{
"Symbol": "COLB"
},
{
"Symbol": "COLM"
},
{
"Symbol": "COMM"
},
{
"Symbol": "COMT"
},
{
"Symbol": "CONE"
},
{
"Symbol": "CONN"
},
{
"Symbol": "COOL"
},
{
"Symbol": "CORE"
},
{
"Symbol": "CORT"
},
{
"Symbol": "COST"
},
{
"Symbol": "COWN"
},
{
"Symbol": "COWNL"
},
{
"Symbol": "CPHC"
},
{
"Symbol": "CPIX"
},
{
"Symbol": "CPLP"
},
{
"Symbol": "CPRT"
},
{
"Symbol": "CPRX"
},
{
"Symbol": "CPSI"
},
{
"Symbol": "CPSS"
},
{
"Symbol": "CRAI"
},
{
"Symbol": "CREE"
},
{
"Symbol": "CREG"
},
{
"Symbol": "CRESW"
},
{
"Symbol": "CRESY"
},
{
"Symbol": "CRIS"
},
{
"Symbol": "CRMT"
},
{
"Symbol": "CRNT"
},
{
"Symbol": "CROX"
},
{
"Symbol": "CRTO"
},
{
"Symbol": "CRUS"
},
{
"Symbol": "CRVL"
},
{
"Symbol": "CRWS"
},
{
"Symbol": "CSCO"
},
{
"Symbol": "CSF"
},
{
"Symbol": "CSGP"
},
{
"Symbol": "CSGS"
},
{
"Symbol": "CSII"
},
{
"Symbol": "CSIQ"
},
{
"Symbol": "CSOD"
},
{
"Symbol": "CSPI"
},
{
"Symbol": "CSQ"
},
{
"Symbol": "CSTE"
},
{
"Symbol": "CSWC"
},
{
"Symbol": "CTAS"
},
{
"Symbol": "CTBI"
},
{
"Symbol": "CTG"
},
{
"Symbol": "CTHR"
},
{
"Symbol": "CTIB"
},
{
"Symbol": "CTIC"
},
{
"Symbol": "CTRE"
},
{
"Symbol": "CTRN"
},
{
"Symbol": "CTSH"
},
{
"Symbol": "CTSO"
},
{
"Symbol": "CTXS"
},
{
"Symbol": "CUBA"
},
{
"Symbol": "CVBF"
},
{
"Symbol": "CVCO"
},
{
"Symbol": "CVGI"
},
{
"Symbol": "CVGW"
},
{
"Symbol": "CVLT"
},
{
"Symbol": "CVLY"
},
{
"Symbol": "CVV"
},
{
"Symbol": "CWBC"
},
{
"Symbol": "CWCO"
},
{
"Symbol": "CWST"
},
{
"Symbol": "CXDC"
},
{
"Symbol": "CYAN"
},
{
"Symbol": "CYBR"
},
{
"Symbol": "CYCC"
},
{
"Symbol": "CYTK"
},
{
"Symbol": "CZNC"
},
{
"Symbol": "CZR"
},
{
"Symbol": "CZWI"
},
{
"Symbol": "DAIO"
},
{
"Symbol": "DAKT"
},
{
"Symbol": "DAX"
},
{
"Symbol": "DBVT"
},
{
"Symbol": "DCOM"
},
{
"Symbol": "DCTH"
},
{
"Symbol": "DENN"
},
{
"Symbol": "DGICA"
},
{
"Symbol": "DGICB"
},
{
"Symbol": "DGII"
},
{
"Symbol": "DGLY"
},
{
"Symbol": "DGRE"
},
{
"Symbol": "DGRS"
},
{
"Symbol": "DGRW"
},
{
"Symbol": "DHIL"
},
{
"Symbol": "DIOD"
},
{
"Symbol": "DISCB"
},
{
"Symbol": "DISCK"
},
{
"Symbol": "DISH"
},
{
"Symbol": "DJCO"
},
{
"Symbol": "DLHC"
},
{
"Symbol": "DLTR"
},
{
"Symbol": "DMLP"
},
{
"Symbol": "DMRC"
},
{
"Symbol": "DORM"
},
{
"Symbol": "DOX"
},
{
"Symbol": "DRIV"
},
{
"Symbol": "DRNA"
},
{
"Symbol": "DRRX"
},
{
"Symbol": "DSGX"
},
{
"Symbol": "DSPG"
},
{
"Symbol": "DSWL"
},
{
"Symbol": "DVAX"
},
{
"Symbol": "DVCR"
},
{
"Symbol": "DWAT"
},
{
"Symbol": "DWSN"
},
{
"Symbol": "DXCM"
},
{
"Symbol": "DXGE"
},
{
"Symbol": "DXJS"
},
{
"Symbol": "DXLG"
},
{
"Symbol": "DXPE"
},
{
"Symbol": "DXYN"
},
{
"Symbol": "DYNT"
},
{
"Symbol": "DYSL"
},
{
"Symbol": "EA"
},
{
"Symbol": "EAC"
},
{
"Symbol": "EBAY"
},
{
"Symbol": "EBIX"
},
{
"Symbol": "EBMT"
},
{
"Symbol": "EBSB"
},
{
"Symbol": "EBTC"
},
{
"Symbol": "ECHO"
},
{
"Symbol": "ECOL"
},
{
"Symbol": "ECPG"
},
{
"Symbol": "ECTE"
},
{
"Symbol": "EDAP"
},
{
"Symbol": "EDUC"
},
{
"Symbol": "EEFT"
},
{
"Symbol": "EEMA"
},
{
"Symbol": "EFOI"
},
{
"Symbol": "EGAN"
},
{
"Symbol": "EGBN"
},
{
"Symbol": "EGHT"
},
{
"Symbol": "EGLE"
},
{
"Symbol": "EGRX"
},
{
"Symbol": "EHTH"
},
{
"Symbol": "ELSE"
},
{
"Symbol": "ELTK"
},
{
"Symbol": "EMCB"
},
{
"Symbol": "EMCF"
},
{
"Symbol": "EMIF"
},
{
"Symbol": "EMITF"
},
{
"Symbol": "EMKR"
},
{
"Symbol": "EML"
},
{
"Symbol": "EMMS"
},
{
"Symbol": "ENDP"
},
{
"Symbol": "ENG"
},
{
"Symbol": "ENPH"
},
{
"Symbol": "ENSG"
},
{
"Symbol": "ENTA"
},
{
"Symbol": "ENTR"
},
{
"Symbol": "ENVI"
},
{
"Symbol": "EPAY"
},
{
"Symbol": "EPZM"
},
{
"Symbol": "EQIX"
},
{
"Symbol": "ERIC"
},
{
"Symbol": "ERII"
},
{
"Symbol": "ESBK"
},
{
"Symbol": "ESCR"
},
{
"Symbol": "ESEA"
},
{
"Symbol": "ESGR"
},
{
"Symbol": "ESLT"
},
{
"Symbol": "ESMC"
},
{
"Symbol": "ESPR"
},
{
"Symbol": "ESSA"
},
{
"Symbol": "ESXB"
},
{
"Symbol": "EUFN"
},
{
"Symbol": "EVK"
},
{
"Symbol": "EVLV"
},
{
"Symbol": "EVOK"
},
{
"Symbol": "EVOL"
},
{
"Symbol": "EWBC"
},
{
"Symbol": "EXEL"
},
{
"Symbol": "EXFO"
},
{
"Symbol": "EXLS"
},
{
"Symbol": "EXPD"
},
{
"Symbol": "EXPE"
},
{
"Symbol": "EXPO"
},
{
"Symbol": "EXTR"
},
{
"Symbol": "EYES"
},
{
"Symbol": "EZPW"
},
{
"Symbol": "FALC"
},
{
"Symbol": "FANG"
},
{
"Symbol": "FARM"
},
{
"Symbol": "FARO"
},
{
"Symbol": "FAST"
},
{
"Symbol": "FATE"
},
{
"Symbol": "FB"
},
{
"Symbol": "FBIZ"
},
{
"Symbol": "FBMS"
},
{
"Symbol": "FBNC"
},
{
"Symbol": "FCAP"
},
{
"Symbol": "FCBC"
},
{
"Symbol": "FCCO"
},
{
"Symbol": "FCEL"
},
{
"Symbol": "FCFS"
},
{
"Symbol": "FDIV"
},
{
"Symbol": "FDUS"
},
{
"Symbol": "FEIM"
},
{
"Symbol": "FELE"
},
{
"Symbol": "FEMB"
},
{
"Symbol": "FEUZ"
},
{
"Symbol": "FEYE"
},
{
"Symbol": "FFBC"
},
{
"Symbol": "FFHL"
},
{
"Symbol": "FFIC"
},
{
"Symbol": "FFIN"
},
{
"Symbol": "FFIV"
},
{
"Symbol": "FFNW"
},
{
"Symbol": "FGEN"
},
{
"Symbol": "FIBK"
},
{
"Symbol": "FISI"
},
{
"Symbol": "FISV"
},
{
"Symbol": "FITB"
},
{
"Symbol": "FITBI"
},
{
"Symbol": "FIVE"
},
{
"Symbol": "FIVN"
},
{
"Symbol": "FIZZ"
},
{
"Symbol": "FLDM"
},
{
"Symbol": "FLEX"
},
{
"Symbol": "FLIC"
},
{
"Symbol": "FLL"
},
{
"Symbol": "FLWS"
},
{
"Symbol": "FLXN"
},
{
"Symbol": "FLXS"
},
{
"Symbol": "FMB"
},
{
"Symbol": "FMBH"
},
{
"Symbol": "FMBI"
},
{
"Symbol": "FMNB"
},
{
"Symbol": "FNHC"
},
{
"Symbol": "FNLC"
},
{
"Symbol": "FNRG"
},
{
"Symbol": "FOLD"
},
{
"Symbol": "FONR"
},
{
"Symbol": "FORD"
},
{
"Symbol": "FORM"
},
{
"Symbol": "FORR"
},
{
"Symbol": "FORTY"
},
{
"Symbol": "FOSL"
},
{
"Symbol": "FOX"
},
{
"Symbol": "FOXA"
},
{
"Symbol": "FOXF"
},
{
"Symbol": "FPXI"
},
{
"Symbol": "FRBA"
},
{
"Symbol": "FRBK"
},
{
"Symbol": "FREE"
},
{
"Symbol": "FRGI"
},
{
"Symbol": "FRME"
},
{
"Symbol": "FRPH"
},
{
"Symbol": "FRPT"
},
{
"Symbol": "FSBW"
},
{
"Symbol": "FSFG"
},
{
"Symbol": "FSLR"
},
{
"Symbol": "FSTR"
},
{
"Symbol": "FTCS"
},
{
"Symbol": "FTEK"
},
{
"Symbol": "FTGC"
},
{
"Symbol": "FTHI"
},
{
"Symbol": "FTLB"
},
{
"Symbol": "FTNT"
},
{
"Symbol": "FTSL"
},
{
"Symbol": "FTSM"
},
{
"Symbol": "FULT"
},
{
"Symbol": "FUNC"
},
{
"Symbol": "FUND"
},
{
"Symbol": "FV"
},
{
"Symbol": "FWP"
},
{
"Symbol": "FWRD"
},
{
"Symbol": "GABC"
},
{
"Symbol": "GAIA"
},
{
"Symbol": "GALT"
},
{
"Symbol": "GAME"
},
{
"Symbol": "GASS"
},
{
"Symbol": "GBCI"
},
{
"Symbol": "GBDC"
},
{
"Symbol": "GBIM"
},
{
"Symbol": "GBLI"
},
{
"Symbol": "GCBC"
},
{
"Symbol": "GENC"
},
{
"Symbol": "GENE"
},
{
"Symbol": "GEOS"
},
{
"Symbol": "GERN"
},
{
"Symbol": "GEVO"
},
{
"Symbol": "GFED"
},
{
"Symbol": "GGAL"
},
{
"Symbol": "GIFI"
},
{
"Symbol": "GIGA"
},
{
"Symbol": "GIGM"
},
{
"Symbol": "GIII"
},
{
"Symbol": "GILD"
},
{
"Symbol": "GILT"
},
{
"Symbol": "GK"
},
{
"Symbol": "GLAD"
},
{
"Symbol": "GLBS"
},
{
"Symbol": "GLBZ"
},
{
"Symbol": "GLDD"
},
{
"Symbol": "GLDI"
},
{
"Symbol": "GLMD"
},
{
"Symbol": "GLNG"
},
{
"Symbol": "GLPI"
},
{
"Symbol": "GLRE"
},
{
"Symbol": "GLRI"
},
{
"Symbol": "GLYC"
},
{
"Symbol": "GNMA"
},
{
"Symbol": "GNTX"
},
{
"Symbol": "GOGO"
},
{
"Symbol": "GOLD"
},
{
"Symbol": "GOOD"
},
{
"Symbol": "GOODN"
},
{
"Symbol": "GOODO"
},
{
"Symbol": "GOOG"
},
{
"Symbol": "GOOGL"
},
{
"Symbol": "GPOR"
},
{
"Symbol": "GPRE"
},
{
"Symbol": "GPRO"
},
{
"Symbol": "GRBK"
},
{
"Symbol": "GRFS"
},
{
"Symbol": "GRID"
},
{
"Symbol": "GRMN"
},
{
"Symbol": "GROW"
},
{
"Symbol": "GRVY"
},
{
"Symbol": "GSBC"
},
{
"Symbol": "GSIG"
},
{
"Symbol": "GSIT"
},
{
"Symbol": "GSM"
},
{
"Symbol": "GT"
},
{
"Symbol": "GTIM"
},
{
"Symbol": "GTLS"
},
{
"Symbol": "GULTU"
},
{
"Symbol": "GURE"
},
{
"Symbol": "GWGH"
},
{
"Symbol": "GYRO"
},
{
"Symbol": "HA"
},
{
"Symbol": "HAFC"
},
{
"Symbol": "HAIN"
},
{
"Symbol": "HALL"
},
{
"Symbol": "HALO"
},
{
"Symbol": "HART"
},
{
"Symbol": "HAS"
},
{
"Symbol": "HAYN"
},
{
"Symbol": "HBAN"
},
{
"Symbol": "HBANP"
},
{
"Symbol": "HBCP"
},
{
"Symbol": "HBIO"
},
{
"Symbol": "HBMD"
},
{
"Symbol": "HBNC"
},
{
"Symbol": "HBP"
},
{
"Symbol": "HCCI"
},
{
"Symbol": "HCKT"
},
{
"Symbol": "HCSG"
},
{
"Symbol": "HEAR"
},
{
"Symbol": "HEES"
},
{
"Symbol": "HELE"
},
{
"Symbol": "HERO"
},
{
"Symbol": "HFBL"
},
{
"Symbol": "HFWA"
},
{
"Symbol": "HGSH"
},
{
"Symbol": "HIBB"
},
{
"Symbol": "HIFS"
},
{
"Symbol": "HIHO"
},
{
"Symbol": "HIMX"
},
{
"Symbol": "HLIT"
},
{
"Symbol": "HMHC"
},
{
"Symbol": "HMNF"
},
{
"Symbol": "HMNY"
},
{
"Symbol": "HMST"
},
{
"Symbol": "HMTV"
},
{
"Symbol": "HNNA"
},
{
"Symbol": "HNRG"
},
{
"Symbol": "HOFT"
},
{
"Symbol": "HOLI"
},
{
"Symbol": "HOLX"
},
{
"Symbol": "HOMB"
},
{
"Symbol": "HOVNP"
},
{
"Symbol": "HQY"
},
{
"Symbol": "HRTX"
},
{
"Symbol": "HSIC"
},
{
"Symbol": "HSII"
},
{
"Symbol": "HSKA"
},
{
"Symbol": "HSON"
},
{
"Symbol": "HSTM"
},
{
"Symbol": "HTBI"
},
{
"Symbol": "HTBK"
},
{
"Symbol": "HTBX"
},
{
"Symbol": "HTHT"
},
{
"Symbol": "HTLD"
},
{
"Symbol": "HUBG"
},
{
"Symbol": "HURC"
},
{
"Symbol": "HURN"
},
{
"Symbol": "HWBK"
},
{
"Symbol": "HWKN"
},
{
"Symbol": "HYLS"
},
{
"Symbol": "HYZD"
},
{
"Symbol": "IART"
},
{
"Symbol": "IBB"
},
{
"Symbol": "IBCP"
},
{
"Symbol": "IBKR"
},
{
"Symbol": "IBOC"
},
{
"Symbol": "IBTX"
},
{
"Symbol": "ICCC"
},
{
"Symbol": "ICFI"
},
{
"Symbol": "ICLD"
},
{
"Symbol": "ICLN"
},
{
"Symbol": "ICPT"
},
{
"Symbol": "IDCC"
},
{
"Symbol": "IDRA"
},
{
"Symbol": "IDXX"
},
{
"Symbol": "IEP"
},
{
"Symbol": "IESC"
},
{
"Symbol": "IEUS"
},
{
"Symbol": "IFGL"
},
{
"Symbol": "IFV"
},
{
"Symbol": "IGLD"
},
{
"Symbol": "IGOV"
},
{
"Symbol": "III"
},
{
"Symbol": "IIIN"
},
{
"Symbol": "IIN"
},
{
"Symbol": "IIVI"
},
{
"Symbol": "IKNX"
},
{
"Symbol": "ILMN"
},
{
"Symbol": "IMGN"
},
{
"Symbol": "IMKTA"
},
{
"Symbol": "IMMR"
},
{
"Symbol": "IMOS"
},
{
"Symbol": "INBK"
},
{
"Symbol": "INCY"
},
{
"Symbol": "INDB"
},
{
"Symbol": "INDY"
},
{
"Symbol": "INFI"
},
{
"Symbol": "INFN"
},
{
"Symbol": "INGN"
},
{
"Symbol": "INO"
},
{
"Symbol": "INOD"
},
{
"Symbol": "INSM"
},
{
"Symbol": "INTC"
},
{
"Symbol": "INTG"
},
{
"Symbol": "INTU"
},
{
"Symbol": "INVE"
},
{
"Symbol": "INVT"
},
{
"Symbol": "IOSP"
},
{
"Symbol": "IPAR"
},
{
"Symbol": "IPDN"
},
{
"Symbol": "IPGP"
},
{
"Symbol": "IPKW"
},
{
"Symbol": "IPWR"
},
{
"Symbol": "IRBT"
},
{
"Symbol": "IRDM"
},
{
"Symbol": "IRIX"
},
{
"Symbol": "IRMD"
},
{
"Symbol": "IROQ"
},
{
"Symbol": "IRWD"
},
{
"Symbol": "ISBC"
},
{
"Symbol": "ISHG"
},
{
"Symbol": "ISIG"
},
{
"Symbol": "ISLE"
},
{
"Symbol": "ISRG"
},
{
"Symbol": "ISSC"
},
{
"Symbol": "ISTR"
},
{
"Symbol": "ITCI"
},
{
"Symbol": "ITIC"
},
{
"Symbol": "ITRI"
},
{
"Symbol": "ITRN"
},
{
"Symbol": "IVAN"
},
{
"Symbol": "JACK"
},
{
"Symbol": "JAKK"
},
{
"Symbol": "JAZZ"
},
{
"Symbol": "JBHT"
},
{
"Symbol": "JBLU"
},
{
"Symbol": "JBSS"
},
{
"Symbol": "JCOM"
},
{
"Symbol": "JCS"
},
{
"Symbol": "JCTCF"
},
{
"Symbol": "JD"
},
{
"Symbol": "JJSF"
},
{
"Symbol": "JKHY"
},
{
"Symbol": "JOBS"
},
{
"Symbol": "JOUT"
},
{
"Symbol": "JRJC"
},
{
"Symbol": "JRVR"
},
{
"Symbol": "JSM"
},
{
"Symbol": "JVA"
},
{
"Symbol": "JYNT"
},
{
"Symbol": "KALU"
},
{
"Symbol": "KBAL"
},
{
"Symbol": "KBSF"
},
{
"Symbol": "KCLI"
},
{
"Symbol": "KE"
},
{
"Symbol": "KELYA"
},
{
"Symbol": "KELYB"
},
{
"Symbol": "KEQU"
},
{
"Symbol": "KFFB"
},
{
"Symbol": "KFRC"
},
{
"Symbol": "KGJI"
},
{
"Symbol": "KIN"
},
{
"Symbol": "KINS"
},
{
"Symbol": "KIRK"
},
{
"Symbol": "KLAC"
},
{
"Symbol": "KLIC"
},
{
"Symbol": "KMDA"
},
{
"Symbol": "KNDI"
},
{
"Symbol": "KONA"
},
{
"Symbol": "KOPN"
},
{
"Symbol": "KOSS"
},
{
"Symbol": "KPTI"
},
{
"Symbol": "KRNY"
},
{
"Symbol": "KTCC"
},
{
"Symbol": "KTEC"
},
{
"Symbol": "KTOS"
},
{
"Symbol": "KVHI"
},
{
"Symbol": "KWEB"
},
{
"Symbol": "LAKE"
},
{
"Symbol": "LAMR"
},
{
"Symbol": "LANC"
},
{
"Symbol": "LAND"
},
{
"Symbol": "LARK"
},
{
"Symbol": "LAWS"
},
{
"Symbol": "LBAI"
},
{
"Symbol": "LBRDA"
},
{
"Symbol": "LBRDK"
},
{
"Symbol": "LBTYA"
},
{
"Symbol": "LBTYB"
},
{
"Symbol": "LBTYK"
},
{
"Symbol": "LCNB"
},
{
"Symbol": "LE"
},
{
"Symbol": "LECO"
},
{
"Symbol": "LFUS"
},
{
"Symbol": "LFVN"
},
{
"Symbol": "LGIH"
},
{
"Symbol": "LGND"
},
{
"Symbol": "LHCG"
},
{
"Symbol": "LINC"
},
{
"Symbol": "LIVE"
},
{
"Symbol": "LJPC"
},
{
"Symbol": "LKFN"
},
{
"Symbol": "LKQ"
},
{
"Symbol": "LLNW"
},
{
"Symbol": "LMAT"
},
{
"Symbol": "LMBS"
},
{
"Symbol": "LMNR"
},
{
"Symbol": "LMRK"
},
{
"Symbol": "LNDC"
},
{
"Symbol": "LOAN"
},
{
"Symbol": "LOCO"
},
{
"Symbol": "LOGI"
},
{
"Symbol": "LOPE"
},
{
"Symbol": "LORL"
},
{
"Symbol": "LPCN"
},
{
"Symbol": "LPLA"
},
{
"Symbol": "LPSN"
},
{
"Symbol": "LPTH"
},
{
"Symbol": "LQDT"
},
{
"Symbol": "LRCX"
},
{
"Symbol": "LSBK"
},
{
"Symbol": "LSCC"
},
{
"Symbol": "LSTR"
},
{
"Symbol": "LTBR"
},
{
"Symbol": "LTRE"
},
{
"Symbol": "LTRPB"
},
{
"Symbol": "LTRX"
},
{
"Symbol": "LULU"
},
{
"Symbol": "LUNA"
},
{
"Symbol": "LWAY"
},
{
"Symbol": "LXRX"
},
{
"Symbol": "LYTS"
},
{
"Symbol": "MACK"
},
{
"Symbol": "MAG"
},
{
"Symbol": "MAGS"
},
{
"Symbol": "MANH"
},
{
"Symbol": "MANT"
},
{
"Symbol": "MAR"
},
{
"Symbol": "MARA"
},
{
"Symbol": "MARK"
},
{
"Symbol": "MASI"
},
{
"Symbol": "MAT"
},
{
"Symbol": "MATW"
},
{
"Symbol": "MAYS"
},
{
"Symbol": "MBCN"
},
{
"Symbol": "MBII"
},
{
"Symbol": "MBSD"
},
{
"Symbol": "MBUU"
},
{
"Symbol": "MBWM"
},
{
"Symbol": "MCBC"
},
{
"Symbol": "MCBK"
},
{
"Symbol": "MCHP"
},
{
"Symbol": "MCHX"
},
{
"Symbol": "MCRI"
},
{
"Symbol": "MDIV"
},
{
"Symbol": "MDLZ"
},
{
"Symbol": "MDRX"
},
{
"Symbol": "MDWD"
},
{
"Symbol": "MDXG"
},
{
"Symbol": "MEIL"
},
{
"Symbol": "MEIP"
},
{
"Symbol": "MELI"
},
{
"Symbol": "MEOH"
},
{
"Symbol": "MERC"
},
{
"Symbol": "MFNC"
},
{
"Symbol": "MGEE"
},
{
"Symbol": "MGI"
},
{
"Symbol": "MGIC"
},
{
"Symbol": "MGLN"
},
{
"Symbol": "MGNX"
},
{
"Symbol": "MGPI"
},
{
"Symbol": "MGRC"
},
{
"Symbol": "MGYR"
},
{
"Symbol": "MHLD"
},
{
"Symbol": "MICT"
},
{
"Symbol": "MIDD"
},
{
"Symbol": "MIND"
},
{
"Symbol": "MITK"
},
{
"Symbol": "MKSI"
},
{
"Symbol": "MKTX"
},
{
"Symbol": "MLAB"
},
{
"Symbol": "MLHR"
},
{
"Symbol": "MLNK"
},
{
"Symbol": "MLVF"
},
{
"Symbol": "MMLP"
},
{
"Symbol": "MMSI"
},
{
"Symbol": "MMYT"
},
{
"Symbol": "MNDO"
},
{
"Symbol": "MNKD"
},
{
"Symbol": "MNOV"
},
{
"Symbol": "MNRO"
},
{
"Symbol": "MNST"
},
{
"Symbol": "MNTX"
},
{
"Symbol": "MOFG"
},
{
"Symbol": "MOMO"
},
{
"Symbol": "MORN"
},
{
"Symbol": "MOSY"
},
{
"Symbol": "MPAA"
},
{
"Symbol": "MPB"
},
{
"Symbol": "MPWR"
},
{
"Symbol": "MRCC"
},
{
"Symbol": "MRLN"
},
{
"Symbol": "MRNS"
},
{
"Symbol": "MRTN"
},
{
"Symbol": "MRTX"
},
{
"Symbol": "MRVL"
},
{
"Symbol": "MSEX"
},
{
"Symbol": "MSFT"
},
{
"Symbol": "MSON"
},
{
"Symbol": "MSTR"
},
{
"Symbol": "MTBC"
},
{
"Symbol": "MTEX"
},
{
"Symbol": "MTLS"
},
{
"Symbol": "MTRX"
},
{
"Symbol": "MTSI"
},
{
"Symbol": "MU"
},
{
"Symbol": "MVIS"
},
{
"Symbol": "MXIM"
},
{
"Symbol": "MYGN"
},
{
"Symbol": "MYRG"
},
{
"Symbol": "NAII"
},
{
"Symbol": "NATH"
},
{
"Symbol": "NATI"
},
{
"Symbol": "NATR"
},
{
"Symbol": "NAUH"
},
{
"Symbol": "NAVI"
},
{
"Symbol": "NBIX"
},
{
"Symbol": "NBN"
},
{
"Symbol": "NBTB"
},
{
"Symbol": "NCLH"
},
{
"Symbol": "NCMI"
},
{
"Symbol": "NCTY"
},
{
"Symbol": "NDAQ"
},
{
"Symbol": "NDLS"
},
{
"Symbol": "NDSN"
},
{
"Symbol": "NECB"
},
{
"Symbol": "NEO"
},
{
"Symbol": "NEOG"
},
{
"Symbol": "NEON"
},
{
"Symbol": "NEPT"
},
{
"Symbol": "NERV"
},
{
"Symbol": "NETE"
},
{
"Symbol": "NEWP"
},
{
"Symbol": "NEWT"
},
{
"Symbol": "NFBK"
},
{
"Symbol": "NFLX"
},
{
"Symbol": "NICE"
},
{
"Symbol": "NICK"
},
{
"Symbol": "NKSH"
},
{
"Symbol": "NKTR"
},
{
"Symbol": "NLST"
},
{
"Symbol": "NMIH"
},
{
"Symbol": "NNBR"
},
{
"Symbol": "NRIM"
},
{
"Symbol": "NSEC"
},
{
"Symbol": "NSIT"
},
{
"Symbol": "NSSC"
},
{
"Symbol": "NSTG"
},
{
"Symbol": "NSYS"
},
{
"Symbol": "NTAP"
},
{
"Symbol": "NTCT"
},
{
"Symbol": "NTES"
},
{
"Symbol": "NTIC"
},
{
"Symbol": "NTRS"
},
{
"Symbol": "NTWK"
},
{
"Symbol": "NUAN"
},
{
"Symbol": "NURO"
},
{
"Symbol": "NUVA"
},
{
"Symbol": "NVCN"
},
{
"Symbol": "NVDA"
},
{
"Symbol": "NVEC"
},
{
"Symbol": "NVEE"
},
{
"Symbol": "NVFY"
},
{
"Symbol": "NVMI"
},
{
"Symbol": "NWBI"
},
{
"Symbol": "NWBO"
},
{
"Symbol": "NWFL"
},
{
"Symbol": "NWLI"
},
{
"Symbol": "NWPX"
},
{
"Symbol": "NWS"
},
{
"Symbol": "NWSA"
},
{
"Symbol": "NXPI"
},
{
"Symbol": "NXST"
},
{
"Symbol": "NXTD"
},
{
"Symbol": "NYMT"
},
{
"Symbol": "NYMTP"
},
{
"Symbol": "NYMX"
},
{
"Symbol": "OBAS"
},
{
"Symbol": "OBCI"
},
{
"Symbol": "OCC"
},
{
"Symbol": "OCFC"
},
{
"Symbol": "OCUL"
},
{
"Symbol": "ODFL"
},
{
"Symbol": "ODP"
},
{
"Symbol": "OFED"
},
{
"Symbol": "OFIX"
},
{
"Symbol": "OFLX"
},
{
"Symbol": "OFS"
},
{
"Symbol": "OIIM"
},
{
"Symbol": "OLED"
},
{
"Symbol": "OMAB"
},
{
"Symbol": "OMCL"
},
{
"Symbol": "OMER"
},
{
"Symbol": "OMEX"
},
{
"Symbol": "ONB"
},
{
"Symbol": "ONEQ"
},
{
"Symbol": "ONTX"
},
{
"Symbol": "OPHC"
},
{
"Symbol": "OPOF"
},
{
"Symbol": "OPTT"
},
{
"Symbol": "ORBC"
},
{
"Symbol": "ORLY"
},
{
"Symbol": "ORMP"
},
{
"Symbol": "ORRF"
},
{
"Symbol": "OSBC"
},
{
"Symbol": "OSIS"
},
{
"Symbol": "OSN"
},
{
"Symbol": "OSTK"
},
{
"Symbol": "OSUR"
},
{
"Symbol": "OTEX"
},
{
"Symbol": "OTIC"
},
{
"Symbol": "OTTR"
},
{
"Symbol": "OVBC"
},
{
"Symbol": "OXBR"
},
{
"Symbol": "OXBRW"
},
{
"Symbol": "OXLC"
},
{
"Symbol": "OXLCP"
},
{
"Symbol": "PAAS"
},
{
"Symbol": "PACB"
},
{
"Symbol": "PACW"
},
{
"Symbol": "PAHC"
},
{
"Symbol": "PANL"
},
{
"Symbol": "PATK"
},
{
"Symbol": "PAYX"
},
{
"Symbol": "PBCT"
},
{
"Symbol": "PBHC"
},
{
"Symbol": "PBIP"
},
{
"Symbol": "PBPB"
},
{
"Symbol": "PCAR"
},
{
"Symbol": "PCH"
},
{
"Symbol": "PCOM"
},
{
"Symbol": "PCRX"
},
{
"Symbol": "PCTI"
},
{
"Symbol": "PCTY"
},
{
"Symbol": "PCYG"
},
{
"Symbol": "PDBC"
},
{
"Symbol": "PDCE"
},
{
"Symbol": "PDCO"
},
{
"Symbol": "PDEX"
},
{
"Symbol": "PDFS"
},
{
"Symbol": "PEBK"
},
{
"Symbol": "PEBO"
},
{
"Symbol": "PEGA"
},
{
"Symbol": "PENN"
},
{
"Symbol": "PERI"
},
{
"Symbol": "PESI"
},
{
"Symbol": "PETS"
},
{
"Symbol": "PFBC"
},
{
"Symbol": "PFBI"
},
{
"Symbol": "PFBX"
},
{
"Symbol": "PFIE"
},
{
"Symbol": "PFIN"
},
{
"Symbol": "PFIS"
},
{
"Symbol": "PFLT"
},
{
"Symbol": "PFMT"
},
{
"Symbol": "PFPT"
},
{
"Symbol": "PFSW"
},
{
"Symbol": "PGC"
},
{
"Symbol": "PGTI"
},
{
"Symbol": "PINC"
},
{
"Symbol": "PKBK"
},
{
"Symbol": "PKOH"
},
{
"Symbol": "PLAB"
},
{
"Symbol": "PLAY"
},
{
"Symbol": "PLBC"
},
{
"Symbol": "PLCE"
},
{
"Symbol": "PLPC"
},
{
"Symbol": "PLTM"
},
{
"Symbol": "PLUG"
},
{
"Symbol": "PLUS"
},
{
"Symbol": "PLXS"
},
{
"Symbol": "PMBC"
},
{
"Symbol": "PMD"
},
{
"Symbol": "PME"
},
{
"Symbol": "PNBK"
},
{
"Symbol": "PNFP"
},
{
"Symbol": "PNNT"
},
{
"Symbol": "PNQI"
},
{
"Symbol": "PNRG"
},
{
"Symbol": "PODD"
},
{
"Symbol": "POOL"
},
{
"Symbol": "POWI"
},
{
"Symbol": "POWL"
},
{
"Symbol": "PPBI"
},
{
"Symbol": "PPC"
},
{
"Symbol": "PPSI"
},
{
"Symbol": "PRAA"
},
{
"Symbol": "PRFT"
},
{
"Symbol": "PRFZ"
},
{
"Symbol": "PRGS"
},
{
"Symbol": "PRIM"
},
{
"Symbol": "PRKR"
},
{
"Symbol": "PRMW"
},
{
"Symbol": "PROV"
},
{
"Symbol": "PRQR"
},
{
"Symbol": "PRTA"
},
{
"Symbol": "PRTS"
},
{
"Symbol": "PSCC"
},
{
"Symbol": "PSCD"
},
{
"Symbol": "PSCE"
},
{
"Symbol": "PSCF"
},
{
"Symbol": "PSCH"
},
{
"Symbol": "PSCI"
},
{
"Symbol": "PSCM"
},
{
"Symbol": "PSCT"
},
{
"Symbol": "PSEC"
},
{
"Symbol": "PSIX"
},
{
"Symbol": "PSTI"
},
{
"Symbol": "PTC"
},
{
"Symbol": "PTCT"
},
{
"Symbol": "PTEN"
},
{
"Symbol": "PTNR"
},
{
"Symbol": "PTSI"
},
{
"Symbol": "PWOD"
},
{
"Symbol": "PXLW"
},
{
"Symbol": "PZZA"
},
{
"Symbol": "QABA"
},
{
"Symbol": "QADA"
},
{
"Symbol": "QADB"
},
{
"Symbol": "QAT"
},
{
"Symbol": "QBAK"
},
{
"Symbol": "QCCO"
},
{
"Symbol": "QCLN"
},
{
"Symbol": "QCOM"
},
{
"Symbol": "QCRH"
},
{
"Symbol": "QDEL"
},
{
"Symbol": "QGEN"
},
{
"Symbol": "QIWI"
},
{
"Symbol": "QKLS"
},
{
"Symbol": "QLYS"
},
{
"Symbol": "QNST"
},
{
"Symbol": "QQEW"
},
{
"Symbol": "QQQ"
},
{
"Symbol": "QQQX"
},
{
"Symbol": "QQXT"
},
{
"Symbol": "QRHC"
},
{
"Symbol": "QRVO"
},
{
"Symbol": "QTEC"
},
{
"Symbol": "QTNT"
},
{
"Symbol": "QUIK"
},
{
"Symbol": "QUMU"
},
{
"Symbol": "QURE"
},
{
"Symbol": "QYLD"
},
{
"Symbol": "RADA"
},
{
"Symbol": "RAIL"
},
{
"Symbol": "RAND"
},
{
"Symbol": "RARE"
},
{
"Symbol": "RAVE"
},
{
"Symbol": "RAVN"
},
{
"Symbol": "RBCN"
},
{
"Symbol": "RCII"
},
{
"Symbol": "RCKY"
},
{
"Symbol": "RCMT"
},
{
"Symbol": "RCON"
},
{
"Symbol": "RDCM"
},
{
"Symbol": "RDHL"
},
{
"Symbol": "RDI"
},
{
"Symbol": "RDIB"
},
{
"Symbol": "RDNT"
},
{
"Symbol": "RDUS"
},
{
"Symbol": "RDVY"
},
{
"Symbol": "RDWR"
},
{
"Symbol": "REFR"
},
{
"Symbol": "REGI"
},
{
"Symbol": "REGN"
},
{
"Symbol": "RELL"
},
{
"Symbol": "RELV"
},
{
"Symbol": "REPH"
},
{
"Symbol": "RESN"
},
{
"Symbol": "RFIL"
},
{
"Symbol": "RGCO"
},
{
"Symbol": "RGEN"
},
{
"Symbol": "RGLD"
},
{
"Symbol": "RGLS"
},
{
"Symbol": "RIBT"
},
{
"Symbol": "RICK"
},
{
"Symbol": "RIGL"
},
{
"Symbol": "RITT"
},
{
"Symbol": "RMBS"
},
{
"Symbol": "RMCF"
},
{
"Symbol": "RMTI"
},
{
"Symbol": "RNA"
},
{
"Symbol": "RNST"
},
{
"Symbol": "RNWK"
},
{
"Symbol": "ROBO"
},
{
"Symbol": "ROCK"
},
{
"Symbol": "ROIC"
},
{
"Symbol": "ROLL"
},
{
"Symbol": "ROST"
},
{
"Symbol": "ROYL"
},
{
"Symbol": "RPRX"
},
{
"Symbol": "RRD"
},
{
"Symbol": "RRGB"
},
{
"Symbol": "RUSHA"
},
{
"Symbol": "RUSHB"
},
{
"Symbol": "RUTH"
},
{
"Symbol": "RVNC"
},
{
"Symbol": "RVSB"
},
{
"Symbol": "RWLK"
},
{
"Symbol": "RXDX"
},
{
"Symbol": "RYAAY"
},
{
"Symbol": "SABR"
},
{
"Symbol": "SAFM"
},
{
"Symbol": "SAFT"
},
{
"Symbol": "SAGE"
},
{
"Symbol": "SAIA"
},
{
"Symbol": "SAL"
},
{
"Symbol": "SALM"
},
{
"Symbol": "SAMG"
},
{
"Symbol": "SANM"
},
{
"Symbol": "SANW"
},
{
"Symbol": "SASR"
},
{
"Symbol": "SATS"
},
{
"Symbol": "SAVE"
},
{
"Symbol": "SBAC"
},
{
"Symbol": "SBCF"
},
{
"Symbol": "SBFG"
},
{
"Symbol": "SBGI"
},
{
"Symbol": "SBLK"
},
{
"Symbol": "SBNY"
},
{
"Symbol": "SBRA"
},
{
"Symbol": "SBSI"
},
{
"Symbol": "SBUX"
},
{
"Symbol": "SCHL"
},
{
"Symbol": "SCHN"
},
{
"Symbol": "SCON"
},
{
"Symbol": "SCOR"
},
{
"Symbol": "SCSC"
},
{
"Symbol": "SCTY"
},
{
"Symbol": "SCVL"
},
{
"Symbol": "SEAC"
},
{
"Symbol": "SEED"
},
{
"Symbol": "SEIC"
},
{
"Symbol": "SENEA"
},
{
"Symbol": "SENEB"
},
{
"Symbol": "SFBC"
},
{
"Symbol": "SFBS"
},
{
"Symbol": "SFM"
},
{
"Symbol": "SFNC"
},
{
"Symbol": "SFST"
},
{
"Symbol": "SGC"
},
{
"Symbol": "SGEN"
},
{
"Symbol": "SGMA"
},
{
"Symbol": "SGMO"
},
{
"Symbol": "SGMS"
},
{
"Symbol": "SGOC"
},
{
"Symbol": "SHBI"
},
{
"Symbol": "SHEN"
},
{
"Symbol": "SHIP"
},
{
"Symbol": "SHLD"
},
{
"Symbol": "SHOO"
},
{
"Symbol": "SIEB"
},
{
"Symbol": "SIEN"
},
{
"Symbol": "SIFY"
},
{
"Symbol": "SIGA"
},
{
"Symbol": "SIGI"
},
{
"Symbol": "SILC"
},
{
"Symbol": "SIMO"
},
{
"Symbol": "SINO"
},
{
"Symbol": "SIRI"
},
{
"Symbol": "SIVB"
},
{
"Symbol": "SIXD"
},
{
"Symbol": "SKOR"
},
{
"Symbol": "SKYW"
},
{
"Symbol": "SKYY"
},
{
"Symbol": "SLAB"
},
{
"Symbol": "SLCT"
},
{
"Symbol": "SLGN"
},
{
"Symbol": "SLM"
},
{
"Symbol": "SLMBP"
},
{
"Symbol": "SLP"
},
{
"Symbol": "SLRC"
},
{
"Symbol": "SLVO"
},
{
"Symbol": "SMBC"
},
{
"Symbol": "SMCI"
},
{
"Symbol": "SMED"
},
{
"Symbol": "SMIT"
},
{
"Symbol": "SMLR"
},
{
"Symbol": "SMMF"
},
{
"Symbol": "SMPL"
},
{
"Symbol": "SMSI"
},
{
"Symbol": "SMTC"
},
{
"Symbol": "SNCR"
},
{
"Symbol": "SNFCA"
},
{
"Symbol": "SNPS"
},
{
"Symbol": "SOCL"
},
{
"Symbol": "SOFO"
},
{
"Symbol": "SOHO"
},
{
"Symbol": "SOHU"
},
{
"Symbol": "SOXX"
},
{
"Symbol": "SP"
},
{
"Symbol": "SPCB"
},
{
"Symbol": "SPDC"
},
{
"Symbol": "SPHS"
},
{
"Symbol": "SPLK"
},
{
"Symbol": "SPNS"
},
{
"Symbol": "SPOK"
},
{
"Symbol": "SPPI"
},
{
"Symbol": "SPRO"
},
{
"Symbol": "SPRT"
},
{
"Symbol": "SPSC"
},
{
"Symbol": "SPTN"
},
{
"Symbol": "SPWH"
},
{
"Symbol": "SPWR"
},
{
"Symbol": "SQBG"
},
{
"Symbol": "SQQQ"
},
{
"Symbol": "SRCE"
},
{
"Symbol": "SRCL"
},
{
"Symbol": "SRDX"
},
{
"Symbol": "SREV"
},
{
"Symbol": "SRNE"
},
{
"Symbol": "SSB"
},
{
"Symbol": "SSBI"
},
{
"Symbol": "SSYS"
},
{
"Symbol": "STAA"
},
{
"Symbol": "STBA"
},
{
"Symbol": "STEM"
},
{
"Symbol": "STFC"
},
{
"Symbol": "STKL"
},
{
"Symbol": "STLD"
},
{
"Symbol": "STMP"
},
{
"Symbol": "STRA"
},
{
"Symbol": "STRL"
},
{
"Symbol": "STRM"
},
{
"Symbol": "STRS"
},
{
"Symbol": "STRT"
},
{
"Symbol": "STX"
},
{
"Symbol": "STXS"
},
{
"Symbol": "SUMR"
},
{
"Symbol": "SUNS"
},
{
"Symbol": "SUPN"
},
{
"Symbol": "SVA"
},
{
"Symbol": "SVBI"
},
{
"Symbol": "SVVC"
},
{
"Symbol": "SWIR"
},
{
"Symbol": "SWKS"
},
{
"Symbol": "SYBT"
},
{
"Symbol": "SYKE"
},
{
"Symbol": "SYNA"
},
{
"Symbol": "SYNL"
},
{
"Symbol": "SYPR"
},
{
"Symbol": "TACT"
},
{
"Symbol": "TAIT"
},
{
"Symbol": "TAST"
},
{
"Symbol": "TATT"
},
{
"Symbol": "TAYD"
},
{
"Symbol": "TBBK"
},
{
"Symbol": "TBIO"
},
{
"Symbol": "TBK"
},
{
"Symbol": "TBNK"
},
{
"Symbol": "TBPH"
},
{
"Symbol": "TCBI"
},
{
"Symbol": "TCBK"
},
{
"Symbol": "TCCO"
},
{
"Symbol": "TCFC"
},
{
"Symbol": "TCPC"
},
{
"Symbol": "TCX"
},
{
"Symbol": "TDIV"
},
{
"Symbol": "TECH"
},
{
"Symbol": "TEDU"
},
{
"Symbol": "TENX"
},
{
"Symbol": "TESS"
},
{
"Symbol": "TFSL"
},
{
"Symbol": "TGA"
},
{
"Symbol": "TGEN"
},
{
"Symbol": "TGLS"
},
{
"Symbol": "TGTX"
},
{
"Symbol": "THFF"
},
{
"Symbol": "THRM"
},
{
"Symbol": "THST"
},
{
"Symbol": "THTI"
},
{
"Symbol": "TIGR"
},
{
"Symbol": "TILE"
},
{
"Symbol": "TIPT"
},
{
"Symbol": "TITN"
},
{
"Symbol": "TLOG"
},
{
"Symbol": "TNDM"
},
{
"Symbol": "TNXP"
},
{
"Symbol": "TOPS"
},
{
"Symbol": "TORM"
},
{
"Symbol": "TOUR"
},
{
"Symbol": "TOWN"
},
{
"Symbol": "TQQQ"
},
{
"Symbol": "TREE"
},
{
"Symbol": "TRIB"
},
{
"Symbol": "TRIL"
},
{
"Symbol": "TRIP"
},
{
"Symbol": "TRMB"
},
{
"Symbol": "TRMK"
},
{
"Symbol": "TRNS"
},
{
"Symbol": "TRNX"
},
{
"Symbol": "TROW"
},
{
"Symbol": "TRS"
},
{
"Symbol": "TRST"
},
{
"Symbol": "TRUE"
},
{
"Symbol": "TRVN"
},
{
"Symbol": "TSBK"
},
{
"Symbol": "TSC"
},
{
"Symbol": "TSCO"
},
{
"Symbol": "TSEM"
},
{
"Symbol": "TSLA"
},
{
"Symbol": "TSRI"
},
{
"Symbol": "TTEC"
},
{
"Symbol": "TTEK"
},
{
"Symbol": "TTGT"
},
{
"Symbol": "TTMI"
},
{
"Symbol": "TTOO"
},
{
"Symbol": "TTWO"
},
{
"Symbol": "TUSA"
},
{
"Symbol": "TWER"
},
{
"Symbol": "TWOU"
},
{
"Symbol": "TXN"
},
{
"Symbol": "TXRH"
},
{
"Symbol": "TZOO"
},
{
"Symbol": "UAE"
},
{
"Symbol": "UBCP"
},
{
"Symbol": "UBFO"
},
{
"Symbol": "UBOH"
},
{
"Symbol": "UBSI"
},
{
"Symbol": "UCBI"
},
{
"Symbol": "UCTT"
},
{
"Symbol": "UEIC"
},
{
"Symbol": "UEPS"
},
{
"Symbol": "UFPI"
},
{
"Symbol": "UFPT"
},
{
"Symbol": "UG"
},
{
"Symbol": "UHAL"
},
{
"Symbol": "UIHC"
},
{
"Symbol": "ULBI"
},
{
"Symbol": "ULTA"
},
{
"Symbol": "ULTR"
},
{
"Symbol": "UMBF"
},
{
"Symbol": "UMPQ"
},
{
"Symbol": "UNAM"
},
{
"Symbol": "UNB"
},
{
"Symbol": "UNFI"
},
{
"Symbol": "UNTY"
},
{
"Symbol": "UPLD"
},
{
"Symbol": "URBN"
},
{
"Symbol": "USAK"
},
{
"Symbol": "USAP"
},
{
"Symbol": "USCR"
},
{
"Symbol": "USEG"
},
{
"Symbol": "USLM"
},
{
"Symbol": "UTHR"
},
{
"Symbol": "UTMD"
},
{
"Symbol": "UTSI"
},
{
"Symbol": "UVSP"
},
{
"Symbol": "VALU"
},
{
"Symbol": "VBFC"
},
{
"Symbol": "VBIV"
},
{
"Symbol": "VBLT"
},
{
"Symbol": "VBND"
},
{
"Symbol": "VBTX"
},
{
"Symbol": "VCEL"
},
{
"Symbol": "VCIT"
},
{
"Symbol": "VCLT"
},
{
"Symbol": "VCSH"
},
{
"Symbol": "VECO"
},
{
"Symbol": "VGIT"
},
{
"Symbol": "VGLT"
},
{
"Symbol": "VGSH"
},
{
"Symbol": "VIA"
},
{
"Symbol": "VICR"
},
{
"Symbol": "VIDE"
},
{
"Symbol": "VIDI"
},
{
"Symbol": "VIEW"
},
{
"Symbol": "VIRC"
},
{
"Symbol": "VISN"
},
{
"Symbol": "VIVO"
},
{
"Symbol": "VLGEA"
},
{
"Symbol": "VMBS"
},
{
"Symbol": "VNDA"
},
{
"Symbol": "VNET"
},
{
"Symbol": "VNOM"
},
{
"Symbol": "VNQI"
},
{
"Symbol": "VOD"
},
{
"Symbol": "VONE"
},
{
"Symbol": "VONG"
},
{
"Symbol": "VONV"
},
{
"Symbol": "VOXX"
},
{
"Symbol": "VRA"
},
{
"Symbol": "VRNS"
},
{
"Symbol": "VRNT"
},
{
"Symbol": "VRSK"
},
{
"Symbol": "VRSN"
},
{
"Symbol": "VRTA"
},
{
"Symbol": "VRTB"
},
{
"Symbol": "VRTS"
},
{
"Symbol": "VRTX"
},
{
"Symbol": "VSAT"
},
{
"Symbol": "VSEC"
},
{
"Symbol": "VSTM"
},
{
"Symbol": "VTHR"
},
{
"Symbol": "VTIP"
},
{
"Symbol": "VTNR"
},
{
"Symbol": "VTWG"
},
{
"Symbol": "VTWO"
},
{
"Symbol": "VTWV"
},
{
"Symbol": "VUSE"
},
{
"Symbol": "VWOB"
},
{
"Symbol": "VXUS"
},
{
"Symbol": "WABC"
},
{
"Symbol": "WAFD"
},
{
"Symbol": "WASH"
},
{
"Symbol": "WATT"
},
{
"Symbol": "WAYN"
},
{
"Symbol": "WB"
},
{
"Symbol": "WBA"
},
{
"Symbol": "WDC"
},
{
"Symbol": "WDFC"
},
{
"Symbol": "WEN"
},
{
"Symbol": "WERN"
},
{
"Symbol": "WETF"
},
{
"Symbol": "WEYS"
},
{
"Symbol": "WHF"
},
{
"Symbol": "WHLM"
},
{
"Symbol": "WHLR"
},
{
"Symbol": "WILC"
},
{
"Symbol": "WIRE"
},
{
"Symbol": "WIX"
},
{
"Symbol": "WLDN"
},
{
"Symbol": "WLFC"
},
{
"Symbol": "WOOD"
},
{
"Symbol": "WPRT"
},
{
"Symbol": "WRLD"
},
{
"Symbol": "WSBC"
},
{
"Symbol": "WSBF"
},
{
"Symbol": "WSFS"
},
{
"Symbol": "WSTG"
},
{
"Symbol": "WSTL"
},
{
"Symbol": "WTBA"
},
{
"Symbol": "WTFC"
},
{
"Symbol": "WVFC"
},
{
"Symbol": "WVVI"
},
{
"Symbol": "WWD"
},
{
"Symbol": "WYNN"
},
{
"Symbol": "XENE"
},
{
"Symbol": "XLNX"
},
{
"Symbol": "XLRN"
},
{
"Symbol": "XNCR"
},
{
"Symbol": "XNET"
},
{
"Symbol": "XOMA"
},
{
"Symbol": "XONE"
},
{
"Symbol": "XTLB"
},
{
"Symbol": "YNDX"
},
{
"Symbol": "YORW"
},
{
"Symbol": "YY"
},
{
"Symbol": "Z"
},
{
"Symbol": "ZAZA"
},
{
"Symbol": "ZBRA"
},
{
"Symbol": "ZEUS"
},
{
"Symbol": "ZGNX"
},
{
"Symbol": "ZION"
},
{
"Symbol": "ZIOP"
},
{
"Symbol": "ZIXI"
},
{
"Symbol": "ZUMZ"
}
]
import sys
sys.path.insert(1, "/home/jay/.local/lib/python3.7/site-packages")
import robin_stocks
from letters import *
from writing import *
import robin_stocks.robinhood as robinhood
# from writing import *
from copy import copy
import base64, pyotp
import json
# login to robinhood account
def login():
keyDir = "/home/jay/Keys/robinhood-"
usr = open(keyDir + "username.txt").read().rstrip()
psswd = open(keyDir + "password.txt").read().rstrip()
mfa = open(keyDir + "qrcode.txt").read()
mfa = mfa.rstrip()
mfa = mfa.encode()
mfa_now = pyotp.TOTP(mfa).now()
robinhood.login(usr, psswd, mfa_code=mfa_now)
return True
# logout of robinhood account
def logout():
robinhood.logout()
# holds stock symbol and price data
class Stock:
def __init__(self, _symbol, _name=None):
self.symbol = _symbol
self.name = (
_name if _name is not None else robinhood.get_name_by_symbol(_symbol)
)
self.up = False
# data
self.current_price = 0
self.last_close_price = 0
self.day_delta_price = 0
self.day_delta_pct = 0
self.update()
# updates prices
def update(self):
self.current_price = float(robinhood.get_latest_price(self.symbol)[0])
self.last_close_price = float(
robinhood.get_quotes(self.symbol)[0]["previous_close"]
)
self.day_delta_price = self.current_price - self.last_close_price
self.day_delta_pct = self.day_delta_price / self.last_close_price * 100
self.up = self.day_delta_price >= 0
# displays price data
def display(self):
print(self.get_display())
# returns price data as string
def get_display(self):
return (str)(
"{0} {1} ${2:.2f} {3:.2f}%".format(
self.symbol,
"↑" if self.up else "↓",
abs(self.day_delta_price),
abs(self.day_delta_pct),
)
)
# converts data to printable message
def to_message(self):
msg = Message()
color = (0, 255, 0) if self.up else (255, 0, 0)
arrow = UP() if self.up else DOWN()
msg.addLetter(Letter(arrow, _color=color))
name = str(self.name)
sym = str(self.symbol)
for l in name:
if l == " ":
msg.addSpace(3)
print("space after ", l, " in ", name)
else:
try:
msg.addLetter(Letter(get_letter(l)(), _color=color))
except:
print("error printing ", l, " in ", name)
msg.addLetter(Letter(OPEN()))
for l in sym:
msg.addLetter(Letter(get_letter(l)(), _color=color))
msg.addLetter(Letter(CLOSE()))
nums = dollar_message(self.day_delta_price)
msg.addMessage(nums)
msg.addLetter(Letter(EQUALS()))
pct = percent_message(self.day_delta_pct)
msg.addMessage(pct)
return msg
def delta_up(self):
return self.day_delta_price >= 0
# builds a list of stocks held by account
def build_stocks():
holdings = robinhood.build_holdings()
ret = []
for stock in holdings.keys():
ret.append(Stock(stock))
return ret
# returns an array of stock ticker symbols
def get_stock_symbols():
dat = json.loads(open("/home/jay/StockTicker/test-stock-symbols.json").read())
ret = []
for stock in dat:
# [item for item in positions_data if item['symbol'] == 'TSLA']
ret.append(stock["Symbol"])
return ret
# handles LED strip function
from os_handler import windows
if not windows():
from rpi_ws281x import PixelStrip, Color as BoardColor
else:
from writing import FullDisplay, Color as BoardColor
# LED strip configuration:
LED_COUNT = 256 # Number of LED pixels.
LED_PIN = 21 # GPIO pin connected to the pixels (18 uses PWM!).
# LED_PIN = 10 # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 10 # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 10 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
def init_strip():
"""initializes and returns strip"""
if windows():
strip = FullDisplay()
else:
# Create NeoPixel object with appropriate configuration.
strip = PixelStrip(
LED_COUNT,
LED_PIN,
LED_FREQ_HZ,
LED_DMA,
LED_INVERT,
LED_BRIGHTNESS,
LED_CHANNEL,
)
# Intialize the library (must be called once before other functions).
strip.begin()
return strip
def set_display(strip, color, count=LED_COUNT):
"""set all pixels to one color"""
for i in range(count):
strip.setPixelColor(i, color)
strip.show()
def clear_display(strip, off=BoardColor(0, 0, 0)):
"""set all pixels in strip to 'off'"""
set_display(strip, off)
def convert_to_lib_color(r, g, b):
"""convert RGB values to rpi_ws281x.Color"""
return BoardColor(r, g, b)
# ToDo: func to test if correct wiring
[
{
"Symbol": "AAL"
},
{
"Symbol": "AAME"
},
{
"Symbol": "AAOI"
},
{
"Symbol": "AAON"
},
{
"Symbol": "AAPL"
},
{
"Symbol": "AAWW"
},
{
"Symbol": "AAXJ"
},
{
"Symbol": "ABCB"
}
]
# from rpi_ws281x import Color
from converter import convert
from groups import *
import pprint
class Letter:
def __init__(self, _lines, _max=256, _start=0, _h=8, _color=(0, 0, 255)):
self.column = _start # leftmost column, 0 = first
self.lines = _lines # the 2D array of data
self.max = _max # the maximum index before wrapping
self.h = _h # the height to convert around
self.color = _color
# the number of columns the letter occupies
def width(self):
return len(self.lines)
# move all the lines
def scroll(self, columns=1):
self.column += columns
colMax = self.max / self.h
if self.column >= colMax:
self.column = self.column - colMax
if self.column < 0:
self.column = self.column + colMax
for line in self.lines:
for i in range(len(line)):
idx = line[i] + self.h * columns
if idx >= self.max: # wrap over
idx = idx - self.max
if idx < 0: # wrap under
idx = idx + self.max
line[i] = idx
# set start to new_col and offset lines accordingly
def set_column(self, new_col):
off = (new_col - self.column) * self.h
self.column = new_col
for line in self.lines:
for i in range(len(line)):
num = line[i] + off
line[i] = num
# reset lines to 0
def zero(self):
sub = self.column * self.h
self.column = 0
for line in self.lines:
for i in range(len(line)):
num = line[i] - sub
line[i] = num
class Message:
def __init__(self, _h=8):
self.letters = [] # letter array
self.start = 0 # start index
self.width = 0 # width in columns
self.spacing = 1 # default space for letters
self.h = _h # height
# number of spaces the message occupies
def max(self):
return self.width * self.h
def scroll(self, columns=1):
for letter in self.letters:
letter.scroll(columns) # check if val or ref
def addLetter(self, letter, _spacing=1, _shrinkMax=False):
newMax = self.max() + letter.width() * self.h
if (newMax < letter.max and _shrinkMax) or newMax > letter.max:
letter.max = newMax
for myLetter in self.letters:
myLetter.max = newMax
letter.scroll(self.width)
self.letters.append(letter)
self.width = self.width + letter.width() + _spacing
def addChar(self, char):
if " " == char:
self.addSpace(4)
return
letter = get_char(char)
if -1 == letter:
print("bad char: ", char)
else:
self.addLetter(Letter(letter()))
def addString(self, s):
for c in s:
self.addChar(c)
def addMessage(self, msg):
# msg.scroll(self.width + self.spacing)
for letter in msg.letters:
letter.zero()
self.addLetter(letter)
def addSpace(self, columns=1):
self.width = self.width + columns
newMax = self.max() + columns * self.h
for letter in self.letters:
if newMax > letter.max:
letter.max = newMax
class Writer:
def __init__(self, _strip, _max=256):
self.strip = _strip
self.max = _max
def writeLetter(self, letter):
for line in letter.lines:
for pix in line:
if pix >= 0 and pix < self.max:
self.strip.setPixelColor(int(convert(pix)), letter.color)
def writeMessage(self, message):
for letter in message.letters:
self.writeLetter(letter)
# returns the data array function
# # associated with the given character
def get_char(s):
asc = ord(s)
if asc >= 65 and asc < 91:
idx = asc - 65
return uppercase[idx]
elif asc >= 97 and asc < 123:
idx = asc - 97
return lowercase[idx]
elif asc >= 48 and asc < 58:
idx = asc - 48
return numbers[idx]
elif s in symbols:
return symbols.get(s)
else:
print("bad char: ", s, "asc: ", asc)
return -1
def dollar_message(num):
num = "%0.2f" % (num)
msg = Message()
msg.addLetter(Letter(DOLLAR()))
for char in num:
if char.isdigit():
char = int(char)
msg.addLetter(Letter(numbers[char]()))
elif char == ".":
msg.addLetter(Letter(PERIOD()))
else:
print("bad char: ", char)
return msg
def percent_message(num):
num = "%0.2f" % (num)
msg = Message()
for char in num:
if char.isdigit():
char = int(char)
msg.addLetter(Letter(numbers[char]()))
elif char == ".":
msg.addLetter(Letter(PERIOD()))
else:
print("bad char: ", char)
msg.addLetter(Letter(PERCENT()))
return msg
class Color:
def __init__(self, _r, _g, _b):
self.r = _r
self.g = _g
self.b = _b
# converts a string message into a data array
def convert_string_to_data_array(msg):
data = []
for character in msg:
try:
arr = get_char((str)(character))()
for line in arr:
data.append(line)
except:
print("error: |" + (str)(character) + "|")
data.append(SPACE(1))
return data
# converts old character format to new format
# 1 represents color, 0 represents no color
def convert_old_character_to_lines(data, h=8):
ret = []
# for each "column" in the data array
for line in data:
new_line = []
new_line = [0 for i in range(h)]
for cell in line:
# index within line
if cell != []:
line_idx = cell % h
new_line[line_idx] = 1
ret.append(new_line)
return ret
# converts an array of 1/0's to an array of colors
def convert_10_to_colors(data, color, default=Color(0, 0, 0), h=8):
ret = []
# for each "column" in the data array
for line in data:
new_line = [default] * h
for i in range(h):
new_line[i] = color if line[i] == 1 else default
ret.append(new_line)
return ret
# data container for display array
class FullDisplay:
def __init__(self, _data=None, _wrap=False, _height=8):
self.height = _height
self.wrap = _wrap # message wraps when done
self.data = [] if _data is None else _data # color array
# returns a list of colors for the board
def get_data_slice(self, start_column, flip=False, width=32):
len_data = len(self.data)
if start_column >= len_data:
print("start index beyond end of data")
return None
data_slice = []
for i in range(start_column, min(len_data, start_column + width)):
data_slice.append(self.data[i])
if self.wrap:
for i in range(0, start_column + width - len_data):
data_slice.append(self.data[i])
# convert 2D array into 1D array
color_idx_array = []
i = 0
for column_idx in range(len(data_slice)):
column = data_slice[column_idx]
if flip and column_idx % 2 == 1: # odd
# flip
for idx in reversed(range(self.height)):
color_idx_array.append(column[idx])
i = i + 1
else:
for color in column:
color_idx_array.append(color)
i = i + 1
if len(color_idx_array) < width * self.height:
print("BAD DATA")
return color_idx_array
# takes in a data array and a color, sets self.data
# to be an array filled with the color
def set_array_10_color(self, arr, color, default=Color(0, 0, 0)):
self.data = []
for line in arr:
new_line = []
for cell in line:
new_color = color if cell == 1 else default
new_line.append(new_color)
self.data.append(new_line)
# adds blank padding to the front of the array
# (used to offset message to the left)
def add_front_padding(self, width=32, default=Color(0, 0, 0)):
blank_line = []
for i in range(self.height):
blank_line.append(default)
for i in range(width):
self.data.insert(0, blank_line)
# gets the length of the data array
def data_length(self):
return len(self.data)
# cuts data from the front
def cut(self, amt):
assert self.data_length() > amt
self.data = self.data[amt:]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment