오늘은 트레이딩뷰에서 내가 만든 지표로 백테스트를 진행하고 승률을 확인 후, 롱/숏 시그널을 파이썬으로 보내서 자동 매매를 해보는 파이프라인을 구축해보도록하겠다.

 

 

지난 단계에서는 파이썬 선물매매 스크립트 모듈화까지 진행해보았다.

함수와 전략클래스를 다른 파일로 모듈화하여 관리하기 편하게 만들었다.

 

그런데 한 가지 문제점은 서버코드에서는 웹훅메시지가 모듈화했을 때 모듈파일로부터 변수가 잘 받아져왔는데, 다른 파일에서는 해당 웹훅메시지를 담은 변수가 None값이 되었다. 오늘은 이유와 해결까지 추가로 병행해보았다.

 

 

< 지난 포스팅 >

 

https://jayindustry.tistory.com/76

 

#10 [바이낸스 선물] 모듈화, 파일관리

오늘은 모듈화와 코드파일 관리로 트레이딩봇 사용시, 더 체계적으로 코드와 데이터를 관리할 수 있게 만들어보았다. 그리고 웹훅메시지를 모듈을 이용하여 가져왔다. 저번 단계까지는 라우터

jayindustry.tistory.com

 

 

 

 

 

[ 개요 ]

 

1. 트레이딩뷰 내 전략 백테스트

2. 웹훅메시지 변수 None값 해결하기

3. 트레이딩뷰 롱/숏시그널과 연동하여 자동 롱/숏 진입하기

 

 

 

 

 

 

[ 내용 ]

 

1. 트레이딩뷰 내 전략 백테스트

 

나의 전략은 크게 두 파트로 나뉜다.

 

 

조건 1. 비트코인 대장주 추세에 따른 롱/숏 스위칭

조건 2. 지표를 복합적으로 활용한 롱 시그널

 

조건 1.

먼저 비트코인이 안정적으로 횡보하거나 상승장 + 비트코인 도미넌스가 낮아지거나 횡보할 땐 

"롱"포지션,

그 반대엔 "숏"포지션만 들어간다.

 

양방향매매는 아직 안해봤지만 점차 실력이 늘어나면 이 전략도 고려해보려고 한다.

 

 

 

조건2.

트레이딩뷰에서는 전세계사람들의 다양한 지표들을 공유할 수 있다.

이들의 지표들을 복합적으로 섞어 나만의 지표를 만들 수 있다.

나의 전략_1 에서 활용된 지표리스트는 다음과 같다.

 

 

 

진입조건)

여기서 1), 6) 지표가 롱 시그널이 뜨고, 5) MFT가 50이하이면 롱 포지션을 진입하고

그 반대엔 숏포지션을 진입한다.

 

 

종료조건)

그리고 수익률이 0.15%초과 + MFT가 70이 초과되면 롱포지션을 종료하고

만약 수익률이 0.4%가 넘어가면 종료하는 두 가지 TakeProfit조건을 추가하였다.

 

StopLoss는 -0.5%의 손실률이 넘어가면 종료하기로 했다.

 

( 트레이딩뷰는 PindScript 언어를 지원하여 파이썬을 주로 사용하는 나에겐 아직은 어려운 부분이 있다. )

 

 

 

 

백테스팅 결과

 

 

이건 20000불 기준, BTC/USDT 5분봉 결과이다.

34일에 걸친 백테스팅 결과이다.

 

다른 알트들도 5%~ 25%정도의 준수한 수익률을 보였다.

아래는 AAVE코인 백테스팅 결과이다.

 

 

 

 

 

 

[ 분석 ]

 

약 34~40일의 짧은 기간의 데이터라 승률에 대한 정확도는 떨어질 것이다.

상승장에 롱포지션만 진입해서 그나마 준수하게 나온 것 같다.

여기서 숏포지션을 추가하면 50%이하로 낮게 나온다.

 

승률이 60~70%가 되었다고 이게 실제 승률은 아니다.

절대 자만해서는 안된다.

 

시장이 변동할때마다 언제든 30%로 곤두박질 칠 수 있고,

여기서의 백테스팅은 실제시장 매매의 승률과 많이 다르다고 한다.

 

 

 

백테스팅은 백테스팅일뿐..!

 

 

 

 

2. 웹훅메시지 변수 None값 해결하기

 

 

문제점

 

