|
|
|
@ -1,5 +1,7 @@
|
|
|
|
|
import stripe
|
|
|
|
|
from alpaca.trading.client import TradingClient
|
|
|
|
|
from alpaca.trading.enums import OrderSide, TimeInForce
|
|
|
|
|
from alpaca.trading.requests import LimitOrderRequest, MarketOrderRequest
|
|
|
|
|
from django.conf import settings
|
|
|
|
|
from django.contrib.auth.models import AbstractUser
|
|
|
|
|
from django.db import models
|
|
|
|
@ -140,31 +142,41 @@ class Trade(models.Model):
|
|
|
|
|
# the trade is not placed yet
|
|
|
|
|
if self.account.exchange == "alpaca":
|
|
|
|
|
trading_client = TradingClient(
|
|
|
|
|
self.account.api_key, self.account.api_secret, paper=self.sandbox
|
|
|
|
|
self.account.api_key,
|
|
|
|
|
self.account.api_secret,
|
|
|
|
|
paper=self.account.sandbox,
|
|
|
|
|
)
|
|
|
|
|
if self.direction == "buy":
|
|
|
|
|
direction = OrderSide.BUY
|
|
|
|
|
elif self.direction == "sell":
|
|
|
|
|
direction = OrderSide.SELL
|
|
|
|
|
else:
|
|
|
|
|
raise Exception("Unknown direction")
|
|
|
|
|
if self.type == "market":
|
|
|
|
|
order = account.create_order(
|
|
|
|
|
self.symbol, self.type, self.direction, self.amount
|
|
|
|
|
|
|
|
|
|
market_order_data = MarketOrderRequest(
|
|
|
|
|
symbol=self.symbol,
|
|
|
|
|
qty=self.amount,
|
|
|
|
|
side=OrderSide.BUY,
|
|
|
|
|
time_in_force=TimeInForce.IOC,
|
|
|
|
|
)
|
|
|
|
|
order = trading_client.submit_order(order_data=market_order_data)
|
|
|
|
|
elif self.type == "limit":
|
|
|
|
|
params = ""
|
|
|
|
|
order = account.create_limit_order(
|
|
|
|
|
self.symbol,
|
|
|
|
|
self.type,
|
|
|
|
|
self.direction,
|
|
|
|
|
self.amount,
|
|
|
|
|
self.price,
|
|
|
|
|
params,
|
|
|
|
|
limit_order_data = LimitOrderRequest(
|
|
|
|
|
symbol=self.symbol,
|
|
|
|
|
limit_price=self.price,
|
|
|
|
|
qty=self.amount,
|
|
|
|
|
side=direction,
|
|
|
|
|
time_in_force=TimeInForce.IOC,
|
|
|
|
|
)
|
|
|
|
|
order = trading_client.submit_order(order_data=limit_order_data)
|
|
|
|
|
else:
|
|
|
|
|
raise Exception("Unknown order type")
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
# self.status = parsed.status
|
|
|
|
|
# self.response = order
|
|
|
|
|
else:
|
|
|
|
|
# there is a trade open
|
|
|
|
|
# get trade
|
|
|
|
|