공부하기싫어
article thumbnail
  •  
  • EC2 에서 동작하는 python 코드를 수정 - 만약 보유 이더리움이 있다면 매일 오전 8시 55분에 매각하고 프로그램을 종료하도록 구성
  • lambda function 을 새로 생성 - dynamoDB 에서 값을 얻어와 매일 오전 9시에 python 스크립트를 백앤드로 동작하도록 하는 shell script 실행 명령을 전달하도록 구성

 

python 코드 수정

3개의 python 파일로 나눴음

 

ethereum_autotrade.py

import pyupbit
import aws_defs as m_aws
import upbit_defs as m_upbit


def main():
    try :
        upbit_access_key, upbit_secret_key = m_aws.get_parameter_fromSSM()
        bestk,endprice=m_aws.read_dynamoDB_table()
        print("success : get_parameter_fromSSM, read_dynamoDB_table")
    except Exception as e:
        print("failure : get_parameter_fromSSM, read_dynamoDB_table")
        print("Exception : ", e)

    try :
        upbit_login = pyupbit.Upbit(upbit_access_key, upbit_secret_key)
        print("success : login")
    except Exception as e:
        print("failure : login")
        print("Exception : ", e)
    
    try :
        m_upbit.autotrade(upbit_login, bestk, endprice)
    except Exception as e:
        print("failure : autotrade")
        print("Exception : ", e)

main()

 

aws_defs.py

import boto3

def read_dynamoDB_table() :
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('table-for-Ethereum-Autotrade')

    response = table.get_item(
        Key={
            'Env': 'Dev'
        }
    )

    item = response['Item']
    best_k = item['k-value']
    predicted_end_price = item['endprice']

    return best_k, predicted_end_price



def get_parameter_fromSSM() :
    ssm = boto3.client('ssm')

    parameters=['/ethereum-autotrade/upbit-key/access-key',
                '/ethereum-autotrade/upbit-key/secret-key']
    upbit_keys=list()

    for i in parameters:
        response = ssm.get_parameter(
            Name=i,
            WithDecryption=True
        )
        upbit_keys.append(response['Parameter']['Value'])
    
    return upbit_keys[0],upbit_keys[1]

 

 

upbit_defs.py

import pyupbit
import datetime
import time

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_current_price(ticker):
    """현재가 조회"""
    return pyupbit.get_orderbook(ticker=ticker)["orderbook_units"][0]["ask_price"]




def autotrade(upbit, bestk, predicted_endprice):
    '''자동매매'''
    dt_today=datetime.datetime.now()
    print("start daily autotrade : ",dt_today)

    # trading start
    while True:
        try:
            now = datetime.datetime.now()
            start_time = get_start_time("KRW-ETH")
            end_time = start_time + datetime.timedelta(days=1)
            dt_now = datetime.datetime.now()

            if start_time < now < end_time - datetime.timedelta(minutes=5):
                target_price = get_target_price("KRW-ETH", float(bestk))
                current_price = get_current_price("KRW-ETH")
                if target_price < current_price and current_price < predicted_endprice:
                    krw = get_balance("KRW", upbit)
                    if krw > 5000:
                        upbit.buy_market_order("KRW-ETH", krw*0.9995)
                        print("buy_market_order :"+dt_now)
                else :
                    print("running :"+dt_now)
            else:
                eth = get_balance("ETH")
                if eth > 0.00008:
                    upbit.sell_market_order("KRW-ETH", eth*0.9995)
                break
            time.sleep(1)
        except Exception as e:
            print(e)
            time.sleep(1)

    dt_today=datetime.datetime.now()
    print("shutdown daily autotrade : ", dt_today)

 

 

 

람다 함수 생성

매일 오전8시55분에 자동으로 종료되는 프로그램을 9시에 자동으로 다시 실행시켜주는 역할의 함수

 

런타임 - python 최신

역할 기본 생성

 

lambda_function.py

import boto3

def lambda_handler(event, context):
    ssm_client = boto3.client('ssm')
    instanceid=['i-0ac0634cbfe080b1b']
    commands=['cd /home/ubuntu/Ethereum-Autotrade/', 'sh run.sh']

    response = ssm_client.send_command(
                InstanceIds=instanceid,
                DocumentName="AWS-RunShellScript",
                Parameters={'commands': commands} )

    return "success"

 

 

역할 정책 추가

lambda - AmazonSSMFullAccess 연결
ec2 - AmazonSSMManagedInstanceCore 연결

 

run.sh

today=$(date "+%Y%m%d")
nohup python3 ethereum_autotrade.py > output${today}.log &

 

테스트

 

 

Cloudwatch EventBridge 생성 및 연결

이전 함수에 썻던 DLQ 를 똑같이 연결해줬고

오전 9시에 실행되도록 UCT - KST 변환으로 시간을 지정해줬다