Begin implementing positions

This commit is contained in:
2022-10-17 07:20:30 +01:00
parent 5279217324
commit 1bdd49ee6a
17 changed files with 452 additions and 28 deletions

View File

@@ -1,14 +1,15 @@
import logging
import ccxt
import stripe
from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.db import models
from serde import ValidationError
from core.lib.customers import get_or_create, update_customer_fields
from core.lib.serde import ccxt_s
from core.util import logs
logger = logging.getLogger(__name__)
log = logs.get_logger(__name__)
class Plan(models.Model):
@@ -59,7 +60,7 @@ class User(AbstractUser):
if settings.STRIPE_ENABLED:
if self.stripe_id:
stripe.Customer.delete(self.stripe_id)
logger.info(f"Deleted Stripe customer {self.stripe_id}")
log.info(f"Deleted Stripe customer {self.stripe_id}")
super().delete(*args, **kwargs)
def has_plan(self, plan):
@@ -96,7 +97,10 @@ class Hook(models.Model):
class Trade(models.Model):
SYMBOL_CHOICES = (("BTCUSD", "Bitcoin/USD"),)
SYMBOL_CHOICES = (
("BTC/USD", "Bitcoin/US Dollar"),
("LTC/USD", "Litecoin/US Dollar"),
)
TYPE_CHOICES = (
("market", "Market"),
("limit", "Limit"),
@@ -110,15 +114,19 @@ class Trade(models.Model):
symbol = models.CharField(choices=SYMBOL_CHOICES, max_length=255)
type = models.CharField(choices=TYPE_CHOICES, max_length=255)
amount = models.FloatField()
price = models.FloatField()
price = models.FloatField(null=True, blank=True)
stop_loss = models.FloatField(null=True, blank=True)
take_profit = models.FloatField(null=True, blank=True)
exchange_id = models.CharField(max_length=255, null=True, blank=True)
status = models.CharField(max_length=255, null=True, blank=True)
direction = models.CharField(
choices=DIRECTION_CHOICES, max_length=255, null=True, blank=True
choices=DIRECTION_CHOICES, max_length=255
)
# To populate from the trade
order_id = models.CharField(max_length=255, null=True, blank=True)
client_order_id = models.CharField(max_length=255, null=True, blank=True)
response = models.JSONField(null=True, blank=True)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._original = self
@@ -127,7 +135,7 @@ class Trade(models.Model):
"""
Override the save function to place the trade.
"""
if self.exchange_id is None:
if self.response is None:
# the trade is not placed yet
if self.account.exchange == "alpaca":
account = ccxt.alpaca(
@@ -149,7 +157,15 @@ class Trade(models.Model):
self.price,
params,
)
self.status = "filled"
print("ORDER", order)
try:
parsed = ccxt_s.CCXTRoot.from_dict(order)
except ValidationError as e:
log.error(f"Error creating trade: {e}")
return False
self.status = parsed.status
self.response = order
else:
# there is a trade open
# get trade