init
This commit is contained in:
96
config.py
96
config.py
@@ -24,60 +24,60 @@ RESISTANCE_LOOKBACK = 120 # 저항선 판단을 위한 과거 캔들 수 (예:
|
||||
RESISTANCE_BREAK_THRESHOLD = 0.01 # 저항선 대비 1% 이상 돌파 시 신호
|
||||
|
||||
KR_COINS = {
|
||||
"ADA": "ADA",
|
||||
"APE": "ApeCoin",
|
||||
"ARB": "Arbitrum",
|
||||
"BONK": "BONK",
|
||||
"ENA": "ETHENA",
|
||||
"HBAR": "HBAR",
|
||||
"KAIA": "KAIA",
|
||||
"LINK": "Chainlink",
|
||||
"ONDO": "ONDO",
|
||||
"PENGU": "Pudgy Penguins",
|
||||
"PEPE": "PEPE",
|
||||
"POL": "POL",
|
||||
"SAND": "Sandbox",
|
||||
"SEI": "SEI",
|
||||
"SHIB": "Shiba Inu",
|
||||
"STORJ": "Storj",
|
||||
"SUI": "Sui Network",
|
||||
"TON": "Toncoin",
|
||||
"TRX": "TRON",
|
||||
"UXLINK": "UXLINK",
|
||||
"VIRTUAL": "Virtuals Protocol",
|
||||
"WLD": "Worldcoin",
|
||||
"XLM": "XLM",
|
||||
"XRP": "XRP"
|
||||
"ADA": "에이다",
|
||||
"APE": "에이프코인",
|
||||
"APT": "앱토스",
|
||||
"ARB": "아비트럼",
|
||||
"BONK": "봉크",
|
||||
"ENA": "에테나",
|
||||
"HBAR": "헤데라",
|
||||
"KAIA": "카이아",
|
||||
"LINK": "체인링크",
|
||||
"ONDO": "온도파이낸스",
|
||||
"PENGU": "펏지 펭귄",
|
||||
"PEPE": "페페",
|
||||
"POL": "폴리곤 에코시스템 토큰",
|
||||
"SEI": "세이",
|
||||
"SHIB": "시바이누",
|
||||
"STORJ": "스토리지",
|
||||
"SUI": "수이",
|
||||
"TON": "톤코인",
|
||||
"TRX": "트론",
|
||||
"UXLINK": "유엑스링크",
|
||||
"VIRTUAL": "버추얼 프로토콜",
|
||||
"WLD": "월드코인",
|
||||
"XLM": "스텔라루멘",
|
||||
"XRP": "엑스알피"
|
||||
}
|
||||
|
||||
KR_COINS_1 = {
|
||||
"ADA": "ADA",
|
||||
"APE": "ApeCoin",
|
||||
"ARB": "Arbitrum",
|
||||
"BONK": "BONK",
|
||||
"ENA": "ETHENA",
|
||||
"HBAR": "HBAR",
|
||||
"KAIA": "KAIA",
|
||||
"LINK": "Chainlink",
|
||||
"ONDO": "ONDO",
|
||||
"PENGU": "Pudgy Penguins",
|
||||
"PEPE": "PEPE",
|
||||
"POL": "POL",
|
||||
"ADA": "에이다",
|
||||
"APE": "에이프코인",
|
||||
"APT": "앱토스",
|
||||
"ARB": "아비트럼",
|
||||
"BONK": "봉크",
|
||||
"ENA": "에테나",
|
||||
"HBAR": "헤데라",
|
||||
"KAIA": "카이아",
|
||||
"LINK": "체인링크",
|
||||
"ONDO": "온도파이낸스",
|
||||
"PENGU": "펏지 펭귄",
|
||||
"PEPE": "페페",
|
||||
}
|
||||
|
||||
KR_COINS_2 = {
|
||||
"SAND": "Sandbox",
|
||||
"SEI": "SEI",
|
||||
"SHIB": "Shiba Inu",
|
||||
"STORJ": "Storj",
|
||||
"SUI": "Sui Network",
|
||||
"TON": "Toncoin",
|
||||
"TRX": "TRON",
|
||||
"UXLINK": "UXLINK",
|
||||
"VIRTUAL": "Virtuals Protocol",
|
||||
"WLD": "Worldcoin",
|
||||
"XLM": "XLM",
|
||||
"XRP": "XRP"
|
||||
"POL": "폴리곤 에코시스템 토큰",
|
||||
"SEI": "세이",
|
||||
"SHIB": "시바이누",
|
||||
"STORJ": "스토리지",
|
||||
"SUI": "수이",
|
||||
"TON": "톤코인",
|
||||
"TRX": "트론",
|
||||
"UXLINK": "유엑스링크",
|
||||
"VIRTUAL": "버추얼 프로토콜",
|
||||
"WLD": "월드코인",
|
||||
"XLM": "스텔라루멘",
|
||||
"XRP": "엑스알피"
|
||||
}
|
||||
|
||||
# 주식 설정
|
||||
|
||||
@@ -12,9 +12,10 @@ def inserData(symbol, interval, data):
|
||||
conn = sqlite3.connect('coins.db')
|
||||
cursor = conn.cursor()
|
||||
|
||||
tableName = "{}_{}".format(symbol, str(interval))
|
||||
# 테이블/키 생성
|
||||
cursor.execute("CREATE TABLE IF NOT EXISTS " + symbol + " (interval text, CODE text, NAME text, ymdhms datetime, ymd text, hms text, Close REAL, Open REAL, High REAL, Low REAL, Volume REAL)")
|
||||
cursor.execute("CREATE INDEX IF NOT EXISTS " + symbol + "_idx on " + symbol + "(interval, CODE, ymdhms)")
|
||||
cursor.execute("CREATE TABLE IF NOT EXISTS {} (CODE text, NAME text, ymdhms datetime, ymd text, hms text, Close REAL, Open REAL, High REAL, Low REAL, Volume REAL)".format(tableName))
|
||||
cursor.execute("CREATE INDEX IF NOT EXISTS {}_idx on {}(CODE, ymdhms)".format(tableName, tableName))
|
||||
|
||||
for i in range(len(data)):
|
||||
ymd = data.index[i].strftime('%Y%m%d')
|
||||
@@ -26,12 +27,12 @@ def inserData(symbol, interval, data):
|
||||
Close = data.Close.iloc[i]
|
||||
Volume = data.Volume.iloc[i]
|
||||
|
||||
cursor.execute("SELECT * from " + symbol + " where CODE = ? and ymdhms = ? and interval = ?", (symbol, ymdhms, interval))
|
||||
cursor.execute("SELECT * from {} where CODE = ? and ymdhms = ?".format(tableName), (symbol, ymdhms, ))
|
||||
arr = cursor.fetchone()
|
||||
if arr:
|
||||
cursor.execute("UPDATE " + symbol + " SET Close=?, Open=?, High=?, Low=?, Volume=? where CODE=? and ymdhms=? and interval=?", (Close, Open, High, Low, Volume, symbol, ymdhms, interval))
|
||||
cursor.execute("UPDATE {} SET Close=?, Open=?, High=?, Low=?, Volume=? where CODE=? and ymdhms=?".format(tableName), (Close, Open, High, Low, Volume, symbol, ymdhms))
|
||||
else:
|
||||
cursor.execute("INSERT INTO " + symbol + " (interval, CODE, NAME, ymdhms, ymd, hms, Close, Open, High, Low, Volume) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (interval, symbol, KR_COINS[symbol], ymdhms, ymd, hms, Close, Open, High, Low, Volume))
|
||||
cursor.execute("INSERT INTO {} (CODE, NAME, ymdhms, ymd, hms, Close, Open, High, Low, Volume) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)".format(tableName), (symbol, KR_COINS[symbol], ymdhms, ymd, hms, Close, Open, High, Low, Volume))
|
||||
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
@@ -44,9 +45,16 @@ def download():
|
||||
|
||||
# 1시간
|
||||
interval = 60
|
||||
|
||||
data = monitorCoin.get_coin_more_data(symbol, interval, bong_count=10000)
|
||||
if data is not None and not data.empty:
|
||||
try:
|
||||
inserData(symbol, interval, data)
|
||||
except Exception as e:
|
||||
print(f"Error processing data for {symbol}: {str(e)}")
|
||||
|
||||
# 5분
|
||||
interval = 5
|
||||
data = monitorCoin.get_coin_more_data(symbol, interval, bong_count=10000)
|
||||
if data is not None and not data.empty:
|
||||
try:
|
||||
inserData(symbol, interval, data)
|
||||
|
||||
@@ -311,14 +311,14 @@ class Monitor:
|
||||
pass
|
||||
|
||||
current_time = datetime.now()
|
||||
if data['sell_signal'].iloc[-1] == 'fall_6p':
|
||||
if data['signal'].iloc[-1] == 'fall_6p':
|
||||
if data['Close'].iloc[-1] > 100:
|
||||
buy_amount = 500000
|
||||
else:
|
||||
buy_amount = 300000
|
||||
|
||||
if symbol in self.buy_cooldown and symbol in self.last_sell_signal:
|
||||
if self.last_sell_signal[symbol] == 'fall_6p':
|
||||
if symbol in self.buy_cooldown and symbol in self.last_signal:
|
||||
if self.last_signal[symbol] == 'fall_6p':
|
||||
time_diff = current_time - self.buy_cooldown[symbol]
|
||||
if time_diff.total_seconds() < 4000:
|
||||
print(f"{symbol}: 매수 금지 중 (남은 시간: {600 - time_diff.total_seconds():.0f}초)")
|
||||
@@ -331,20 +331,20 @@ class Monitor:
|
||||
return False
|
||||
|
||||
buy_amount = 5100
|
||||
if data['sell_signal'].iloc[-1] == 'movingaverage':
|
||||
if data['signal'].iloc[-1] == 'movingaverage':
|
||||
buy_amount = 30000
|
||||
elif data['sell_signal'].iloc[-1] == 'deviation40':
|
||||
elif data['signal'].iloc[-1] == 'deviation40':
|
||||
buy_amount = 50000
|
||||
elif data['sell_signal'].iloc[-1] == 'deviation240':
|
||||
elif data['signal'].iloc[-1] == 'deviation240':
|
||||
buy_amount = 6000
|
||||
elif data['sell_signal'].iloc[-1] == 'deviation1440':
|
||||
elif data['signal'].iloc[-1] == 'deviation1440':
|
||||
if symbol in ['BONK', 'PEPE', 'TON']:
|
||||
buy_amount = 20000
|
||||
else:
|
||||
buy_amount = 30000
|
||||
# heikin_ashi 조건 제거 완료
|
||||
|
||||
if data['sell_signal'].iloc[-1] in ['movingaverage', 'deviation40', 'deviation240', 'deviation1440']:
|
||||
if data['signal'].iloc[-1] in ['movingaverage', 'deviation40', 'deviation240', 'deviation1440']:
|
||||
if check_5_week_lowest:
|
||||
buy_amount *= 4
|
||||
|
||||
@@ -353,14 +353,14 @@ class Monitor:
|
||||
if self.cooldown_file is not None:
|
||||
# 최근 매수 신호를 함께 기록하여 [신규] 포맷으로 저장
|
||||
try:
|
||||
self.last_sell_signal[symbol] = str(data['sell_signal'].iloc[-1])
|
||||
self.last_signal[symbol] = str(data['signal'].iloc[-1])
|
||||
except Exception:
|
||||
self.last_sell_signal[symbol] = ''
|
||||
self.last_signal[symbol] = ''
|
||||
self.buy_cooldown[symbol] = current_time
|
||||
self._save_buy_cooldown()
|
||||
|
||||
print(f"{KR_COINS[symbol]} ({symbol}) [{data['sell_signal'].iloc[-1]}], 현재가: {data['Close'].iloc[-1]:.4f}, 20분간 매수 금지 시작")
|
||||
self.sendMsg("[KRW-COIN]" + "\n" + self.format_message('COIN', symbol, KR_COINS[symbol], data['Close'].iloc[-1], data['sell_signal'].iloc[-1]))
|
||||
print(f"{KR_COINS[symbol]} ({symbol}) [{data['signal'].iloc[-1]}], 현재가: {data['Close'].iloc[-1]:.4f}, 20분간 매수 금지 시작")
|
||||
self.sendMsg("[KRW-COIN]" + "\n" + self.format_message('COIN', symbol, KR_COINS[symbol], data['Close'].iloc[-1], data['signal'].iloc[-1]))
|
||||
except Exception as e:
|
||||
print(f"Error buying {symbol}: {str(e)}")
|
||||
return False
|
||||
@@ -521,16 +521,12 @@ class Monitor:
|
||||
conn = sqlite3.connect('coins.db')
|
||||
cursor = conn.cursor()
|
||||
for i in range(1, len(data)):
|
||||
cursor.execute(
|
||||
"SELECT * from " + symbol + " where CODE = ? and ymdhms = ? and interval = ?",
|
||||
(symbol, data['datetime'].iloc[-i].strftime('%Y-%m-%d %H:%M:%S'), interval),
|
||||
)
|
||||
cursor.execute("SELECT * from {}_{} where CODE = ? and ymdhms = ?".format(symbol, str(interval)), (symbol, data['datetime'].iloc[-i].strftime('%Y-%m-%d %H:%M:%S')),)
|
||||
arr = cursor.fetchone()
|
||||
if not arr:
|
||||
cursor.execute(
|
||||
"INSERT INTO " + symbol + " (interval, CODE, NAME, ymdhms, ymd, hms, close, open, high, low, volume) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||
"INSERT INTO {}_{} (CODE, NAME, ymdhms, ymd, hms, close, open, high, low, volume) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)".format(symbol, interval),
|
||||
(
|
||||
interval,
|
||||
symbol,
|
||||
KR_COINS[symbol],
|
||||
data['datetime'].iloc[-i].strftime('%Y-%m-%d %H:%M:%S'),
|
||||
@@ -545,11 +541,7 @@ class Monitor:
|
||||
)
|
||||
else:
|
||||
break
|
||||
cursor.execute(
|
||||
"select * from (SELECT Open,Close,High,Low,Volume,ymdhms as datetime from "
|
||||
+ symbol
|
||||
+ " order by ymdhms desc limit 7000) subquery order by datetime"
|
||||
)
|
||||
cursor.execute("select * from (SELECT Open,Close,High,Low,Volume,ymdhms as datetime from {}_{} order by ymdhms desc limit 7000) subquery order by datetime".format(symbol, str(interval)))
|
||||
result = cursor.fetchall()
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
@@ -2,7 +2,7 @@ from datetime import datetime
|
||||
import time
|
||||
from config import *
|
||||
|
||||
from monitor_1h import Monitor
|
||||
from monitor import Monitor
|
||||
|
||||
class MonitorCoin (Monitor):
|
||||
"""자산(코인/주식/ETF) 모니터링 및 매수 실행 클래스"""
|
||||
|
||||
@@ -2,7 +2,7 @@ from datetime import datetime
|
||||
import time
|
||||
from config import *
|
||||
|
||||
from monitor_1h import Monitor
|
||||
from monitor import Monitor
|
||||
|
||||
class MonitorCoin (Monitor):
|
||||
"""자산(코인/주식/ETF) 모니터링 및 매수 실행 클래스"""
|
||||
|
||||
@@ -2,7 +2,7 @@ from datetime import datetime
|
||||
import time
|
||||
from config import *
|
||||
|
||||
from monitor_1h import Monitor
|
||||
from monitor import Monitor
|
||||
|
||||
class MonitorCoin (Monitor):
|
||||
"""자산(코인/주식/ETF) 모니터링 및 매수 실행 클래스"""
|
||||
|
||||
@@ -5,7 +5,7 @@ import schedule
|
||||
from config import *
|
||||
import FinanceDataReader as fdr
|
||||
|
||||
from monitor_1h import Monitor
|
||||
from monitor import Monitor
|
||||
|
||||
class MonitorStock (Monitor):
|
||||
"""자산(코인/주식/ETF) 모니터링 및 매수 실행 클래스"""
|
||||
|
||||
@@ -9,7 +9,7 @@ plt.rcParams['font.family'] ='AppleGothic'
|
||||
plt.rcParams['axes.unicode_minus'] =False
|
||||
|
||||
from config import *
|
||||
from monitor_1h import Monitor
|
||||
from monitor import Monitor
|
||||
|
||||
|
||||
class Simulation:
|
||||
|
||||
Reference in New Issue
Block a user