인프런 커뮤니티 질문&답변

dukim님의 프로필 이미지
dukim

작성한 질문수

비트코인 알고리즘 트레이딩 봇 개발

부분 매수로 인한 check_open_cnt 문제

작성

·

159

0

check_open_cnt 함수를 보면 

if round(float(check_data),0) == round(float(data),0):

부분이 있는데 부분 매수가 일어나면 check_data가 달라져서 제대로된 index 값을 리턴을 안합니다.

금액이 크지도 않고 10만원 단위인데도 이런 현상이 발생합니다.

(백테스팅 시엔 문제 없음.. 하루종일 매수 자체가 없길래 왜 안되나 봤더니 위와 같은 문제가 있네요.)

결국 손절 or 익절이 이뤄져야지만 다시 정상 동작 합니다.

이 부분을 아래와 같이 바꾸는건 어떤가요?

if round(float(check_data),0) <= round(float(data),0):

 

5000원 이하건에 대해 "이익 실현 주문"과 "손실 최소화 주문"을 진행하지 않도록 하기 위해 아래 코드를 추가했습니다.

if float(buy_amt) * now_price < 5000:

                    continue

 

 

stop_loss 함수에서 아래 코드도 수정되어야 하네요.

아래 코드는 소수점 넷째자리에서 반올림되서 잔고 부족 에러 메시지가 나오네요.

버림 처리하는게 맞는거 같습니다.

trade_amt = "{:0.0{}f}".format(float(buy_amt), 4)  # 소수점 넷째자리

->

trade_amt = "{:0.0{}f}".format(math.trunc(float(buy_amt)*10000)/10000, 4)  # 소수점 넷째자리

 

 

 

아니면 더 좋은 방법 있을까요?

답변 1

0

멀티코어님의 프로필 이미지
멀티코어
지식공유자

안녕하세요 김동억님.

 

check_open_cnt함수는 get_buy_amt_list함수와 같이 사용됩니다.

get_buy_amt_list함수는 buy_amt_unit, buy_cnt_limit, increace_rate 세 개의 인수를 입력 받아서

단계별 구매 수량을 계산하고 buy_amt_list 변수에 저장해서 반환합니다.

예를들어 buy_amt_list에 [0.0, 4.5, 9.9, 16.38, 24.156, 33.4872, 44.6846, 58.1215]와 같이 저장될 수 있습니다.

그리고 check_open_cnt함수는 다음에는 몇개의 코인을 구매해야 하는지 찾아줍니다. 예를들어 지금까지 24.156개의 코인을 구매했다면, 다음에는 33.4872개의 코인을 구매할 수 있도록 배열의 인덱스를 반환해 줍니다.

 

만일 김동억님께서 작성한 코드에서 함수가 정상적으로 동작하지 않는다면, get_buy_amt_list 함수의 buy_amt = round(buy_amt + temp_amt, 4) 부분에서 오류가 발생할 소지가 있습니다. 거래하시는 코인의 구매 단위가 소수점 2자리라면 구매할 때 소수점 2자리까지 반올림해야 합니다. 그러면 실제로 구매한 수량과 buy_amt_list 배열에 저장된 수량이 달라지게 됩니다. buy_amt_list 배열에는 소수점 4자리까지 들어있기 때문에 반올림하는 과정에서 숫자가 달라질 수 있습니다. 이런 오류를 방지하기 위해 if round(float(check_data),0) == round(float(data),0)와 같이 반올림해서 비교했는데, 모든 케이스를 커버하지 못하는 것 같습니다. 

따라서, 오류가 발생하신다면 거래하시는 코인에서 지원하는 거래단위 소수점 자리수와 get_buy_amt_list함수에 있는 반올림 자리수를 맞춰주는게 좋습니다.

 

나머지 코드는 김동억님께서 제안해주신데로 바꾸셔도될 것 같습니다.

 

감사합니다.

 

dukim님의 프로필 이미지
dukim

작성한 질문수

질문하기