공부하기싫어

주문에 사용된 정확한 금액을 얻기 위해 메모

 

매수가, 매도가와 매수 주문인지 매도 주문인지 구분하기 위해 사용

 

# 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