주문에 사용된 정확한 금액을 얻기 위해 메모
매수가, 매도가와 매수 주문인지 매도 주문인지 구분하기 위해 사용
# test.py
import boto3
import pyupbit
import upbit_defs as m_upbit
def get_parameter_fromSSM():
"""SSM 파라미터 조회 함수"""
ssm = boto3.client('ssm') # SSM 클라이언트를 생성합니다.
parameters = ['/ethauto/upbit-key/access-key',
'/ethauto/upbit-key/secret-key',
'/ethauto/slack-token',
'/AutotradeWithAI/SQSurl']
ssm_para = list()
for i in parameters:
response = ssm.get_parameter(
Name=i,
WithDecryption=True
)
ssm_para.append(response['Parameter']['Value']) # 파라미터 값을 리스트에 추가합니다.
return ssm_para[0], ssm_para[1], ssm_para[2], ssm_para[3] # 파라미터 값을 반환합니다.
upbit_access_key, upbit_secret_key, slack_token, queue_url = get_parameter_fromSSM()
upbit_login = pyupbit.Upbit(upbit_access_key, upbit_secret_key)
# 잔고 조회
stock_name="KRW-ETH"
krw = m_upbit.get_balance("KRW", upbit_login)
crypto_balance = m_upbit.get_balance('ETH', upbit_login)
# 시세 조회
currunt=m_upbit.get_current_price(stock_name)
'''# 구매
order=upbit_login.buy_market_order(stock_name, krw*0.01)
order_id = order['uuid'] # 주문 ID를 얻음
price, action = m_upbit.get_order_details(order_id, upbit_login)'''
# 판매
order=upbit_login.sell_market_order(stock_name, crypto_balance*0.9995)
order_id = order['uuid'] # 주문 ID를 얻음
price, action = m_upbit.get_order_details(order_id, upbit_login)
message = (
f"거래전 원화 잔고: {krw}\n"
f"거래전 이더 잔고: {crypto_balance}\n"
f"거래전 가격: {currunt}\n"
"-------------------------\n"
f"거래가격: {price}\n"
f"거래행동: {action}\n"
"-------------------------\n"
f"현재 원화 잔고: {krw}\n"
f"현재 이더 잔고: {crypto_balance}\n"
)
print(message)
# upbit_defs.py
import pyupbit
def get_target_price(ticker, k):
"""변동성 돌파 전략으로 매수 목표가 조회"""
df = pyupbit.get_ohlcv(ticker, interval="day", count=2)
target_price = df.iloc[0]['close'] + (df.iloc[0]['high'] - df.iloc[0]['low']) * k
return target_price
def get_start_time(ticker):
"""시작 시간 조회"""
df = pyupbit.get_ohlcv(ticker, interval="day", count=1)
start_time = df.index[0]
return start_time
'''def get_balance(ticker, upbit):
"""잔고 조회"""
balances = upbit.get_balances()
for b in balances:
if b['currency'] == ticker:
if b['balance'] is not None:
return float(b['balance'])
else:
return 0
return 0'''
def get_balance(ticker, upbit):
"""잔고 조회"""
try:
balances = upbit.get_balances()
# 반환된 값이 리스트인지 확인
if isinstance(balances, list):
for b in balances:
if b['currency'] == ticker:
if b['balance'] is not None:
return float(b['balance'])
else:
return 0
else:
print("Error: Unexpected response format:", balances)
return 0
except Exception as e:
print(f"An error occurred while fetching balance: {e}")
return 0
def get_current_price(ticker):
"""현재가 조회"""
return pyupbit.get_orderbook(ticker=ticker)["orderbook_units"][0]["ask_price"]
def get_order_details(order_id, upbit_login):
"""주문 ID를 통해 체결된 가격과 매수/매도 여부를 조회하는 함수"""
order = upbit_login.get_order(order_id)
if order:
side = order['side'] # 'bid'이면 매수, 'ask'이면 매도
trades = order['trades']
# 체결된 가격과 수량 계산
total_price = sum(float(trade['price']) * float(trade['volume']) for trade in trades)
total_volume = sum(float(trade['volume']) for trade in trades)
average_price = total_price / total_volume if total_volume != 0 else 0
# 매수/매도 여부 판별
action = "buy" if side == "bid" else "sell"
return average_price, action
else:
return None, None
# 출력
# 매수 시
(.venv) cyaninn@DESKTOP-BD0QM42:/mnt/g/내 드라이브/Wingtree Project/DEV/AutotradeWithAI/v.2.0/Test$ python3 test.py
거래전 원화 잔고:861151.82055255
거래전 이더 잔고:0.00491523
거래전 가격:3647000
-------------------------
거래가격:3646999.9999999995
거래행동:buy
-------------------------
현재 원화 잔고:861151.82055255
현재 이더 잔고:0.00491523
# 매도 시
(.venv) cyaninn@DESKTOP-BD0QM42:/mnt/g/내 드라이브/Wingtree Project/DEV/AutotradeWithAI/v.2.0/Test$ python3 test.py
거래전 원화 잔고:852535.99957494
거래전 이더 잔고:0.00727649
거래전 가격:3647000
-------------------------
거래가격:3646000.0000000005
거래행동:sell
-------------------------
현재 원화 잔고:852535.99957494
현재 이더 잔고:0.00727649
'1인개발 메이킹로그 > [HybridCloud+AI] 가상화폐 자동매매 with AI' 카테고리의 다른 글
ECS Cluster에 등록된 특정 컨테이너 인스턴스에서 태스크 실행 (0) | 2024.07.02 |
---|---|
ECS Anywhere로 안쓰는 노트북을 외부 인스턴스로 추가 (1) | 2024.06.09 |