저번 포스팅에서의 피드백 내용 중, 서버에서 모듈파일로 메시지를 보내 변수로 저장 후, 그 모듈의 메시지변수를 다른 스크립트로 가져왔을 때 None값이 떴다.

 

이상하게 서버에서 모듈파일의 메시지변수로 저장후 다시 서버로 가져와 출력하면 제대로 메시지가 나왔는데, 다른 스크립트에서 가져다쓸땐 None값이 나왔다.

 

 

원인를 분석하고 해결방법을 모색해보았다.

 

 

 

 

원인 

스크립트는 총 3개이다.

Flask 서버와 bot_module(웹훅메시지,지표함수를 포함한 모듈), 실행 스크립트

파이썬에서는 각 스크립트 또는 프로세스가 모듈의 '별도 인스턴스'를 가지는데,

이는 각 프로세스가 모듈의 복사본을 별도로 유지한다는 의미이다.

 

 Flask 서버가 동작하는 프로세스와 실행 스크립트에서 bot_module을 사용하는데,

이 두 프로세스는 bot_module이라는 동일한 모듈을 사용하더라도 서로 다른 인스턴스를 갖게 된다.

 

즉, 서로 다른 인스턴스를 가진다는것이다.

따라서 모듈화를 할 땐, 아래와 같은 특성을 지닌다.



독립적인 메모리 공간

각 프로세스는 자체 메모리 공간을 가지고 있으며, 한 프로세스에서 모듈의 변수나 객체를 수정해도 다른 프로세스의 해당 모듈에는 영향을 주지 않습니다.



변수 및 객체의 독립성

예를 들어, Flask 서버에서 bot_module의 특정 변수를 변경하면, 그 변경사항은 Flask 서버 내에서만 적용된다.

다른 스크립트에서 실행되는 bot_module 인스턴스는 이 변경사항을 반영하지 않는다.

이로 인해, 서로 다른 프로세스 간에 데이터를 공유하고자 할 때 문제가 발생합니다. 이 문제를 해결하기 위해서는 공유 데이터베이스, 파일 시스템, 또는 메모리 내 데이터 공유 메커니즘(예: Redis)과 같은 방법을 사용하여 데이터를 공유해야 합니다. 이러한 방법을 사용하면 서로 다른 프로세스 간에 데이터를 동기화하고 공유할 수 있습니다.

 



[ 해결방안 ]

두 가지 해결방안을 모색해보았다.

 

1. 자동매매 실행 스크립트에서 requests모듈을 이용하여 서버스크립트의 변수를 가져오는 방법

2. bot_module의 변수의 내용을 csv파일에 임시저장 후 불러다가 사용하는 방법, 혹은 서버코드에서 로그파일에 메시지가 저장되니까 그 로그파일의 최신메시지를 읽어오는 방법.

 

 

저장메모리나 데이터베이스를 사용하지 않고 최신메시지를 신속히 전달 받기위해 1번방법 위주로 해결을 해보려고 한다.

 

 

 

먼저 서버코드에서 다른스크립트로 메시지 Data를 던져주는 api 엔드포인트 함수를 만든다.

 

 

매매 실행스크립트에서 requests.get메서드로 저 current_data변수를 받아온다.

 

 

이 때 서버,클라이언트 코드가 하나의 로컬환경에 있으니,

url은 주석처럼 외부Ip:외부포트 혹은 내부ip:내부포트로 접근 가능하다.

 

 

 

 

[ 결과 ]

 

서버코드에서의 결과 ( 웹훅메시지를 받고 다른 스크립트로 출력 )

 

 

 

 

클라이언트 스크립트에서 결과 (매매 실행 스크립트)

 

 

 

 

트레이딩 뷰에서 test244 라고 웹훅 메시지를 보냈는데 파이썬 서버,클라이언트 스크립트로 모두 잘 전달되어 들어왔다.

 

(단, 내부ip는 내 노트북 와이파이를 다른 와이파이로 연결해제 및 연결해버리면 변동될 수 있다.)

 

 

 

 

 

 

3. 트레이딩뷰 롱/숏시그널과 연동하여 자동 롱/숏 진입하기

 

이제 전체적인 파이프라인이 거의 완성되어간다.

이제 다음 단계에서 롱/숏 시그널을 받아 해당 메시지에 따라 내가 만든 자동매매를 실행시킨다.

 

 

 

 

+ Recent posts