Skip to content
This repository was archived by the owner on Jun 9, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
16 changes: 16 additions & 0 deletions students/mattmaeda/stockscreener/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Stock Screener app

## Setup
1. In directory root, run `python -m venv venv`
2. Activate virtual environment `source venv/bin/activate`
3. Install required libraries `pip install -r requirements.txt`
4. Export Django application settings to environment `export DJANGO_SETTINGS_MODULE=stockscreener.settings`
5. Setup database `django-admin migrate`
6. Load initial rules and screen data `django-admin loaddata exchange/fixtures/initial_exchange_data.json`

## Run Application
1. `django-admin runserver`
2. Go to [http://127.0.0.1:8000](http://127.0.0.1:8000)

## Run Tests
1. `django-admin test exchange
Empty file.
8 changes: 8 additions & 0 deletions students/mattmaeda/stockscreener/exchange/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/usr/bin/env python
"""
stockscreener exchange package
"""

from pathlib import Path

__version__ = "0.0.1"
6 changes: 6 additions & 0 deletions students/mattmaeda/stockscreener/exchange/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.contrib import admin
from .models import Rule, Screen

# Register your models here.
admin.site.register(Rule)
admin.site.register(Screen)
5 changes: 5 additions & 0 deletions students/mattmaeda/stockscreener/exchange/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class ExchangeConfig(AppConfig):
name = 'exchange'
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"model": "exchange.rule", "pk": "MA100 GT CP", "fields": {"criteria": "100 Day Moving Average Above Closing Price"}}, {"model": "exchange.rule", "pk": "MA100 GT MA200", "fields": {"criteria": "100 Day Moving Average Above 200 Day Moving Average"}}, {"model": "exchange.rule", "pk": "MA100 LT CP", "fields": {"criteria": "100 Day Moving Average Below Closing Price"}}, {"model": "exchange.rule", "pk": "MA100 LT MA200", "fields": {"criteria": "100 Day Moving Average Below 200 Day Moving Average"}}, {"model": "exchange.rule", "pk": "MA50 GT CP", "fields": {"criteria": "50 Day Moving Average Above Closing Price"}}, {"model": "exchange.rule", "pk": "MA50 GT MA200", "fields": {"criteria": "50 Day Moving Average Above 200 Day Moving Average"}}, {"model": "exchange.rule", "pk": "MA50 LT CP", "fields": {"criteria": "50 Day Moving Average Below Closing Price"}}, {"model": "exchange.rule", "pk": "MA50 LT MA200", "fields": {"criteria": "50 Day Moving Average Below 200 Day Moving Average"}}, {"model": "exchange.rule", "pk": "MA50 XOVER MA100", "fields": {"criteria": "50 Day Moving Average Crosses Over 100 Day Moving Average"}}, {"model": "exchange.rule", "pk": "MA50 XUNDER MA100", "fields": {"criteria": "50 Moving Average Crosses Under 100 Day Moving Average"}}, {"model": "exchange.screen", "pk": "Death Cross", "fields": {"description": "50 Day Moving Average Cross Under 100 Day Moving Average", "rules": ["MA50 XUNDER MA100"]}}, {"model": "exchange.screen", "pk": "Death Cross Plus", "fields": {"description": "50 Day Moving Average Cross Under 100 Day Moving Average and Closing Price Above 50 Day Moving Average", "rules": ["MA100 GT CP", "MA100 GT MA200", "MA50 GT CP", "MA50 GT MA200", "MA50 XUNDER MA100"]}}, {"model": "exchange.screen", "pk": "Golden Cross", "fields": {"description": "50 Day Moving Average Cross Over 100 Day Moving Average", "rules": ["MA50 XOVER MA100"]}}, {"model": "exchange.screen", "pk": "Golden Cross Plus", "fields": {"description": "50 Day Moving Average Cross Over 100 Day Moving Average and Closing Price Above 50 Day Moving Average", "rules": ["MA100 LT CP", "MA100 LT MA200", "MA50 LT CP", "MA50 LT MA200", "MA50 XOVER MA100"]}}]
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Generated by Django 2.0.3 on 2018-03-14 04:32

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='Rule',
fields=[
('formula', models.CharField(max_length=100, primary_key=True, serialize=False)),
('criteria', models.CharField(max_length=250)),
],
),
migrations.CreateModel(
name='Screen',
fields=[
('name', models.CharField(max_length=100, primary_key=True, serialize=False)),
('description', models.CharField(max_length=250)),
('rules', models.ManyToManyField(to='exchange.Rule')),
],
),
]
23 changes: 23 additions & 0 deletions students/mattmaeda/stockscreener/exchange/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""
Database objects for screener application
"""
from django.db import models

# Create your models here.
class Rule(models.Model):
""" Holds rule information """
formula = models.CharField(max_length=100, primary_key=True)
criteria = models.CharField(max_length=250)

def __str__(self):
return self.formula


class Screen(models.Model):
""" Holds screen information """
name = models.CharField(max_length=100, primary_key=True)
description = models.CharField(max_length=250)
rules = models.ManyToManyField(Rule)

def __str__(self):
return self.name
29 changes: 29 additions & 0 deletions students/mattmaeda/stockscreener/exchange/templates/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<h3>Stock Screener</h3>
{% if message %}<p><strong>{{ message }}</strong></p>{% endif %}
<form action="/exchange/" method="post">
{% csrf_token %}
Stock Symbol: <input type="text" name="ticker">
<input type="submit" value="Screen Stock" />
</form>

{% if response %}
{% for screen in response %}
<strong>Name</strong>: {{ screen.name }} </br>
<strong>Description</strong>: {{ screen.desc }} </br>
<strong>Pass?</strong>: {{ screen.pass }} </br>
<table border="1">
<tr>
<th>Criteria</th>
<th>Pass?</th>
</tr>
{% for rule in screen.rules %}
<tr>
<td>{{ rule.criteria }}</td>
<td>{{ rule.pass }}</td>
</tr>
{% endfor %}
</table>
</br>
</br>
{% endfor %}
{% endif %}
Loading