Begin implementing positions
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user