Add files via upload
This commit is contained in:
@@ -244,9 +244,23 @@ PATTERN_PRIORITY = {
|
|||||||
# UTILITY FUNCTIONS
|
# UTILITY FUNCTIONS
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
|
def broker_now():
|
||||||
|
"""Return current broker server time. MT5 timestamps interpreted as UTC = broker time."""
|
||||||
|
return datetime.utcnow()
|
||||||
|
|
||||||
|
|
||||||
|
def broker_time(ts):
|
||||||
|
"""Convert a Unix timestamp (from MT5) to broker server time.
|
||||||
|
|
||||||
|
MT5 brokers encode their server time directly in the timestamps,
|
||||||
|
so datetime.utcfromtimestamp() returns the broker's clock time.
|
||||||
|
"""
|
||||||
|
return datetime.utcfromtimestamp(int(ts))
|
||||||
|
|
||||||
|
|
||||||
def log_message(msg, cfg=None):
|
def log_message(msg, cfg=None):
|
||||||
"""Print and log a message. Strips ANSI colour codes for log file."""
|
"""Print and log a message. Strips ANSI colour codes for log file."""
|
||||||
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
timestamp = broker_now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
line = f"[{timestamp}] {msg}"
|
line = f"[{timestamp}] {msg}"
|
||||||
print(line)
|
print(line)
|
||||||
clean_line = re.sub(r'\x1b\[[0-9;]*m', '', line)
|
clean_line = re.sub(r'\x1b\[[0-9;]*m', '', line)
|
||||||
@@ -1224,7 +1238,7 @@ def scan_patterns(rates, cfg=None, d1_rates=None, tf_label='H4', htf_atr_rates=N
|
|||||||
|
|
||||||
_ct = curr['time']
|
_ct = curr['time']
|
||||||
if isinstance(_ct, (int, float, np.integer, np.floating)):
|
if isinstance(_ct, (int, float, np.integer, np.floating)):
|
||||||
hour = datetime.fromtimestamp(int(_ct)).hour
|
hour = broker_time(int(_ct)).hour
|
||||||
elif hasattr(_ct, 'hour'):
|
elif hasattr(_ct, 'hour'):
|
||||||
hour = _ct.hour
|
hour = _ct.hour
|
||||||
else:
|
else:
|
||||||
@@ -1348,7 +1362,7 @@ def format_pattern_output(candle, patterns, cfg=None, stats=None, tf_label='H4')
|
|||||||
if stats is None: stats = {}
|
if stats is None: stats = {}
|
||||||
ct = candle['time']
|
ct = candle['time']
|
||||||
if isinstance(ct, (int, float, np.integer, np.floating)):
|
if isinstance(ct, (int, float, np.integer, np.floating)):
|
||||||
ct = datetime.fromtimestamp(int(ct))
|
ct = broker_time(int(ct))
|
||||||
time_str = ct.strftime("%Y-%m-%d %H:%M:%S") if hasattr(ct, 'strftime') else str(ct)
|
time_str = ct.strftime("%Y-%m-%d %H:%M:%S") if hasattr(ct, 'strftime') else str(ct)
|
||||||
bt = max(candle['open'], candle['close'])
|
bt = max(candle['open'], candle['close'])
|
||||||
bb = min(candle['open'], candle['close'])
|
bb = min(candle['open'], candle['close'])
|
||||||
@@ -2387,7 +2401,7 @@ def run_scanner(cfg=None):
|
|||||||
|
|
||||||
bar_time = rates[-1]['time']
|
bar_time = rates[-1]['time']
|
||||||
if isinstance(bar_time, (int, float, np.integer, np.floating)):
|
if isinstance(bar_time, (int, float, np.integer, np.floating)):
|
||||||
bar_time = datetime.fromtimestamp(int(bar_time))
|
bar_time = broker_time(int(bar_time))
|
||||||
|
|
||||||
if last_candle_time[tf_label] is None:
|
if last_candle_time[tf_label] is None:
|
||||||
last_candle_time[tf_label] = bar_time
|
last_candle_time[tf_label] = bar_time
|
||||||
@@ -2539,7 +2553,7 @@ def run_quick_backtest(num_bars=500, cfg=None):
|
|||||||
pattern_counts[p['name']] = pattern_counts.get(p['name'], 0) + 1
|
pattern_counts[p['name']] = pattern_counts.get(p['name'], 0) + 1
|
||||||
ct = candle['time']
|
ct = candle['time']
|
||||||
if isinstance(ct, (int, float, np.integer, np.floating)):
|
if isinstance(ct, (int, float, np.integer, np.floating)):
|
||||||
ct = datetime.fromtimestamp(ct)
|
ct = broker_time(int(ct))
|
||||||
all_detections.append({
|
all_detections.append({
|
||||||
'Timeframe': tf_label,
|
'Timeframe': tf_label,
|
||||||
'DateTime': ct, 'Pattern': p['name'],
|
'DateTime': ct, 'Pattern': p['name'],
|
||||||
|
|||||||
Reference in New Issue
Block a user