[類人猿]類人猿サイトクローンプロジェクト後記-2

25340 ワード

覚えたいコード

import schedule
import time
import random
import datetime

import os
import django
import sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "wallstreet.settings")
django.setup()

from django.db.models       import Q, Prefetch

from product.models import Product
from order.models   import Order, Transaction, Time_Unit, Report

class Scheduler():
    def report_maker(self, coin):
        time_unit_id            = Time_Unit.objects.get(name=1).id
        product                 = Product.objects.prefetch_related('transaction_set').get(full_name=coin)

        now                     = datetime.datetime.now() 
        time                    = now - datetime.timedelta(0, 60) 
        report_start_time       = datetime.datetime(time.year, time.month, time.day, time.hour, time.minute)
        report_end_time         = report_start_time + datetime.timedelta(0, 60) 

        last_closing_price      = product.transaction_set.filter(traded_at__lt=report_start_time).latest('traded_at').price
        transactions_to_report  = product.transaction_set.filter(
                                    traded_at__gte  =report_start_time,
                                    traded_at__lt   =report_end_time, 
                                ).order_by('traded_at')

        if len(transactions_to_report)==0:
            Report.objects.create(
            product_id          = product.id,
            time_unit_id        = time_unit_id, 
            opening_price       = last_closing_price,
            closing_price       = last_closing_price,
            high_price          = last_closing_price,
            low_price           = last_closing_price,
            transaction_volume  = 0,
            reported_time       = report_start_time,
            )

        else:
            transaction_price_list      = [trade.price for trade in transactions_to_report]
            transaction_quantity_list   = [trade.quantity for trade in transactions_to_report]

            Report.objects.create(
                product_id          = product.id,
                time_unit_id        = time_unit_id, 
                opening_price       = last_closing_price,
                closing_price       = transactions_to_report.last().price,
                high_price          = max(transaction_price_list), 
                low_price           = min(transaction_price_list), 
                transaction_volume  = sum(transaction_quantity_list),
                reported_time       = report_start_time,
                )
        print(report_start_time, coin)

    def scheule_a_job(self, type="Mins", interval=1):

        if (type == "Mins"):
            schedule.every(interval).minutes.do(self.report_maker, coin='썬쓰')
            schedule.every(interval).minutes.do(self.report_maker, coin='방탄코인쓰')

        while True:
            schedule.run_pending()
            time.sleep(1)

if __name__ == "__main__":
    run = Scheduler()
    run.scheule_a_job()
予定プログラムを使用して、1分前に発生した取引をすべて1分以内に呼び出し、市価/終値/高値/低価格/取引量などを計算します.
1分以内に取引が発生しない場合は、前に発生した最後の取引から市場価値を取得し、取引量を0に処理します.
このように積み上げられた1分間隔の履歴をフロントに伝えると、フロントは高グラフライブラリを使用してきれいな可視化展示を行います.
しかし、私は価格をバラバラにしました.ハハハ.饼楽と饼が缲り返し出てくるブスランキングになったので、后でデータを修正しました.
スケジューラを使うのは初めてなので、ネットで先に学んだコードだけで、最初は関数で書かれていましたが、後でクラスに変更されました.
きれいなグラフを生成するには,すべての時間に取引履歴が必要であるため,以前に漏れたレポートを生成する関数も一度実現した.今回は再帰関数を使いました…!
def make_report(coin, report_start_time):
    report_start_time = report_start_time
    report_end_time = report_start_time + datetime.timedelta(0,60)

    if not Report.objects.filter(product=coin, reported_time=report_start_time).exists():
        transactions_to_report = Transaction.objects.filter(
                traded_at__gte = report_start_time,
                traded_at__lt  = report_end_time, 
                product        = coin,
            ).order_by('traded_at')

        time_unit_id            = Time_Unit.objects.get(name=1).id

        last_closing_price = Transaction.objects.filter(traded_at__lt=report_start_time).latest('traded_at').price

        if len(transactions_to_report)==0:
            Report.objects.create(
            product_id          = coin.id,
            time_unit_id        = time_unit_id, 
            opening_price       = decimal.Decimal(last_closing_price),
            closing_price       = decimal.Decimal(last_closing_price),
            high_price          = decimal.Decimal(last_closing_price),
            low_price           = decimal.Decimal(last_closing_price),
            transaction_volume  = decimal.Decimal(0),
            reported_time       = report_start_time,
            )

        else:
            transaction_price_list      = [trade.price for trade in transactions_to_report]
            transaction_quantity_list   = [trade.quantity for trade in transactions_to_report]

            Report.objects.create(
                product_id          = coin.id,
                time_unit_id        = time_unit_id, 
                opening_price       = decimal.Decimal(last_closing_price),
                closing_price       = decimal.Decimal(transactions_to_report.last().price),
                high_price          = decimal.Decimal(max(transaction_price_list)), 
                low_price           = decimal.Decimal(min(transaction_price_list)), 
                transaction_volume  = decimal.Decimal(sum(transaction_quantity_list)),
                reported_time       = report_start_time,
                )

    if report_end_time <= datetime.datetime.now():
        make_report(coin=coin, report_start_time=report_end_time)

for name in ['방탄코인쓰', '썬쓰']:
    coin = Product.objects.get(full_name=name)

    first_trade_time = Transaction.objects.filter(product=coin).earliest('traded_at').traded_at
    first_reported_time = datetime.datetime(
                            first_trade_time.year, 
                            first_trade_time.month, 
                            first_trade_time.day, 
                            first_trade_time.hour, 
                            first_trade_time.minute)
    make_report(coin=coin, report_start_time=first_reported_time)
今が12:34:19なら、12:33:00から12:34:00までに発生した取引を持ってくるべきです.そのため、datetime.datetime, datetime.timedeltaを使用し、その時間に関する取引履歴を作成した場合はスキップします.
きれいな資料をフロントに渡すという信念を持って、このような変態関数を作るまでになった.APIで呼び出された関数はありません.
実際,この関数はデータを構築するために用いられ,一度だけ書くので再構築は行われていない.
しかし、私は変態なので、再包装した後、これらの関数がどのようにユニットテストを行っているのかを理解し(作成を続行する)つもりです.