Files
v2realbot/v2realbot/interfaces/live_interface.py
David Brazda 30048364bb first commit
2024-08-23 14:16:51 +02:00

203 lines
8.0 KiB
Python

from v2realbot.enums.enums import RecordType, StartBarAlign
from datetime import datetime, timedelta
from v2realbot.utils.utils import ltp, send_to_telegram
from alpaca.trading.client import TradingClient
from alpaca.trading.requests import MarketOrderRequest, TakeProfitRequest, LimitOrderRequest, ReplaceOrderRequest, GetOrdersRequest
from alpaca.trading.enums import OrderSide, TimeInForce, OrderClass, OrderStatus, QueryOrderStatus
from alpaca.trading.models import Order, Position
from alpaca.common.exceptions import APIError
from v2realbot.config import Keys
from v2realbot.interfaces.general_interface import GeneralInterface
from traceback import format_exc
"""""
Live interface with Alpaca for LIVE and PAPER trading.
"""""
class LiveInterface(GeneralInterface):
def __init__(self, symbol: str, key: Keys) -> None:
self.symbol = symbol
self.key :Keys = key
self.trading_client = TradingClient(api_key=key.API_KEY, secret_key=key.SECRET_KEY, paper=key.PAPER)
def start_checks(self):
pass
"""buy market"""
def buy(self, size = 1, repeat: bool = False):
order_request = MarketOrderRequest(
symbol=self.symbol,
qty=size,
side=OrderSide.BUY,
time_in_force=TimeInForce.GTC,
order_class=OrderClass.SIMPLE,
take_profit = None
)
try:
# Market order submit
market_order = self.trading_client.submit_order(
order_data=order_request
)
return market_order.id
except Exception as e:
reason = "Nepodarilo se market buy:" + str(e) + format_exc()
print(reason)
send_to_telegram(reason)
return -1
"""buy limit"""
def buy_l(self, price: float, size: int = 1, repeat: bool = False, force: int = 0):
limit_request = LimitOrderRequest(
symbol=self.symbol,
qty=size,
side=OrderSide.BUY,
time_in_force=TimeInForce.GTC,
order_class=OrderClass.SIMPLE,
take_profit = None,
limit_price = price
)
try:
# Market order submit
limit_order = self.trading_client.submit_order(
order_data=limit_request
)
print("LIIF: odeslana litmka s cenou", price, "- akt. cena", ltp.price[self.symbol])
return limit_order.id
except Exception as e:
reason = "Nepodarilo se odeslat buy limitku:" + str(e) + format_exc()
print(reason)
send_to_telegram(reason)
return -1
"""sell market"""
def sell(self, size = 1, repeat: bool = False):
order_request = MarketOrderRequest(
symbol=self.symbol,
qty=size,
side=OrderSide.SELL,
time_in_force=TimeInForce.GTC,
order_class=OrderClass.SIMPLE,
take_profit = None
)
try:
# Market order submit
market_order = self.trading_client.submit_order(
order_data=order_request
)
return market_order.id
except Exception as e:
reason = "Nepodarilo se odeslat sell:" + str(e) + format_exc()
print(reason)
send_to_telegram(reason)
return -1
"""sell limit"""
def sell_l(self, price: float, size = 1, repeat: bool = False):
self.size = size
self.repeat = repeat
limit_order = LimitOrderRequest(
symbol=self.symbol,
qty=self.size,
side=OrderSide.SELL,
time_in_force=TimeInForce.GTC,
order_class=OrderClass.SIMPLE,
limit_price = price)
try:
# Market order submit
limit_order = self.trading_client.submit_order(
order_data=limit_order
)
#pripadne ulozeni do self.lastOrder
return limit_order.id
except Exception as e:
reason = "Nepodarilo se odeslat sell limitku:" + str(e) + format_exc()
print(reason)
send_to_telegram(reason)
return -1
"""order replace"""
def repl(self, orderid: str, price: float = None, size: int = None, repeatl: bool = False):
if not price and not size:
print("price or size has to be filled")
return -1
replace_request = ReplaceOrderRequest(qty=size, limit_price=price)
try:
print("request na replace",replace_request)
print("cislo objednavky",orderid)
replaced_order = self.trading_client.replace_order_by_id(orderid, replace_request)
print("replaced ok",replaced_order.id)
return replaced_order.id
except APIError as e:
#stejne parametry - stava se pri rychle obratce, nevadi, vracime stejne orderid, chytne se dal
if e.code == 42210000: return orderid
else:
##mozna tady proste vracet vzdy ok
reason = "Neslo nahradit profitku. Problem:" + str(e) + format_exc()
print(reason)
send_to_telegram(reason)
return -1
#raise Exception(e)
"""order cancel"""
def cancel(self, orderid: str):
try:
a = self.trading_client.cancel_order_by_id(orderid)
print("rusime order",orderid)
return a
except APIError as e:
#order doesnt exist
if e.code == 40410000: return 0
else:
reason = "Nepovedlo se zrusit objednavku:" + str(e) + format_exc()
print(reason)
send_to_telegram(reason)
#raise Exception(e)
return -1
"""get positions ->(size,avgp)"""
def pos(self):
try:
a : Position = self.trading_client.get_open_position(self.symbol)
self.avgp, self.poz = float(a.avg_entry_price), int(a.qty)
return a.avg_entry_price, a.qty
except (APIError, Exception) as e:
#no position
if hasattr(e, 'code') and e.code == 40410000: return 0,0
else:
reason = "Exception when calling LIVE interface pos, REPEATING:" + str(e) + format_exc()
print("API ERROR: Nepodarilo se ziskat pozici.", reason)
send_to_telegram(reason)
#raise Exception(e)
return -1,-1
"""get open orders ->list(Order)"""
def get_open_orders(self, symbol: str, side: OrderSide = OrderSide.SELL): # -> list(Order):
getRequest = GetOrdersRequest(status=QueryOrderStatus.OPEN, side=side, symbols=[symbol])
try:
orderlist = self.trading_client.get_orders(getRequest)
#list of Orders (orderlist[0].id)
return orderlist
except Exception as e:
reason = "Chyba pri dotazeni objednávek:" + str(e) + format_exc()
print(reason)
send_to_telegram(reason)
#raise Exception (e)
return -1
def get_last_price(self, symbol: str):
return ltp.price[symbol]