ð±ãè¡æãããã«ãããã¯åç58%ïŒã§ãããã«ããã ã¯51%...売ãã®æ¹ã匷ãçç±
ðãããã«ãããã§ãšã³ããªãŒããã®ã«è² ããã
æ£çŽã«èšããŸãã
ç§ããã£ãŒããã¿ãŒã³ãããªããšãªãã䜿ã£ãŠãŸããã
ãããããã«ãããã£ãœã圢ïŒå£²ãã ïŒãâ æåã ð ãããã«ããã 宿ïŒè²·ãã ïŒãâ ãŸãæåã ðð ãä»åºŠããæç§æžéãïŒãâ ããã· ððð
ããã£ãŒããã¿ãŒã³ãšãããéœåžäŒèª¬ãä¿¡ãã俺ããã«ã ã£ãïŒã
ããæã£ãŠãææããããŸãããð
ã§ããããæ¥ãµãšæã£ããã§ãã
ãåŸ ãŠã...æ¬åœã«ããã«ãããã¯åãŠãªãã®ãïŒããŒã¿ã§æ€èšŒããããšãããïŒã
ããã§1,210ãã¿ãŒã³ãèªåæ€åºããŠåæããçµæ...
è¡æã®äºå®ã倿ããŸããã
仿¥ããã®çå®ããã¹ãŠå ¬éããŸãã ð¥
ð¯ ãã®èšäºã§å€æããããš
ããã£ãŒããã¿ãŒã³ã¯æ¬åœã«åãŠãã®ãïŒããããŒã¿ã§å®å šè§£æïŒ
- ð MT5ãã3äžæ¬ä»¥äžã®5åè¶³ããŒã¿ãåæ
- ð ããã«ãããã»ããã«ããã ãèªåæ€åº
- â±ïž 30ååŸã240ååŸã®å€åãã远跡
- ð¥ ãã©ãã£ãªãã£å¥ã«çµæãæ¯èŒïŒ
çµè«ãå ã«èšã£ã¡ãããŸã... ð€«
ããã«ãããïŒå£²ãïŒâ é«ãã©æåç58.8%ïŒäœ¿ããïŒïŒ
ããã«ããã ïŒè²·ãïŒâ åç51%ååŸïŒã»ãŒã©ã³ãã ...ïŒ
売ããã¿ãŒã³ã®æ¹ãå§åçã«ä¿¡é Œã§ããïŒ ð±
ããã«ãããã»ããã«ããã ãšã¯ïŒåå¿è ã®æ¹ãž
ããã«ãããïŒå£²ãã·ã°ãã«ïŒ
æ³åããŠãã ãããå±±ãç»ã人ã
äžåºŠå±±é ã«çããŠãéããŠãããäžåºŠåãé«ããŸã§ç»ãããšãããã©...ç»ããªãã
ãããããã«ããããã2åææŠããŠãçªç Žã§ããªãã£ãã= äžæã®éçã瀺åããŸãã
å±±1 å±±2 â§ â§ / \ / \ / \ / \ / \ / \ / ---- \ / ããã¯ã©ã€ã³ â ãã¬ã€ã¯ïŒïŒå£²ãã·ã°ãã«ïŒããã«ããã ïŒè²·ãã·ã°ãã«ïŒ
éã«ãè°·ã2åäœã£ãŠ**ããã以äžäžãããªãã**ã瀺ãã®ãããã«ããã ã
\ ããã¯ã©ã€ã³ â ãã¬ã€ã¯ïŒïŒè²·ãã·ã°ãã«ïŒ \ ---- / \ / \ / \ / \ / \ / \ / âš âš è°·1 è°·2æç§æžçã«ã¯ãä¿¡é Œæ§ã®é«ããã¿ãŒã³ããšãããŠããŸãã
ã§ã...æ¬åœã«åãŠãã®ïŒ ð€
æ€èšŒç°å¢
- Python 3.11- MetaTrader5 (MT5)- pandas, numpy, matplotlib, scipy- é貚ãã¢: USDJPY- æéè¶³: 5åè¶³- ããŒã¿æé: çŽ5ã¶æåïŒ30,000æ¬ïŒ- ã¹ã€ã³ã°ãã€ã³ãå€å®: å·Šå³10æ¬- äŸ¡æ Œèš±å®¹èª€å·®: ATR à 1.5以å
- ãã¿ãŒã³åœ¢ææé: 15ã150æ¬ðš çµæçºè¡šïŒè¡æã®é察称æ§ïŒ
ããã1,210ãã¿ãŒã³ã®æ€èšŒçµæãã芧ãã ãã... ð¥ð¥ð¥
ðŽ ããã«ãããïŒå£²ãïŒ- 569ãã¿ãŒã³æ€åº
| ä¿ææé | å šããŒã¿ | é«ãã©æ ð¥ | äœãã©æ |
|---|---|---|---|
| 30ååŸ | 54.1% | 55.6% | 52.6% |
| 60ååŸ | 55.2% | 58.8% | 51.6% |
| 120ååŸ | 54.7% | 58.8% | 50.7% |
| 240ååŸ | 54.8% | 57.7% | 51.9% |
å¹³åãªã¿ãŒã³: é«ãã©æ +5ã6pips / äœãã©æ +1ã2pips
ð¢ ããã«ããã ïŒè²·ãïŒ- 641ãã¿ãŒã³æ€åº
| ä¿ææé | å šããŒã¿ | é«ãã©æ | äœãã©æ |
|---|---|---|---|
| 30ååŸ | 50.9% | 50.5% | 51.3% |
| 60ååŸ | 51.8% | 53.0% | 50.6% |
| 120ååŸ | 51.5% | 53.9% | 49.1% |
| 240ååŸ | 51.1% | 54.9% | 47.3% |
å¹³åãªã¿ãŒã³: é«ãã©æ +1ã4pips / äœãã©æ -1ã+1pips
ãã®å·®...èŠããŸãããïŒïŒ ð
ð¥ çºèŠ1: ããã«ãããã¯åãŠãïŒ
ããã«ãããïŒå£²ãïŒã®æçžŸãèŠãŠãã ããã
| ææš | é«ãã©æ | è©äŸ¡ |
|---|---|---|
| åçïŒ60åïŒ | 58.8% | åªç§ïŒ ð |
| åçïŒ120åïŒ | 58.8% | å®å®ïŒ |
| å¹³åãªã¿ãŒã³ | +5ã6pips | ååïŒ |
é«ãã©ãã£ãªãã£æã®ããã«ãããã¯ãåç59%è¿ãã§äœ¿ããææ³ïŒ
ããã¯ãåçŽãªãã¬ã€ã¯ã¢ãŠãïŒåç55%çšåºŠïŒããé«ãæ°åã§ãã
ãªãããã«ãããã¯æå¹ãªã®ãïŒ
çç±1: ã2å詊ããŠå€±æãã®å¿ççã€ã³ãã¯ã
1åç®ã®é«å€ã§è²·ã£ã人ãã¡ã2åç®ãåãé«å€ã§è·³ãè¿ããããš...
ããã£ã±ãããã倩äºã...ãâ æåãã®é£é â äŸ¡æ Œäžèœ
çç±2: 倧å£ã®ä»æã
æ©é¢æè³å®¶ã¯ãããã«ãããã®ãããªæç¢ºãªãã¿ãŒã³ã§ãå£²ãæµŽã³ããã仿ããããšããããŸãã
å人æè³å®¶ãããŸãäžããããããšæã£ãŠããéã«ã倧å£ã¯å£²ãããžã·ã§ã³ãæ§ç¯ã
ð çºèŠ2: ããã«ããã ã¯...埮åŠïŒ
è¡æã®äºå®ã§ãã
| ææš | å šããŒã¿ | è©äŸ¡ |
|---|---|---|
| åçïŒ60åïŒ | 51.8% | ã»ãŒã©ã³ãã ... ð± |
| åçïŒ120åïŒ | 51.5% | å€ããã... |
| å¹³åãªã¿ãŒã³ | +0.5ã1pips | ã¹ãã¬ããè² ã... |
ããã«ããã ã¯ãåç51%ã§ã»ãŒã³ã€ã³ãã¹ïŒ
æç§æžã§ã¯ãä¿¡é Œæ§ã®é«ããã¿ãŒã³ããšæžããŠããã®ã«...
ãªãããã«ããã ã¯å¹ããªãã®ãïŒ
çç±1: ãèœã¡ããã€ããåé¡
äžèœãã¬ã³ãäžã«ããã«ããã ã圢æãããŠãããã¬ã³ãã®åã匷ãããŠå転ããªãã
ãåºã ãšæã£ããããŸã åºãããªãã£ãããã¿ãŒã³ã
çç±2: è²·ãã¯é ã
- 売ãïŒããã«ãããïŒ: ææã§äžæ°ã«åã
- è²·ãïŒããã«ããã ïŒ: æ éã«åŸã ã«å ¥ã
ãã®å¿çã®éããããã¿ãŒã³ã®æå¹æ§ã«åœ±é¿ããŠããŸãã
ð ãã©ãã£ãªãã£å¥æ¯èŒ
çºèŠ3: ATRãã£ã«ã¿ãŒã§å€§ããæ¹å
ããã«ãããïŒå£²ãïŒ:
- é«ãã©æ: åç 58.8% â 䜿ããïŒ
- äœãã©æ: åç 51% â 䜿ããªã...
ããã«ããã ïŒè²·ãïŒ:
- é«ãã©æ: åç 53-55% â 埮åŠ...
- äœãã©æ: åç 47-51% â ãããè² ããïŒ
çµè«: ããã«ããã ã¯ãé«ãã©æã§ãåç55%ããã£ãšã
å®è·µãžã®ç€ºå
æŠç¥1: ããã«ãããã¯ç©æ¥µçã«äœ¿ãïŒ
ããã«ãããã¯é«ãã©æã«åç59%ãååã«åªäœæ§ããïŒ
# ããã«ãããå£²ãæŠç¥if double_top_detected and current_atr > atr_median: # ããã¯ã©ã€ã³ãã¬ã€ã¯ã§å£²ããšã³ããªãŒ execute_sell()æŠç¥2: ããã«ããã ã¯...æ éã«
åç51%ã§ã¯ãã¹ãã¬ããè² ãããå¯èœæ§å€§ã
䜿ããªã:
- é«ãã©æéå®ïŒããã§ãåç55%çšåºŠïŒ
- ä»ã®ãã£ã«ã¿ãŒïŒãã¬ã³ãæ¹åãåºæ¥é«ãªã©ïŒãšäœµçš
æŠç¥3: ã売ããåªå ã®æè
ä»åã®ããŒã¿ã瀺åããã®ã¯ã**ã売ããã¿ãŒã³ã®æ¹ãä¿¡é Œæ§ãé«ãã**ãšããããšã
- ããã«ãããïŒå£²ãïŒ: åç 58.8%
- ããã«ããã ïŒè²·ãïŒ: åç 51.8%
çŽ7ãã€ã³ãã®å·®ïŒ
ããã¯çºæ¿åžå Žã ãã§ãªããæ ªåŒåžå Žã§ãèšãããããšã
ãäžèœã¯æ©ããäžæã¯é ãã
ð ãŸãšãïŒãã£ãŒããã¿ãŒã³ã®çå®
ð ããŒã¿ãæŽããçå®
| çºèŠ | å 容 | ããªããžã®æå³ |
|---|---|---|
| â | ããã«ãããã¯æå¹ïŒåç58%ïŒ | 売ãã§äœ¿ãïŒ |
| â¡ | ããã«ããã ã¯åŸ®åŠïŒåç51%ïŒ | è²·ãã¯æ éã«... |
| ⢠| é«ãã©æã«æå¹æ§UP | ATRãã£ã«ã¿ãŒå¿ é ïŒ |
| ⣠| 売ããã¿ãŒã³ > è²·ããã¿ãŒã³ | äžèœã¯ä¿¡é Œã§ãã |
â¡ ä»ããå®è·µã§ãã3ã€ã®ããš
- ð¯ ããã«ããããèŠã€ããããé«ãã©ããã§ãã¯ïŒATR確èªïŒ
- ð ããã«ããã ã¯åç¬ã§äœ¿ããªãïŒä»ã®æ ¹æ ãšäœµçšïŒ
- â° ä¿ææéã¯60ã120åãå®å®ïŒçããããšåçäœäžïŒ
ð¥ æåŸã«ããã£ãŒããã¿ãŒã³ãä¿¡ããŠããéå»ã®èªåãž
ãããã«ãããã§å£²ãã°åãŠãïŒã ãããã«ããã ã§è²·ãã°å転ããïŒã
ãã®é ã®ä¿ºãèããŠãïŒ
ååæ£è§£ãåå倧ééãã ãã ð
ããã«ãããã¯ç¢ºãã«äœ¿ãããé«ãã©æãªãåç59%è¿ãã
ã§ãããã«ããã ã¯ïŒåç51%ã§ã»ãŒã©ã³ãã ã
俺ãééã£ãŠãã®ã¯ã
ãè²·ãã売ããåãããã«äœ¿ãããšæã£ãŠããããšã
åžå Žã¯é察称ãäžèœã¯æ©ããäžæã¯é ãã
ãã®éãããã¿ãŒã³ã®æå¹æ§ã«çŸããŠãïŒ
ãããæ¬¡ã¯ããªãã®çªïŒ
ãã®ããŒã¿ãåèã«ããã£ãŒããã¿ãŒã³æŠç¥ãèŠçŽããŠã¿ãŠãã ããã
ããã«ãããã¯èªä¿¡ãæã£ãŠïŒããã«ããã ã¯æ éã«ïŒ
ããŒã¿ã«åºã¥ãã倿ã§ãç¡é§ãªè² ããæžãããïŒ â¡âš
æ€èšŒã³ãŒãå šæ
ã³ããã§åããŸãïŒèªåã®æã§æ€èšŒããŠã¿ãŠãã ããã
"""ããã«ããã/ããã«ããã ãã¿ãŒã³æ€èšŒãæ¬åœã«åãŠãã®ãïŒããããŒã¿ã§å®å
šè§£æïŒ
æ€èšŒé
ç®:1. ããã«ããã/ããã«ããã ã®èªåæ€åº2. ããã¯ã©ã€ã³ãã¬ã€ã¯åŸã®ãªã¿ãŒã³ååž3. ãã¿ãŒã³åœ¢ææéå¥ã®åç4. ãã©ãã£ãªãã£ïŒATRïŒå¥ã®åç5. äŸ¡æ Œä¹é¢çå¥ïŒ2ã€ã®å±±/è°·ã®è¿ãïŒã®åç"""
import MetaTrader5 as mt5import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport matplotlibmatplotlib.use('Agg')import seaborn as snsfrom scipy import statsfrom datetime import datetimeimport warningswarnings.filterwarnings('ignore')
# æ¥æ¬èªãã©ã³ãèšå®plt.rcParams['font.family'] = ['MS Gothic', 'Hiragino Sans', 'IPAexGothic', 'sans-serif']plt.rcParams['axes.unicode_minus'] = False
# ===== èšå® =====SYMBOL = "USDJPY"TIMEFRAME = mt5.TIMEFRAME_M5NUM_BARS = 30000 # çŽ3.5ã¶æå
# ãã¿ãŒã³æ€åºãã©ã¡ãŒã¿SWING_PERIOD = 10 # ã¹ã€ã³ã°ãã€ã³ãå€å®æéïŒå·Šå³Næ¬ïŒPRICE_TOLERANCE_ATR = 1.5 # äŸ¡æ Œèš±å®¹èª€å·®ïŒATRã®åæ°ïŒMIN_BARS_BETWEEN = 15 # 2ã€ã®å±±/è°·ã®æå°ééMAX_BARS_BETWEEN = 150 # 2ã€ã®å±±/è°·ã®æå€§ééATR_PERIOD = 14
# åæããæéæ ïŒåïŒTIME_HORIZONS = [30, 60, 120, 240]
def initialize_mt5(): """MT5ãåæå""" if not mt5.initialize(): print("MT5ã®åæåã«å€±æ") return False print(f"MT5ããŒãžã§ã³: {mt5.version()}") return True
def get_ohlc_data(symbol, timeframe, num_bars): """OHLCããŒã¿ãååŸ""" # ã·ã³ãã«åã®ããªãšãŒã·ã§ã³ã詊ã symbols_to_try = [symbol, symbol + 'm', symbol + '.i', symbol + '-m']
for sym in symbols_to_try: symbol_info = mt5.symbol_info(sym) if symbol_info is not None: symbol = sym break
if symbol_info is None: print(f"ã·ã³ãã«ãèŠã€ãããŸãã: {symbol}") return None
if not symbol_info.visible: mt5.symbol_select(symbol, True)
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, num_bars) if rates is None or len(rates) == 0: print("ããŒã¿ååŸå€±æ") return None
df = pd.DataFrame(rates) df['time'] = pd.to_datetime(df['time'], unit='s') df.set_index('time', inplace=True)
print(f"ååŸããŒã¿: {len(df)}æ¬ ({df.index[0]} ã {df.index[-1]})") return df
def calculate_atr(df, period): """ATRèšç®""" high, low, close = df['high'], df['low'], df['close'].shift(1) tr = pd.concat([high - low, abs(high - close), abs(low - close)], axis=1).max(axis=1) return tr.rolling(window=period).mean()
def detect_swing_points(df, period): """ã¹ã€ã³ã°ãã€ã»ã¹ã€ã³ã°ããŒãæ€åº""" swing_high = pd.Series(index=df.index, dtype=float) swing_low = pd.Series(index=df.index, dtype=float)
for i in range(period, len(df) - period): # ã¹ã€ã³ã°ãã€: å·Šå³Næ¬ããé«ã left_max = df['high'].iloc[i-period:i].max() right_max = df['high'].iloc[i+1:i+period+1].max() if df['high'].iloc[i] > left_max and df['high'].iloc[i] > right_max: swing_high.iloc[i] = df['high'].iloc[i]
# ã¹ã€ã³ã°ããŒ: å·Šå³Næ¬ããäœã left_min = df['low'].iloc[i-period:i].min() right_min = df['low'].iloc[i+1:i+period+1].min() if df['low'].iloc[i] < left_min and df['low'].iloc[i] < right_min: swing_low.iloc[i] = df['low'].iloc[i]
return swing_high, swing_low
def detect_double_top(df, swing_high, atr, tolerance_atr, min_bars, max_bars): """ ããã«ããããæ€åº æ¡ä»¶: 1. 2ã€ã®ã¹ã€ã³ã°ãã€ãè¿ãäŸ¡æ ŒïŒATR à tolerance以å
ïŒ 2. é©åãªééïŒmin_barsãmax_barsïŒ 3. ããã¯ã©ã€ã³ïŒ2ã€ã®å±±ã®éã®æå®å€ïŒããã¬ã€ã¯ """ patterns = [] swing_indices = swing_high.dropna().index.tolist()
for i, first_idx in enumerate(swing_indices[:-1]): first_high = swing_high[first_idx] first_pos = df.index.get_loc(first_idx)
for second_idx in swing_indices[i+1:]: second_pos = df.index.get_loc(second_idx) bars_between = second_pos - first_pos
# ééãã§ã㯠if bars_between < min_bars or bars_between > max_bars: continue
second_high = swing_high[second_idx] current_atr = atr.iloc[second_pos] if not pd.isna(atr.iloc[second_pos]) else atr.iloc[first_pos]
if pd.isna(current_atr): continue
# äŸ¡æ Œèš±å®¹èª€å·®ãã§ã㯠price_diff = abs(first_high - second_high) if price_diff > current_atr * tolerance_atr: continue
# ããã¯ã©ã€ã³ïŒ2ã€ã®å±±ã®éã®æå®å€ïŒãèšç® between_slice = df.iloc[first_pos:second_pos+1] neckline = between_slice['low'].min()
# ããã¯ã©ã€ã³ãã¬ã€ã¯ãæ¢ã for j in range(second_pos + 1, min(second_pos + max_bars, len(df))): if df['close'].iloc[j] < neckline: # ãã¬ã€ã¯æ€åºïŒ price_diff_pct = (price_diff / first_high) * 100 patterns.append({ 'time': df.index[j], 'first_high': first_high, 'second_high': second_high, 'neckline': neckline, 'signal_idx': j, 'pattern_bars': bars_between, 'price_diff_pct': price_diff_pct, 'atr': current_atr, 'pattern_height': ((first_high + second_high) / 2) - neckline }) break
return pd.DataFrame(patterns)
def detect_double_bottom(df, swing_low, atr, tolerance_atr, min_bars, max_bars): """ ããã«ããã ãæ€åº æ¡ä»¶: 1. 2ã€ã®ã¹ã€ã³ã°ããŒãè¿ãäŸ¡æ ŒïŒATR à tolerance以å
ïŒ 2. é©åãªééïŒmin_barsãmax_barsïŒ 3. ããã¯ã©ã€ã³ïŒ2ã€ã®è°·ã®éã®æé«å€ïŒããã¬ã€ã¯ """ patterns = [] swing_indices = swing_low.dropna().index.tolist()
for i, first_idx in enumerate(swing_indices[:-1]): first_low = swing_low[first_idx] first_pos = df.index.get_loc(first_idx)
for second_idx in swing_indices[i+1:]: second_pos = df.index.get_loc(second_idx) bars_between = second_pos - first_pos
# ééãã§ã㯠if bars_between < min_bars or bars_between > max_bars: continue
second_low = swing_low[second_idx] current_atr = atr.iloc[second_pos] if not pd.isna(atr.iloc[second_pos]) else atr.iloc[first_pos]
if pd.isna(current_atr): continue
# äŸ¡æ Œèš±å®¹èª€å·®ãã§ã㯠price_diff = abs(first_low - second_low) if price_diff > current_atr * tolerance_atr: continue
# ããã¯ã©ã€ã³ïŒ2ã€ã®è°·ã®éã®æé«å€ïŒãèšç® between_slice = df.iloc[first_pos:second_pos+1] neckline = between_slice['high'].max()
# ããã¯ã©ã€ã³ãã¬ã€ã¯ãæ¢ã for j in range(second_pos + 1, min(second_pos + max_bars, len(df))): if df['close'].iloc[j] > neckline: # ãã¬ã€ã¯æ€åºïŒ price_diff_pct = (price_diff / first_low) * 100 patterns.append({ 'time': df.index[j], 'first_low': first_low, 'second_low': second_low, 'neckline': neckline, 'signal_idx': j, 'pattern_bars': bars_between, 'price_diff_pct': price_diff_pct, 'atr': current_atr, 'pattern_height': neckline - ((first_low + second_low) / 2) }) break
return pd.DataFrame(patterns)
def calculate_returns(df, patterns_df, horizons, is_short=False): """ãã¿ãŒã³çºçåŸã®ãªã¿ãŒã³ãèšç®""" if len(patterns_df) == 0: return patterns_df
patterns_df = patterns_df.copy()
for minutes in horizons: bars_ahead = minutes // 5 # 5åè¶³ãªã®ã§ returns = []
for idx, row in patterns_df.iterrows(): signal_idx = row['signal_idx'] future_idx = signal_idx + bars_ahead
if future_idx < len(df): entry_price = df['close'].iloc[signal_idx] exit_price = df['close'].iloc[future_idx]
if is_short: # ããã«ãããã¯å£²ã ret = (entry_price - exit_price) * 100 # pips else: # ããã«ããã ã¯è²·ã ret = (exit_price - entry_price) * 100 # pips returns.append(ret) else: returns.append(np.nan)
patterns_df[f'return_{minutes}m'] = returns
return patterns_df
def analyze_by_volatility(patterns_df, atr_series, horizons): """ãã©ãã£ãªãã£å¥åæ""" if len(patterns_df) == 0: return None, None
atr_median = patterns_df['atr'].median()
high_vol = patterns_df[patterns_df['atr'] > atr_median] low_vol = patterns_df[patterns_df['atr'] <= atr_median]
results = {} for label, data in [('high', high_vol), ('low', low_vol), ('all', patterns_df)]: if len(data) < 5: continue
results[label] = {} for minutes in horizons: col = f'return_{minutes}m' if col not in data.columns: continue
returns = data[col].dropna() if len(returns) < 5: continue
results[label][minutes] = { 'count': len(returns), 'win_rate': (returns > 0).mean() * 100, 'mean_return': returns.mean(), 'median_return': returns.median(), 'std': returns.std(), }
return results, atr_median
def main(): """ã¡ã€ã³åŠç""" print("[START] ããã«ããã/ããã«ããã æ€èšŒãéå§...")
if not initialize_mt5(): return
try: # ããŒã¿ååŸ df = get_ohlc_data(SYMBOL, TIMEFRAME, NUM_BARS) if df is None: return
# ATRèšç® df['atr'] = calculate_atr(df, ATR_PERIOD)
# ã¹ã€ã³ã°ãã€ã³ãæ€åº swing_high, swing_low = detect_swing_points(df, SWING_PERIOD)
# ããã«ãããæ€åº top_patterns = detect_double_top( df, swing_high, df['atr'], PRICE_TOLERANCE_ATR, MIN_BARS_BETWEEN, MAX_BARS_BETWEEN )
# ããã«ããã æ€åº bottom_patterns = detect_double_bottom( df, swing_low, df['atr'], PRICE_TOLERANCE_ATR, MIN_BARS_BETWEEN, MAX_BARS_BETWEEN )
# ãªã¿ãŒã³èšç® top_patterns = calculate_returns(df, top_patterns, TIME_HORIZONS, is_short=True) bottom_patterns = calculate_returns(df, bottom_patterns, TIME_HORIZONS, is_short=False)
# ãã©ãã£ãªãã£å¥åæ top_vol_results, _ = analyze_by_volatility(top_patterns, df['atr'], TIME_HORIZONS) bottom_vol_results, _ = analyze_by_volatility(bottom_patterns, df['atr'], TIME_HORIZONS)
# çµæåºå print(f"\nããã«ããã: {len(top_patterns)}ãã¿ãŒã³") print(f"ããã«ããã : {len(bottom_patterns)}ãã¿ãŒã³")
for label, results in [('ããã«ããã', top_vol_results), ('ããã«ããã ', bottom_vol_results)]: if results and 'all' in results: print(f"\n{label} - å
šããŒã¿:") for minutes in TIME_HORIZONS: if minutes in results['all']: r = results['all'][minutes] print(f" {minutes}å: åç{r['win_rate']:.1f}%, å¹³å{r['mean_return']:.2f}pips")
finally: mt5.shutdown()
if __name__ == "__main__": main()ð é¢é£èšäº: ãã¬ã€ã¯ã¢ãŠãææ³ãããŒã¿æ€èšŒ - ATRãã£ã«ã¿ãŒã§åç66%ïŒ
ð¬ 質åã»ææ³ã¯ãã¡ã èšäºäœæè ïŒããœãP (@hosono_p) on XïŒæ§TwitterïŒ ãã£ãŒããã¿ãŒã³ã®è©±ãããŒã¿åæã®è©±ããªãã§ããæ°è»œã«DMãã ããïŒ
ðããããããŒã«ã»ãµãŒãã¹
ãã£ã³ããŒã³ã§æ1,790åããMT4/MT5ããªã€ã³ã¹ããŒã«æžã¿ãèªååŸ©æ§æ©èœä»ãã14æ¥éç¡æã詊ãã
ã·ã³ã¯ã©ãŠããã¹ã¯ããã for FX4幎ã§è³é4.7åã®ããã¯ãã¹ãå®çžŸããœãŒã¹ã³ãŒãä»ãã§èªç±ã«ã«ã¹ã¿ãã€ãºå¯èœã
ãŽããŒæ¥EA UltimateçïŒ3,980åïŒâ»äžèšãªã³ã¯ã«ã¯ããã¢ãŒã·ã§ã³ïŒåºåïŒãå«ãŸããŠããŸã
éåçžå Žè¬ç¥ïœããœãP
ããã°ã§ã¯æžããªãæ¬é³ã®ãã¬ãŒãæŠç¥ãšEAéçºã®è£åŽãå ¬éã ããŒã¿ã«åºã¥ããæ€èšŒã§ãåçŸæ§ã®ããææ³ã ãããå±ãããŸãã