//+------------------------------------------------------------------+ //| Urban Flux Research — 研究アーカイブ公開版(無償) | //| https://apex-predator-x.com/ | //| | //| 公開日 : 2026-08-22 | //| 配布区分 : 研究アーカイブ / 検証用ソースコード | //| 対応 : MetaTrader 5 (MQL5) | //| ライセンス : 検証・学習目的での閲覧・改変・実行を許諾します。 | //| 再配布する場合は本ヘッダを削除しないでください。 | //| | //| ── 免責 ────────────────────────────────────────────────────── | //| 本コードは研究記録の公開であり、投資助言ではありません。 | //| 過去の検証結果は将来の利益を一切保証しません。 | //| 実口座での使用により生じたいかなる損失についても、 | //| 当方は責任を負いません。必ずデモ口座で検証してください。 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ⚠⚠ 重要警告:本EAは実運用を推奨しません ⚠⚠ | //| | //| 本EAは絶対時刻(TimeGMT)を基準にエントリーします。 | //| しかし当社のその後の検証(TZ-2026-001 / RA-2026-002)により、 | //| 研究に用いた生データはブローカーサーバー時刻であり、 | //| 観測されたエッジの真の位置は | //| 「週次 market reopen の次の1時間」 | //| であることが判明しました。ライブで参照される真UTC01:00は | //| 別の時間帯であり、そこでの期待値は【負】と判定されています | //| (Trial Ledger T-0005)。 | //| | //| さらに、実測コスト控除後に生存する可能性があるのは USDJPY のみ | //| です。GBPJPY は再開直後のスプレッドが広く | //| (p50 3.2pip / p95 6.8pip)、悲観コストで期待値が負になります。 | //| EURJPY も同様に脆弱です。 | //| 本EAの対象ペアは、この「負」と判定されたペアを含みます。 | //| | //| → 本コードは「当時どう実装したか」を示す研究アーカイブです。 | //| 時刻基準を修正した実装例は TokyoMorningEA_v1.04.mq5 を | //| 参照してください(週次reopenアンカー・タイムゾーン非依存)。 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| GENOME02_Portfolio_v100.mq5 | //| GENOME-02: L1/L2/L3/L4 多ペア多レッグ統合ポートフォリオ EA | //| | //| Recommended: 5シンボルそれぞれに1インスタンス | //| AUDJPY / EURJPY / GBPJPY / NZDJPY / USDJPY | //| | //| ─── レッグ定義(凍結・禁止⑧厳守)──────────────────────────── | //| L1 (AUDJPY/EURJPY/NZDJPY/USDJPY): | //| 月曜 GMT01:00 成行LONG → GMT02:00 クローズ @2pip | //| L2 (GBPJPY): | //| 月曜 GMT01:00 成行LONG → GMT02:00 クローズ @2pip | //| L3 (GBPJPY + EURJPY): | //| 月曜 GMT01:00 成行LONG → GMT02:00 クローズ @2pip | //| フィルタ: 前木曜D1 DOWN (ConnDOWN≥1) かつ | //| 月曜GMT00 H1 低位引け (g0_pos < InpG0PosThr) | //| L4 (GBPJPY のみ): | //| D1 前日まで4本連続DOWN → 翌D1 00:00 GMT成行LONG | //| → 翌D1 00:00 GMT(次のD1バー開始)クローズ | //| | //| ─── ポートフォリオ実績 ─────────────────────────────────────── | //| IS+Val avg=+7.82p PF=2.96 Sharpe=2.72 N=1384 (2020-2024) | //| OOS avg=+9.40p PF=3.17 Sharpe=3.56 N=276 (2025) | //| WFA 21/22窓(95%) PASS Null 2000回全勝 Gate7: 72/100(Gold暫) | //| | //| ⚠️ リスク開示 (CLAUDE.md v2-8): | //| 全レッグJPYクロスLONG・月曜GMT01集中(最大7単位同時) | //| L1↔L2 r=+0.840。円キャリー消滅リスク非分散。 | //| 2020 COVID時MaxDD=1296p(年利70%)。 | //| 自己判断・自己責任で運用してください。 | //| | //| ─── 同時保有ルール(04B定義・凍結)────────────────────────── | //| GBPJPY: L2+L3+L4 最大3単位同時 (1h + conditional + D1) | //| EURJPY: L1+L3 最大2単位同時 | //| L4×月曜H1: r=-0.087 準独立。D1:24h vs H1:1h で保有窓分離。 | //| L4が月曜に重なる場合、GMT02でL2+L3分を部分決済しL4を保持。 | //| | //| v1.00: Gate B テスト版 | //+------------------------------------------------------------------+ #property copyright "Urban Flux Research — GENOME-02" #property link "https://apex-predator-x.com/" #property version "1.00" #property description "[RESEARCH ARCHIVE / NOT FOR LIVE] GENOME-02 Portfolio | L1+L2+L3+L4 | Mon GMT01 + D1 Reversal | v1.00" #include #include //============================================================ // 定数 //============================================================ #define MAGIC_NUM 220201 // GENOME-02 固有マジックナンバー #define TIMER_MS 5000 // 5秒ごとチェック #define MAX_RETRY 10 #define MAX_CONSEC_CHECK 15 //============================================================ // EA役割 (シンボルにより自動決定) //============================================================ enum ENUM_EA_ROLE { ROLE_L1_ONLY = 0, // AUDJPY / NZDJPY / USDJPY → L1のみ ROLE_EURJPY = 1, // EURJPY → L1 + L3 ROLE_GBPJPY = 2, // GBPJPY → L2 + L3 + L4 }; //============================================================ // 入力パラメータ //============================================================ input group "=== ロット ===" input double InpLots = 0.01; // 1シグナルあたりのロット (等ロット固定) input group "=== スプレッド ===" input double InpMaxSpreadH1 = 5.0; // H1レッグ(L1/L2/L3) 最大スプレッド(pip) input double InpMaxSpreadL4 = 10.0; // L4 最大スプレッド(pip) input group "=== エントリー ===" input int InpRetryMaxMin = 10; // GMT01:00 のスプレッド待機上限(分) input double InpG0PosThr = 0.40; // L3 GMT00バー低位引け閾値 input int InpMinConsecDown = 4; // L4 連続陰線本数 input group "=== ログ ===" input bool InpPrintLog = true; //============================================================ // グローバル変数 //============================================================ CTrade g_trade; CPositionInfo g_pos_info; ENUM_EA_ROLE g_role; // 当該シンボルの役割 // ─── H1 ロジック状態 (毎 D1 リセット) ────────────────────── bool g_h1_entered = false; // 本日 L1/L2/L3 エントリー済み bool g_h1_exited = false; // 本日 L1/L2/L3 エグジット済み double g_h1_lots = 0.0; // 本日 H1 エントリーしたロット数 bool g_h1_spread_skip = false; // スプレッドスキップ // ─── L4 ロジック状態 (D1をまたいで保持) ───────────────────── bool g_l4_active = false; // L4 ポジション保有中 double g_l4_lots = 0.0; // L4 のロット数 datetime g_l4_bar_open = 0; // L4 エントリー D1 バー開始時刻 bool g_l4_entered = false; // 本 D1 バーでの L4 エントリー済み // ─── D1 バー管理 ────────────────────────────────────────────── datetime g_last_d1_bar = 0; // ─── 終了リトライ管理 ───────────────────────────────────────── int g_exit_retry = 0; int g_l4_close_retry = 0; //============================================================ // ユーティリティ //============================================================ // [M-Fix 3] digits ベース全シンボル対応 PipSize double PipSize() { int d = (int)SymbolInfoInteger(Symbol(), SYMBOL_DIGITS); double p = SymbolInfoDouble(Symbol(), SYMBOL_POINT); return (d == 3 || d == 5) ? p * 10.0 : p; } double GetSpreadPip() { return (SymbolInfoDouble(Symbol(), SYMBOL_ASK) - SymbolInfoDouble(Symbol(), SYMBOL_BID)) / PipSize(); } ENUM_ORDER_TYPE_FILLING DetectFilling() { long m = SymbolInfoInteger(Symbol(), SYMBOL_FILLING_MODE); if((m & SYMBOL_FILLING_IOC) != 0) return ORDER_FILLING_IOC; if((m & SYMBOL_FILLING_FOK) != 0) return ORDER_FILLING_FOK; return ORDER_FILLING_RETURN; } void GetGmt(int &h, int &wd, int &mn) { MqlDateTime dt; TimeToStruct(TimeGMT(), dt); h = dt.hour; wd = dt.day_of_week; // 0=Sun,1=Mon,...,6=Sat mn = dt.min; } // 当シンボルの自マジックポジション合計ロット double GetTotalLots() { double total = 0.0; for(int i = PositionsTotal() - 1; i >= 0; i--) if(g_pos_info.SelectByIndex(i)) if(g_pos_info.Symbol() == Symbol() && g_pos_info.Magic() == MAGIC_NUM) total += g_pos_info.Volume(); return total; } // 自マジックポジション保有チェック bool HasPosition() { for(int i = PositionsTotal() - 1; i >= 0; i--) if(g_pos_info.SelectByIndex(i)) if(g_pos_info.Symbol() == Symbol() && g_pos_info.Magic() == MAGIC_NUM) return true; return false; } // 自マジックポジションのチケット取得 (netting: 1つのみ) ulong GetMyTicket() { for(int i = PositionsTotal() - 1; i >= 0; i--) if(g_pos_info.SelectByIndex(i)) if(g_pos_info.Symbol() == Symbol() && g_pos_info.Magic() == MAGIC_NUM) return g_pos_info.Ticket(); return 0; } // ロットを SYMBOL_VOLUME_STEP に丸める double NormLots(double raw) { double step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); double mn = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN); double mx = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX); double v = MathFloor(raw / step) * step; return MathMax(mn, MathMin(mx, v)); } // [M-Fix 4] 証拠金プリチェック bool CheckMargin(double lots) { double ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK); double req = 0.0; if(!OrderCalcMargin(ORDER_TYPE_BUY, Symbol(), lots, ask, req)) return true; if(req > AccountInfoDouble(ACCOUNT_FREEMARGIN)) { if(InpPrintLog) PrintFormat("GENOME02 SKIP(no margin) | %s | Need=%.2f Free=%.2f", Symbol(), req, AccountInfoDouble(ACCOUNT_FREEMARGIN)); return false; } return true; } // EA 役割の決定 ENUM_EA_ROLE DetectRole() { string s = Symbol(); if(StringFind(s, "GBPJPY") >= 0) return ROLE_GBPJPY; if(StringFind(s, "EURJPY") >= 0) return ROLE_EURJPY; return ROLE_L1_ONLY; } //============================================================ // L3 フィルタ関数 (R135 ロジック移植) //============================================================ // GMT00 バー 低位引け (g0_pos < InpG0PosThr) bool CheckGMT00Shape() { double h = iHigh (Symbol(), PERIOD_H1, 1); double l = iLow (Symbol(), PERIOD_H1, 1); double c = iClose(Symbol(), PERIOD_H1, 1); double range = h - l; if(range < PipSize() * 0.5) { if(InpPrintLog) PrintFormat("GENOME02-L3 GMT00レンジ不足スキップ | %s", Symbol()); return false; } double pos = (c - l) / range; bool pass = (pos < InpG0PosThr); if(InpPrintLog) PrintFormat("GENOME02-L3 GMT00フィルタ | %s | g0_pos=%.3f | %s", Symbol(), pos, pass ? "PASS" : "SKIP"); return pass; } // 前木曜 D1 DOWN チェック (ConnDOWN≥1) bool CheckThursdayDown() { MqlDateTime mdt; TimeToStruct(TimeGMT(), mdt); datetime mon_gmt_midnight = TimeGMT() - (datetime)mdt.hour * 3600 - (datetime)mdt.min * 60 - (datetime)mdt.sec; datetime thu_gmt_open = mon_gmt_midnight - 4 * 86400; datetime thu_gmt_close = mon_gmt_midnight - 3 * 86400 - 3600; int broker_off = (int)(TimeCurrent() - TimeGMT()); int shift_o = iBarShift(Symbol(), PERIOD_H1, thu_gmt_open + broker_off, false); int shift_c = iBarShift(Symbol(), PERIOD_H1, thu_gmt_close + broker_off, false); if(shift_o < 0 || shift_c < 0) { if(InpPrintLog) PrintFormat("GENOME02-L3 木曜D1バーシフト取得失敗 | %s", Symbol()); return false; } double thu_o = iOpen (Symbol(), PERIOD_H1, shift_o); double thu_c = iClose(Symbol(), PERIOD_H1, shift_c); bool pass = (thu_c < thu_o); if(InpPrintLog) PrintFormat("GENOME02-L3 木曜DOWN | %s | Open=%.3f Close=%.3f | %s", Symbol(), thu_o, thu_c, pass ? "PASS" : "SKIP"); return pass; } //============================================================ // L4 連続陰線カウント //============================================================ int CountConsecDown() { int count = 0; for(int i = 1; i <= MAX_CONSEC_CHECK; i++) { double c = iClose(Symbol(), PERIOD_D1, i); double o = iOpen (Symbol(), PERIOD_D1, i); if(c == 0.0 || o == 0.0) break; if(c < o) count++; else break; } return count; } //============================================================ // H1 エントリー (L1/L2 無条件 + L3 条件付き) //============================================================ void TryEnterH1() { if(g_h1_entered || g_h1_spread_skip) return; // スプレッドチェック double spread = GetSpreadPip(); int h, wd, mn; GetGmt(h, wd, mn); if(spread > InpMaxSpreadH1) { if(mn <= InpRetryMaxMin) { if(InpPrintLog) PrintFormat("GENOME02 H1スプレッド待機 | %s %.2fpip > %.1fpip | min=%d", Symbol(), spread, InpMaxSpreadH1, mn); return; } // 待機上限超え → スキップ if(InpPrintLog) PrintFormat("GENOME02 H1スプレッドスキップ | %s %.2fpip", Symbol(), spread); g_h1_entered = true; g_h1_spread_skip = true; return; } // ロット計算 // L1/L2: 必ず1単位 double lots = InpLots; // L3 条件確認 (GBPJPY / EURJPY のみ) bool l3_fire = false; if(g_role == ROLE_GBPJPY || g_role == ROLE_EURJPY) { if(CheckThursdayDown() && CheckGMT00Shape()) { l3_fire = true; lots += InpLots; } } lots = NormLots(lots); if(!CheckMargin(lots)) { g_h1_entered = true; return; } string tag = (g_role == ROLE_GBPJPY) ? "L2" : "L1"; if(l3_fire) tag += "+L3"; double ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK); g_trade.SetExpertMagicNumber(MAGIC_NUM); g_trade.SetDeviationInPoints(50); g_trade.SetTypeFilling(DetectFilling()); bool ok = g_trade.Buy(lots, Symbol(), ask, 0.0, 0.0, StringFormat("GENOME02_%s_GMT01", tag)); if(ok) { g_h1_lots = lots; g_h1_entered = true; if(InpPrintLog) PrintFormat("GENOME02 H1 ENTER | %s | %s | ask=%.3f lots=%.2f spread=%.2fpip", Symbol(), tag, ask, lots, spread); } else PrintFormat("GENOME02 H1エントリー失敗 | %s | err=%d %s", Symbol(), GetLastError(), g_trade.ResultComment()); } //============================================================ // H1 エグジット (GMT02 クローズ) // L4 が保有中の場合は H1 ロット分のみ部分決済 //============================================================ void TryExitH1() { if(g_h1_exited) return; if(g_h1_lots <= 0.0) { g_h1_exited = true; return; } // エントリーなし double total = GetTotalLots(); if(total <= 0.0) { g_h1_exited = true; g_exit_retry = 0; return; } ulong ticket = GetMyTicket(); if(ticket == 0) { g_h1_exited = true; return; } g_trade.SetExpertMagicNumber(MAGIC_NUM); g_trade.SetTypeFilling(DetectFilling()); bool ok = false; if(g_l4_active && total > g_l4_lots + 0.0001) { // L4 ポジション保有中: H1 分のみ部分決済 double to_close = NormLots(MathMin(g_h1_lots, total - g_l4_lots)); if(to_close > 0.0) { ok = g_trade.PositionClosePartial(ticket, to_close); if(InpPrintLog) PrintFormat("GENOME02 H1 部分EXIT | %s | H1_lots=%.2f to_close=%.2f total=%.2f L4_lots=%.2f", Symbol(), g_h1_lots, to_close, total, g_l4_lots); } else ok = true; // 閉じる分なし } else { // L4 なし: 全クローズ ok = g_trade.PositionClose(ticket); if(InpPrintLog) PrintFormat("GENOME02 H1 EXIT(全) | %s | lots=%.2f", Symbol(), total); } if(ok) { g_h1_exited = true; g_exit_retry = 0; } else { g_exit_retry++; if(g_exit_retry >= MAX_RETRY) g_h1_exited = true; PrintFormat("GENOME02 H1エグジット失敗 | %s | retry=%d err=%d", Symbol(), g_exit_retry, GetLastError()); } } //============================================================ // L4 エントリー (D1 00:00 GMT — GBPJPY のみ) //============================================================ void TryEnterL4() { if(g_l4_entered) return; if(g_role != ROLE_GBPJPY) return; double spread = GetSpreadPip(); if(spread > InpMaxSpreadL4) { if(InpPrintLog) PrintFormat("GENOME02-L4 スプレッド待機 | %s %.2fpip > %.1fpip", Symbol(), spread, InpMaxSpreadL4); return; } double lots = NormLots(InpLots); if(!CheckMargin(lots)) { g_l4_entered = true; return; } double ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK); g_trade.SetExpertMagicNumber(MAGIC_NUM); g_trade.SetDeviationInPoints(100); g_trade.SetTypeFilling(DetectFilling()); bool ok = g_trade.Buy(lots, Symbol(), ask, 0.0, 0.0, StringFormat("GENOME02_L4_%s", TimeToString(g_l4_bar_open, TIME_DATE))); if(ok) { g_l4_active = true; g_l4_lots = lots; g_l4_entered = true; if(InpPrintLog) PrintFormat("GENOME02-L4 ENTER | %s | ask=%.3f lots=%.2f spread=%.2fpip D1=%s", Symbol(), ask, lots, spread, TimeToString(g_l4_bar_open, TIME_DATE)); } else PrintFormat("GENOME02-L4 エントリー失敗 | %s | err=%d %s", Symbol(), GetLastError(), g_trade.ResultComment()); } //============================================================ // L4 クローズ (翌 D1 バー開始時) //============================================================ void TryCloseL4() { if(!g_l4_active) return; double total = GetTotalLots(); if(total <= 0.0) { g_l4_active = false; g_l4_lots = 0.0; g_l4_close_retry = 0; return; } ulong ticket = GetMyTicket(); if(ticket == 0) return; g_trade.SetExpertMagicNumber(MAGIC_NUM); g_trade.SetTypeFilling(DetectFilling()); bool ok = false; // H1 ロットが残っていれば L4 分のみ部分決済(通常は H1 は GMT02 に決済済み) if(g_h1_lots > 0.001 && total > g_l4_lots + 0.0001) { double to_close = NormLots(MathMin(g_l4_lots, total - g_h1_lots)); ok = (to_close > 0.0) ? g_trade.PositionClosePartial(ticket, to_close) : true; } else ok = g_trade.PositionClose(ticket); if(ok) { g_l4_active = false; g_l4_lots = 0.0; g_l4_close_retry = 0; if(InpPrintLog) PrintFormat("GENOME02-L4 EXIT | %s | D1 bar closed", Symbol()); } else { g_l4_close_retry++; if(g_l4_close_retry >= MAX_RETRY) { g_l4_active = false; g_l4_lots = 0.0; } PrintFormat("GENOME02-L4 クローズ失敗 | %s | retry=%d err=%d", Symbol(), g_l4_close_retry, GetLastError()); } } //============================================================ // 新 D1 バー開始時の処理 //============================================================ void OnNewD1Bar(datetime new_d1) { if(InpPrintLog) PrintFormat("GENOME02 新D1バー | %s | %s", Symbol(), TimeToString(new_d1, TIME_DATE)); // ─── 1. 前 D1 の L4 クローズ ──────────────────────────────── if(g_l4_active && g_l4_bar_open != new_d1 && g_l4_bar_open != 0) TryCloseL4(); // ─── 2. H1 状態リセット (新 D1 = 新しい日) ────────────────── g_h1_entered = false; g_h1_exited = false; g_h1_lots = 0.0; g_h1_spread_skip = false; g_exit_retry = 0; g_l4_entered = false; // 新 D1 での L4 エントリーフラグ // ─── 3. L4 シグナル確認 + エントリー (GBPJPY のみ) ────────── if(g_role == ROLE_GBPJPY) { int consec = CountConsecDown(); if(InpPrintLog) PrintFormat("GENOME02-L4 連続DOWN | %s | %d本 (閾値%d)", Symbol(), consec, InpMinConsecDown); if(consec >= InpMinConsecDown) { g_l4_bar_open = new_d1; TryEnterL4(); } } } //============================================================ // H1 ロジック (GMT 01:00 エントリー / GMT 02:00 エグジット) //============================================================ void ProcessH1Logic() { int h, wd, mn; GetGmt(h, wd, mn); // ─── GMT02: H1 エグジット ───────────────────────────────────── if(h == 2 && !g_h1_exited && g_h1_entered) { TryExitH1(); return; } // ─── GMT01 月曜: H1 エントリー ────────────────────────────── if(wd == 1 && h == 1 && !g_h1_entered && mn <= InpRetryMaxMin) TryEnterH1(); } //============================================================ // メインループ (OnTick / OnTimer から呼ぶ) //============================================================ void ProcessAll() { // ─── D1 バー変化検出 ──────────────────────────────────────── datetime current_d1 = iTime(Symbol(), PERIOD_D1, 0); if(current_d1 != g_last_d1_bar) { g_last_d1_bar = current_d1; OnNewD1Bar(current_d1); } // ─── H1 ロジック ──────────────────────────────────────────── ProcessH1Logic(); // ─── L4 エントリーリトライ (GBPJPY: 当 D1 で未エントリーなら再試行) ─ if(g_role == ROLE_GBPJPY && g_l4_bar_open == iTime(Symbol(), PERIOD_D1, 0) && !g_l4_entered && !g_l4_active) TryEnterL4(); } //============================================================ // 初期化 — [M-Fix 1] どのシンボルでも INIT_SUCCEEDED を返す //============================================================ int OnInit() { // [M-Fix 2] シンボルガードなし。役割はシンボルで自動判定。 if(InpLots <= 0.0) return INIT_PARAMETERS_INCORRECT; if(InpMinConsecDown < 2 || InpMinConsecDown > 10) return INIT_PARAMETERS_INCORRECT; g_role = DetectRole(); g_trade.SetExpertMagicNumber(MAGIC_NUM); g_trade.SetDeviationInPoints(100); g_trade.SetTypeFilling(DetectFilling()); // 初期 D1 バー記録 g_last_d1_bar = iTime(Symbol(), PERIOD_D1, 0); // EA 再起動時のポジション状態復元 if(HasPosition()) { double total = GetTotalLots(); // 既存ポジションがあれば L4 として扱い翌 D1 クローズに委ねる if(g_role == ROLE_GBPJPY && total > 0) { g_l4_active = true; g_l4_lots = total; g_l4_bar_open = g_last_d1_bar; if(InpPrintLog) PrintFormat("GENOME02 再起動: L4ポジション復元 | %s | lots=%.2f", Symbol(), total); } } EventSetMillisecondTimer(TIMER_MS); string role_str; switch(g_role) { case ROLE_L1_ONLY: role_str = "L1(月曜GMT01)"; break; case ROLE_EURJPY: role_str = "L1+L3(月曜GMT01+条件付)"; break; case ROLE_GBPJPY: role_str = "L2+L3(月曜GMT01)+L4(D1 4連続DOWN)"; break; } if(InpPrintLog) PrintFormat("GENOME02 v1.00 初期化 | Symbol=%s | Role=%s | " "Lots=%.2f | MaxSpreadH1=%.1fpip | MaxSpreadL4=%.1fpip | " "IS+Val PF=2.96 avg=+7.82p | OOS PF=3.17 | ⚠️ 円キャリー集中リスク", Symbol(), role_str, InpLots, InpMaxSpreadH1, InpMaxSpreadL4); return INIT_SUCCEEDED; } void OnDeinit(const int reason) { EventKillTimer(); if(HasPosition() && InpPrintLog) PrintFormat("GENOME02 EA終了時ポジション残存 | %s | lots=%.2f reason=%d", Symbol(), GetTotalLots(), reason); } void OnTick() { ProcessAll(); } void OnTimer() { ProcessAll(); } //+------------------------------------------------------------------+