- 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"
역할 정책 추가
run.sh
today=$(date "+%Y%m%d")
nohup python3 ethereum_autotrade.py > output${today}.log &
테스트
Cloudwatch EventBridge 생성 및 연결
이전 함수에 썻던 DLQ 를 똑같이 연결해줬고
오전 9시에 실행되도록 UCT - KST 변환으로 시간을 지정해줬다
'1인개발 메이킹로그 > [Infra+k8s+App] 가상화폐 자동매매' 카테고리의 다른 글
[AWS-Server] CICD Pipeline (0) | 2023.04.12 |
---|---|
[AWS-Server] 6. S3 bucket 에 프로세스 로그 저장 (0) | 2023.04.07 |
[AWS-Server] 4. 람다 코드 수정 - dynamoDB 테이블 수정 (0) | 2023.04.04 |
[AWS-Server] 3. 람다함수에 Cloudwatch EventBridge 연결 (0) | 2023.04.02 |
[AWS-Server] 2. EC2에서 python 으로 dynamoDB Table, SSM Parameter Store 읽기 (0) | 2023.03.31 |