작성
·
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함수에 있는 반올림 자리수를 맞춰주는게 좋습니다.
나머지 코드는 김동억님께서 제안해주신데로 바꾸셔도될 것 같습니다.
감사합니다.