목차
Webhook IP 등록
- Webhook을 사용하기 위해서 TradingView의 공식 사이트를 참고한 결과, 다음 아이피에서 POST 요청을 보낸다는 것을 알 수 있었습니다.
- 52.89.214.238
- 34.212.75.30
- 54.218.53.128
- 52.32.178.7
- 참고 : https://www.tradingview.com/support/solutions/43000529348-about-webhooks/
- 애플리케이션과 소통하기 위해서는 해당 IP를 허용해주어야 합니다. middleware를 통해 허용된 IP인지 확인하는 코드를 추가해 주었습니다.
-
ALLOWED_IPS = {"52.89.214.238", "34.212.75.30", "54.218.53.128", "52.32.178.7"} @app.middleware("http") async def ip_filter_middleware(request: Request, call_next): client_ip = request.client.host if client_ip not in ALLOWED_IPS: raise HTTPException(status_code=403, detail="IP Address not allowed") response = await call_next(request) return response
-
포트포워딩(port forwarding) 설정
포트포워딩이란?
- 우선 포트포워딩에 대해 알기 전에 외부 IP와 내부 IP의 차이에 대해서 알아야 합니다. 추가적으로 포트 번호에 대한 개념도 살펴보겠습니다.
- 외부 IP 주소(Public IP Address)
- 이 주소는 인터넷상에서 현재 나의 네트워크를 식별하는 주소입니다.
- 내부 IP 주소(Private IP Address)
- 이 주소는 로컬 네트워크 내에서만 유효합니다.
- 예를 들어, 집이나 사무실 내의 네트워크에서 컴퓨터, 스마트폰, 태블릿 등은 각기 다른 내부 IP 주소를 가집니다.
- 이 주소는 외부 인터넷에서는 보이지 않으며, 일반적으로 "192.168.xxx.xxx", "10.xxx.xxx.xxx", "172.16.xxx.xxx" 범위에 속합니다.
- 만약 같은 공유기를 사용하는 노트북 1, 노트북 2, 데스크톱 1, 스마트폰 1 이 있다고 하면, 이 각각의 장치들은 고유한 내부 IP 주소를 가지게 됩니다. (외부 IP 주소는 모두 같습니다. 공유기가 네트워크의 나머지 부분과의 통신을 중계하며, 외부네트워크에는 외부 IP 주소만 보이게 하기 때문입니다.)
- 포트 번호
- 네트워크에서 IP 주소가 컴퓨터나 장치를 식별하는 데 사용된다면, 포트 번호는 그 장치 내에서 실행 중인 특정 서비스나 애플리케이션을 식별하는 데 사용됩니다.
- 포트 번호도 외부 포트 번호가 있고, 내부 포트 번호가 존재합니다.
- 예시를 통한 이해
- 택배물품 보관함이 있는 아파트 단지를 생각해 보도록 하겠습니다.
- 만약 102동 702호에 사는 사람이 택배를 받아야 하는 상황이라고 합니다. 이럴 경우 택배물품 보관함 45번에 택배를 받겠다고 아파트 관리실에 등록을 해두면 102동 702호에 사는 사람은 택배 물품 보관함 45번을 통해서 택배를 계속해서 받아볼 수 있습니다.
- 아파트 동 : 내부 IP 주소
- 아파트 호수 : 내부 포트 번호
- 택배물품 보관소 : 외부 IP 주소
- 택배물품 보관함 번호 : 외부 포트 번호
- 택배 : 네트워크 트래픽
- 택배 물품 보관함에 여러 세대가 지정될 경우, 어느 세대로 택배를 배달할지 혼란스럽기 때문에 하나의 택배 물품 보관함에는 하나의 세대만 지정이 가능합니다. 하지만 반대로 하나의 세대는 여러 개의 택배 물품보관함을 지정이 가능합니다. 어디로 오든 집으로 들어올 수 있기 때문입니다.
- 외부 IP 주소(Public IP Address)
- 이제 위의 예시를 이해했다면, 포트포워딩의 개념도 손쉽게 이해할 수 있습니다.
- 위의 예시에서 포트포워딩은 특정세대가 택배를 받기 위해 택배물품 보관함 번호를 선정하는 작업입니다.
- 정확한 개념은 인터넷에서 들어오는 트래픽(데이터)을 특정 네트워크 장치(예: 라우터)에서 내부 네트워크의 특정 컴퓨터나 서버로 전달하는 과정입니다.
포트포워딩 설정
- 먼저 공유기 설정 페이지에 접속합니다. (유플러스 공유기 기준 : 192.168.219.1 url 입력)
- DHCP 고정 할당을 통해서 내 컴퓨터의 내부 IP 주소를 변경되지 않도록 고정해 줍니다.
- 기기가 다시 연결되거나 할 경우 내부 IP 주소가 변경될 수 있습니다. 변경되지 않도록 DHCP 고정할당을 해주는 것입니다.
- DHCP 고정 할당은 각 장치의 고유 식별자인 MAC 주소를 DHCP 서버에 등록하고, 이 MAC 주소에 고정 내부 IP를 할당하는 것입니다. (MAC 주소는 기기별로 부여된 고유한 주소입니다.)
- 그 후 포트포워딩 창으로 접속하여 서비스 포트(외부 포트)와 내부 IP 주소, 내부 포트를 입력해 주어 포트포워딩 설정을 완료합니다.(내부 IP 주소는 DHCP 고정 할당을 통해 현재 기기에 고정 할당된 내부 IP 주소입니다.)
- ComDon 프로그램에서는 내부포트번호를 8000번을 이용할 것입니다. http를 통한 외부 접속은 외부포트 80이 기본값이므로 외부 포트번호는 80, 내부 포트 번호는 8000으로 설정해 주면 됩니다.
Webhook 테스트
- 포트포워딩 설정이 끝났다면 간단한 alert를 발생시키는 코드를 작성한 뒤 테스트를 진행합니다.
- main.py 코드
-
from fastapi import FastAPI, Request, HTTPException from contextlib import asynccontextmanager import uvicorn @asynccontextmanager async def lifespan(app: FastAPI): print("서버접속") yield print("서버종료") app = FastAPI(lifespan=lifespan) ALLOWED_IPS = { "127.0.0.1", # 테스트용 "52.89.214.238", "34.212.75.30", "54.218.53.128", "52.32.178.7", } @app.middleware("http") async def ip_filter_middleware(request: Request, call_next): client_ip = request.client.host if client_ip not in ALLOWED_IPS: raise HTTPException(status_code=403, detail="IP Address not allowed") response = await call_next(request) return response @app.post("/webhook") async def webhook(request: Request): alert_message = await request.body() alert_message_str = alert_message.decode("utf-8") print(alert_message_str) return {"message": "Received"} if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)
-
- Pine Script 코드
-
//@version=5 //@strategy_alert_message {{strategy.order.alert_message}} strategy("Strategy using `alert_message`") r = ta.rsi(close, 20) // Detect crosses. xUp = ta.crossover( r, 50) xDn = ta.crossunder(r, 50) // Place order on crosses using a custom alert message for each. if xUp strategy.entry("Long", strategy.long, stop = high, alert_message = "up 테스트") else if xDn strategy.entry("Short", strategy.short, stop = low, alert_message = "down 테스트") plotchar(xUp, "Go Long", "▲", location.bottom, color.lime, size = size.tiny) plotchar(xDn, "Go Short", "▼", location.top, color.red, size = size.tiny) hline(50) plot(r)
- 빈번한 테스트를 위하여 1초 차트에서 alert를 발생시켜 테스트를 진행합니다.
-
- alert 설정
- alert 설정이 완료된 후 테스트를 진행해 봤을 때 정상적으로 up 테스트, down 테스트 메시지가 print 된다면, webhook 설정이 완료된 것입니다.
'Algorithm Trading > ComDon 프로그램 개발이야기' 카테고리의 다른 글
6. .env 파일 작성 (0) | 2024.01.21 |
---|---|
5. 주문딜레이 시간 체크 / 비동기 처리의 장점 (1) | 2024.01.09 |
4. CCXT 라이브러리 (0) | 2023.12.30 |
2. TradingView PineScript (0) | 2023.12.23 |
1. ComDon 자동매매 프로그램 계획 (2) | 2023.12.22 |