[{"data":1,"prerenderedAt":1350},["ShallowReactive",2],{"\u002Fja\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor":3,"\u002Fja\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor-surround":1330,"\u002Fja\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor-langs":1340},{"id":4,"title":5,"authors":6,"badge":12,"body":14,"date":1318,"description":1319,"draft":1320,"extension":1321,"image":1322,"meta":1324,"navigation":257,"path":1325,"seo":1326,"stem":1327,"updated":1328,"__hash__":1329},"posts\u002Fja\u002F3.guides\u002F41.add-a-news-filter-to-your-mt4-expert-advisor.md","MT4のEAにニュースフィルターを追加する方法",[7],{"name":8,"to":9,"avatar":10},"ShowMyTrades Team","https:\u002F\u002Fshowmytrades.com",{"src":11},"\u002Ficon-512.png",{"label":13},"自動売買",{"type":15,"value":16,"toc":1307},"minimark",[17,27,40,45,56,140,144,160,166,177,181,196,953,960,964,967,1033,1044,1055,1059,1062,1125,1129,1179,1183,1191,1195,1200,1208,1213,1216,1221,1228,1233,1236,1241,1248,1253,1261,1265,1292,1295,1303],[18,19,20,21,26],"p",{},"米雇用統計（NFP）や政策金利発表のさなかにもエントリーを続ける",[22,23,25],"a",{"href":24},"\u002Fglossary\u002Fwhat-is-an-expert-advisor","EA（エキスパートアドバイザー）","は、もう戦略どおりに動いているとはいえません。広がったスプレッドの中で、コイン投げをしているのと同じです。そこで役に立つのがニュースフィルターです。相場を動かす指標の発表前後の数分間だけ新規エントリーを止め、それ以外の時間は戦略に任せます。",[18,28,29,30,34,35,39],{},"MetaTrader 5には経済指標カレンダーが内蔵されていますが、",[31,32,33],"strong",{},"MetaTrader 4にはありません","。そのためEAは、ニュースをどこかから取ってくる必要があります。このガイドで使うのは、無料の",[22,36,38],{"href":37},"\u002Fdocs\u002Fapi\u002Feconomic-calendar","ShowMyTrades経済指標カレンダーAPI","です。口座登録もAPIキーも不要で、ターミナルで許可するURLは1つだけ。どのEAにも貼り付けられるインクルードファイルを1つ用意します。",[41,42,44],"h2",{"id":43},"作るものの全体像","🧭 作るものの全体像",[46,47,52],"pre",{"className":48,"code":50,"language":51},[49],"language-text","15分ごと\n  今後2日分のニュースをダウンロード\n  （CSV、リクエスト1回）\n          │\n          ▼\nティックごと\n  現在時刻の[-30分, +30分]の範囲に発表があるか？\n    ある → 新規エントリーしない\n    ない → 戦略を実行\n","text",[53,54,50],"code",{"__ignoreMap":55},"",[57,58,59,75],"table",{},[60,61,62],"thead",{},[63,64,65,69,72],"tr",{},[66,67,68],"th",{},"決めること",[66,70,71],{},"コードの初期値",[66,73,74],{},"理由",[76,77,78,92,108,119,129],"tbody",{},[63,79,80,84,89],{},[81,82,83],"td",{},"対象の通貨",[81,85,86],{},[53,87,88],{},"EUR,USD",[81,90,91],{},"取引している通貨ペアを構成する2通貨。空欄にすると主要9通貨すべてが対象になります",[63,93,94,97,102],{},[81,95,96],{},"対象の重要度",[81,98,99],{},[53,100,101],{},"high",[81,103,104,105],{},"重要度「中」も対象にして、より慎重に止めたいなら",[53,106,107],{},"high,medium",[63,109,110,113,116],{},[81,111,112],{},"発表前の停止",[81,114,115],{},"30分",[81,117,118],{},"発表前はスプレッドが広がり、流動性も薄くなります",[63,120,121,124,126],{},[81,122,123],{},"発表後の停止",[81,125,115],{},[81,127,128],{},"最初の値動きも、その後の反転も、この時間帯に起こります",[63,130,131,134,137],{},[81,132,133],{},"ダウンロード間隔",[81,135,136],{},"15分",[81,138,139],{},"カレンダーが変わるのは1日に数回程度です。しかもAPI側で15分間キャッシュしています",[41,141,143],{"id":142},"ステップ1metatraderでurlを許可する","🔑 ステップ1：MetaTraderでURLを許可する",[18,145,146,147,150,151,154,155,159],{},"インターネットからデータを取得するMQL4の関数",[53,148,149],{},"WebRequest()","は、あらかじめ許可したURLにしかアクセスできません。ターミナルで",[31,152,153],{},"ツール → オプション → エキスパートアドバイザ","（Tools → Options → Expert Advisors）を開き、",[156,157,158],"em",{},"WebRequestを許可するURLリスト","（Allow WebRequest for listed URL）にチェックを入れて、次のURLを追加します。",[46,161,164],{"className":162,"code":163,"language":51,"meta":55},[49],"https:\u002F\u002Fshowmytrades.com\n",[53,165,163],{"__ignoreMap":55},[18,167,168,169,172,173,176],{},"この設定を忘れると、ダウンロードは",[53,170,171],{},"-1","を返し、エラー",[53,174,175],{},"4060","になります。そのときはインクルードファイルが「エキスパート」タブ（Experts）に注意を表示するので、フィルターがなぜ反応しないのかと悩まずに済みます。",[41,178,180],{"id":179},"ステップ2インクルードファイルを保存する","📄 ステップ2：インクルードファイルを保存する",[18,182,183,184,187,188,191,192,195],{},"次のコードを",[53,185,186],{},"SMT_NewsFilter.mqh","という名前で、ターミナルの",[53,189,190],{},"MQL4\\Include","フォルダー（ファイル → データフォルダを開く、File → Open Data Folder）に保存します。",[22,193,194],{"href":37},"APIリファレンス","に載せているものと同じファイルで、MQL5でもそのままコンパイルできます。",[46,197,201],{"className":198,"code":199,"filename":186,"language":200,"meta":55,"style":55},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F+------------------------------------------------------------------+\n\u002F\u002F| SMT_NewsFilter.mqh - MT4・MT5用ニュースフィルター\n\u002F\u002F| データ：https:\u002F\u002Fshowmytrades.com\u002Fapi\u002Fpublic\u002Fcalendar\u002Fv1（無料）\n\u002F\u002F| ドキュメント：https:\u002F\u002Fshowmytrades.com\u002Fdocs\u002Fapi\u002Feconomic-calendar\n\u002F\u002F| 設定：ツール > オプション > エキスパートアドバイザ >\n\u002F\u002F|       WebRequestを許可するURLリストに https:\u002F\u002Fshowmytrades.com を追加\n\u002F\u002F+------------------------------------------------------------------+\n#property strict\n\ninput string SMT_Currencies     = \"EUR,USD\"; \u002F\u002F ニュース：通貨（カンマ区切り、空欄 = すべて）\ninput string SMT_Impact         = \"high\";    \u002F\u002F ニュース：重要度（high | high,medium | all）\ninput int    SMT_MinutesBefore  = 30;        \u002F\u002F ニュース：発表前の停止時間（分）\ninput int    SMT_MinutesAfter   = 30;        \u002F\u002F ニュース：発表後の停止時間（分）\ninput int    SMT_RefreshMinutes = 15;        \u002F\u002F ニュース：ダウンロード間隔（分、最小15）\n\ndatetime smt_eventTime[];\nstring   smt_eventTitle[];\ndatetime smt_nextDownload = 0;\nlong     smt_serverTime   = 0;     \u002F\u002F 前回ダウンロード時のサーバーのUTC時刻（Unix秒）\nuint     smt_syncTick     = 0;     \u002F\u002F その時点のGetTickCount()\nbool     smt_clockSynced  = false;\n\n\u002F\u002F--- 本当のUTC時刻：サーバーの時刻に、ダウンロードからの経過ミリ秒を足したもの。\n\u002F\u002F--- 経過時間はGetTickCount()で数えるので、パソコンのタイムゾーン、夏時間、\n\u002F\u002F--- 時計の補正の影響を受けない（カウンターが一周してもuintの引き算で正しく求まる）。\n\u002F\u002F--- 最初のダウンロードまではTimeGMT()で代用する。TimeCurrent()は使わない：\n\u002F\u002F--- ブローカーのGMTオフセットは分からず、夏時間で変わるため。\ndatetime SMT_Now()\n{\n   if(!smt_clockSynced) return TimeGMT();\n   uint elapsedMs = GetTickCount() - smt_syncTick;\n   return (datetime)(smt_serverTime + elapsedMs \u002F 1000);\n}\n\n\u002F\u002F--- ブローカーの時計とUTCの差（秒、7200 = GMT+2）。これ単体でも便利：\n\u002F\u002F--- ほとんどのEAはこの値を知らない。TimeCurrent()は最後のティックの時刻なので、\n\u002F\u002F--- 週末ではなく、市場が開いているあいだに読むこと。\nint SMT_BrokerGmtOffsetSeconds()\n{\n   return (int)(TimeCurrent() - SMT_Now());\n}\n\n\u002F\u002F--- n番目のカンマより後ろすべて（CSVのタイトル。タイトル自体にカンマを含むことがある）\nstring SMT_AfterComma(const string line, const int n)\n{\n   int pos = -1;\n   for(int i = 0; i \u003C n; i++)\n   {\n      pos = StringFind(line, \",\", pos + 1);\n      if(pos \u003C 0) return \"\";\n   }\n   string rest = StringSubstr(line, pos + 1);\n   StringReplace(rest, \"\\\"\\\"\", \"\\\"\");\n   if(StringLen(rest) >= 2 && StringGetCharacter(rest, 0) == '\"')\n      rest = StringSubstr(rest, 1, StringLen(rest) - 2);\n   return rest;\n}\n\n\u002F\u002F--- 今後2日分をダウンロード（範囲には直近6時間も含まれる）\nbool SMT_Download()\n{\n   string url = \"https:\u002F\u002Fshowmytrades.com\u002Fapi\u002Fpublic\u002Fcalendar\u002Fv1?format=csv&days=2&impact=\" + SMT_Impact;\n   if(StringLen(SMT_Currencies) > 0) url += \"&currency=\" + SMT_Currencies;\n\n   char   post[], result[];\n   string headers;\n   ResetLastError();\n   int status = WebRequest(\"GET\", url, \"\", NULL, 10000, post, 0, result, headers);\n   if(status != 200)\n   {\n      Print(\"[SMT] calendar download failed: HTTP \", status, \", error \", GetLastError(),\n            \". Is https:\u002F\u002Fshowmytrades.com in Tools > Options > Expert Advisors > Allow WebRequest?\");\n      smt_nextDownload = TimeCurrent() + 60; \u002F\u002F 1分後に再試行\n      return false;\n   }\n\n   string body = CharArrayToString(result, 0, WHOLE_ARRAY, CP_UTF8);\n   string lines[];\n   int n = StringSplit(body, '\\n', lines);\n\n   ArrayResize(smt_eventTime, 0);\n   ArrayResize(smt_eventTitle, 0);\n   for(int i = 1; i \u003C n; i++) \u002F\u002F 0行目はヘッダー\n   {\n      \u002F\u002F 最終行 \"# server_time=1760702400 server_time_iso=...\"：サーバーのUTC時刻\n      if(StringFind(lines[i], \"# server_time=\") == 0)\n      {\n         long serverTime = StringToInteger(StringSubstr(lines[i], 14, 10));\n         if(serverTime > 0)\n         {\n            smt_serverTime  = serverTime;\n            smt_syncTick    = GetTickCount();\n            smt_clockSynced = true;\n         }\n         continue;\n      }\n      string f[];\n      if(StringSplit(lines[i], ',', f) \u003C 8) continue;\n      int k = ArraySize(smt_eventTime);\n      ArrayResize(smt_eventTime, k + 1);\n      ArrayResize(smt_eventTitle, k + 1);\n      smt_eventTime[k]  = (datetime)StringToInteger(f[0]);      \u002F\u002F Unix秒、UTC\n      smt_eventTitle[k] = f[2] + \" \" + f[3] + \": \" + SMT_AfterComma(lines[i], 7);\n   }\n   smt_nextDownload = TimeCurrent() + MathMax(SMT_RefreshMinutes, 15) * 60;\n   Print(\"[SMT] calendar: \", ArraySize(smt_eventTime), \" events loaded. UTC now \",\n         TimeToString(SMT_Now(), TIME_DATE|TIME_MINUTES), \", broker clock is GMT\",\n         (SMT_BrokerGmtOffsetSeconds() >= 0 ? \"+\" : \"\"), DoubleToString(SMT_BrokerGmtOffsetSeconds() \u002F 3600.0, 1));\n   return true;\n}\n\n\u002F\u002F--- 停止時間帯に発表があるあいだtrue。reasonにはどの発表かが入る\nbool SMT_IsNewsTime(string &reason)\n{\n   reason = \"\";\n   if(MQLInfoInteger(MQL_TESTER)) return false;   \u002F\u002F テスターではネットワークが使えない\n   if(TimeCurrent() >= smt_nextDownload) SMT_Download();\n\n   datetime now = SMT_Now();\n   for(int i = 0; i \u003C ArraySize(smt_eventTime); i++)\n   {\n      if(now >= smt_eventTime[i] - SMT_MinutesBefore * 60 && now \u003C= smt_eventTime[i] + SMT_MinutesAfter * 60)\n      {\n         reason = smt_eventTitle[i];\n         return true;\n      }\n   }\n   return false;\n}\n","cpp",[53,202,203,211,217,223,229,235,241,246,252,259,265,271,277,283,289,294,300,306,312,318,324,330,335,341,347,353,359,365,371,377,383,389,395,401,406,412,418,424,430,435,441,446,451,457,463,468,474,480,486,492,498,504,510,516,522,528,534,539,544,550,556,561,567,573,578,584,590,596,602,608,613,619,625,631,637,642,647,653,659,665,670,676,682,688,693,699,705,711,717,723,729,735,741,747,753,759,765,771,777,783,789,795,801,807,812,818,824,830,836,842,847,852,858,864,869,875,881,887,892,898,904,909,915,920,926,932,937,942,948],{"__ignoreMap":55},[204,205,208],"span",{"class":206,"line":207},"line",1,[204,209,210],{},"\u002F\u002F+------------------------------------------------------------------+\n",[204,212,214],{"class":206,"line":213},2,[204,215,216],{},"\u002F\u002F| SMT_NewsFilter.mqh - MT4・MT5用ニュースフィルター\n",[204,218,220],{"class":206,"line":219},3,[204,221,222],{},"\u002F\u002F| データ：https:\u002F\u002Fshowmytrades.com\u002Fapi\u002Fpublic\u002Fcalendar\u002Fv1（無料）\n",[204,224,226],{"class":206,"line":225},4,[204,227,228],{},"\u002F\u002F| ドキュメント：https:\u002F\u002Fshowmytrades.com\u002Fdocs\u002Fapi\u002Feconomic-calendar\n",[204,230,232],{"class":206,"line":231},5,[204,233,234],{},"\u002F\u002F| 設定：ツール > オプション > エキスパートアドバイザ >\n",[204,236,238],{"class":206,"line":237},6,[204,239,240],{},"\u002F\u002F|       WebRequestを許可するURLリストに https:\u002F\u002Fshowmytrades.com を追加\n",[204,242,244],{"class":206,"line":243},7,[204,245,210],{},[204,247,249],{"class":206,"line":248},8,[204,250,251],{},"#property strict\n",[204,253,255],{"class":206,"line":254},9,[204,256,258],{"emptyLinePlaceholder":257},true,"\n",[204,260,262],{"class":206,"line":261},10,[204,263,264],{},"input string SMT_Currencies     = \"EUR,USD\"; \u002F\u002F ニュース：通貨（カンマ区切り、空欄 = すべて）\n",[204,266,268],{"class":206,"line":267},11,[204,269,270],{},"input string SMT_Impact         = \"high\";    \u002F\u002F ニュース：重要度（high | high,medium | all）\n",[204,272,274],{"class":206,"line":273},12,[204,275,276],{},"input int    SMT_MinutesBefore  = 30;        \u002F\u002F ニュース：発表前の停止時間（分）\n",[204,278,280],{"class":206,"line":279},13,[204,281,282],{},"input int    SMT_MinutesAfter   = 30;        \u002F\u002F ニュース：発表後の停止時間（分）\n",[204,284,286],{"class":206,"line":285},14,[204,287,288],{},"input int    SMT_RefreshMinutes = 15;        \u002F\u002F ニュース：ダウンロード間隔（分、最小15）\n",[204,290,292],{"class":206,"line":291},15,[204,293,258],{"emptyLinePlaceholder":257},[204,295,297],{"class":206,"line":296},16,[204,298,299],{},"datetime smt_eventTime[];\n",[204,301,303],{"class":206,"line":302},17,[204,304,305],{},"string   smt_eventTitle[];\n",[204,307,309],{"class":206,"line":308},18,[204,310,311],{},"datetime smt_nextDownload = 0;\n",[204,313,315],{"class":206,"line":314},19,[204,316,317],{},"long     smt_serverTime   = 0;     \u002F\u002F 前回ダウンロード時のサーバーのUTC時刻（Unix秒）\n",[204,319,321],{"class":206,"line":320},20,[204,322,323],{},"uint     smt_syncTick     = 0;     \u002F\u002F その時点のGetTickCount()\n",[204,325,327],{"class":206,"line":326},21,[204,328,329],{},"bool     smt_clockSynced  = false;\n",[204,331,333],{"class":206,"line":332},22,[204,334,258],{"emptyLinePlaceholder":257},[204,336,338],{"class":206,"line":337},23,[204,339,340],{},"\u002F\u002F--- 本当のUTC時刻：サーバーの時刻に、ダウンロードからの経過ミリ秒を足したもの。\n",[204,342,344],{"class":206,"line":343},24,[204,345,346],{},"\u002F\u002F--- 経過時間はGetTickCount()で数えるので、パソコンのタイムゾーン、夏時間、\n",[204,348,350],{"class":206,"line":349},25,[204,351,352],{},"\u002F\u002F--- 時計の補正の影響を受けない（カウンターが一周してもuintの引き算で正しく求まる）。\n",[204,354,356],{"class":206,"line":355},26,[204,357,358],{},"\u002F\u002F--- 最初のダウンロードまではTimeGMT()で代用する。TimeCurrent()は使わない：\n",[204,360,362],{"class":206,"line":361},27,[204,363,364],{},"\u002F\u002F--- ブローカーのGMTオフセットは分からず、夏時間で変わるため。\n",[204,366,368],{"class":206,"line":367},28,[204,369,370],{},"datetime SMT_Now()\n",[204,372,374],{"class":206,"line":373},29,[204,375,376],{},"{\n",[204,378,380],{"class":206,"line":379},30,[204,381,382],{},"   if(!smt_clockSynced) return TimeGMT();\n",[204,384,386],{"class":206,"line":385},31,[204,387,388],{},"   uint elapsedMs = GetTickCount() - smt_syncTick;\n",[204,390,392],{"class":206,"line":391},32,[204,393,394],{},"   return (datetime)(smt_serverTime + elapsedMs \u002F 1000);\n",[204,396,398],{"class":206,"line":397},33,[204,399,400],{},"}\n",[204,402,404],{"class":206,"line":403},34,[204,405,258],{"emptyLinePlaceholder":257},[204,407,409],{"class":206,"line":408},35,[204,410,411],{},"\u002F\u002F--- ブローカーの時計とUTCの差（秒、7200 = GMT+2）。これ単体でも便利：\n",[204,413,415],{"class":206,"line":414},36,[204,416,417],{},"\u002F\u002F--- ほとんどのEAはこの値を知らない。TimeCurrent()は最後のティックの時刻なので、\n",[204,419,421],{"class":206,"line":420},37,[204,422,423],{},"\u002F\u002F--- 週末ではなく、市場が開いているあいだに読むこと。\n",[204,425,427],{"class":206,"line":426},38,[204,428,429],{},"int SMT_BrokerGmtOffsetSeconds()\n",[204,431,433],{"class":206,"line":432},39,[204,434,376],{},[204,436,438],{"class":206,"line":437},40,[204,439,440],{},"   return (int)(TimeCurrent() - SMT_Now());\n",[204,442,444],{"class":206,"line":443},41,[204,445,400],{},[204,447,449],{"class":206,"line":448},42,[204,450,258],{"emptyLinePlaceholder":257},[204,452,454],{"class":206,"line":453},43,[204,455,456],{},"\u002F\u002F--- n番目のカンマより後ろすべて（CSVのタイトル。タイトル自体にカンマを含むことがある）\n",[204,458,460],{"class":206,"line":459},44,[204,461,462],{},"string SMT_AfterComma(const string line, const int n)\n",[204,464,466],{"class":206,"line":465},45,[204,467,376],{},[204,469,471],{"class":206,"line":470},46,[204,472,473],{},"   int pos = -1;\n",[204,475,477],{"class":206,"line":476},47,[204,478,479],{},"   for(int i = 0; i \u003C n; i++)\n",[204,481,483],{"class":206,"line":482},48,[204,484,485],{},"   {\n",[204,487,489],{"class":206,"line":488},49,[204,490,491],{},"      pos = StringFind(line, \",\", pos + 1);\n",[204,493,495],{"class":206,"line":494},50,[204,496,497],{},"      if(pos \u003C 0) return \"\";\n",[204,499,501],{"class":206,"line":500},51,[204,502,503],{},"   }\n",[204,505,507],{"class":206,"line":506},52,[204,508,509],{},"   string rest = StringSubstr(line, pos + 1);\n",[204,511,513],{"class":206,"line":512},53,[204,514,515],{},"   StringReplace(rest, \"\\\"\\\"\", \"\\\"\");\n",[204,517,519],{"class":206,"line":518},54,[204,520,521],{},"   if(StringLen(rest) >= 2 && StringGetCharacter(rest, 0) == '\"')\n",[204,523,525],{"class":206,"line":524},55,[204,526,527],{},"      rest = StringSubstr(rest, 1, StringLen(rest) - 2);\n",[204,529,531],{"class":206,"line":530},56,[204,532,533],{},"   return rest;\n",[204,535,537],{"class":206,"line":536},57,[204,538,400],{},[204,540,542],{"class":206,"line":541},58,[204,543,258],{"emptyLinePlaceholder":257},[204,545,547],{"class":206,"line":546},59,[204,548,549],{},"\u002F\u002F--- 今後2日分をダウンロード（範囲には直近6時間も含まれる）\n",[204,551,553],{"class":206,"line":552},60,[204,554,555],{},"bool SMT_Download()\n",[204,557,559],{"class":206,"line":558},61,[204,560,376],{},[204,562,564],{"class":206,"line":563},62,[204,565,566],{},"   string url = \"https:\u002F\u002Fshowmytrades.com\u002Fapi\u002Fpublic\u002Fcalendar\u002Fv1?format=csv&days=2&impact=\" + SMT_Impact;\n",[204,568,570],{"class":206,"line":569},63,[204,571,572],{},"   if(StringLen(SMT_Currencies) > 0) url += \"&currency=\" + SMT_Currencies;\n",[204,574,576],{"class":206,"line":575},64,[204,577,258],{"emptyLinePlaceholder":257},[204,579,581],{"class":206,"line":580},65,[204,582,583],{},"   char   post[], result[];\n",[204,585,587],{"class":206,"line":586},66,[204,588,589],{},"   string headers;\n",[204,591,593],{"class":206,"line":592},67,[204,594,595],{},"   ResetLastError();\n",[204,597,599],{"class":206,"line":598},68,[204,600,601],{},"   int status = WebRequest(\"GET\", url, \"\", NULL, 10000, post, 0, result, headers);\n",[204,603,605],{"class":206,"line":604},69,[204,606,607],{},"   if(status != 200)\n",[204,609,611],{"class":206,"line":610},70,[204,612,485],{},[204,614,616],{"class":206,"line":615},71,[204,617,618],{},"      Print(\"[SMT] calendar download failed: HTTP \", status, \", error \", GetLastError(),\n",[204,620,622],{"class":206,"line":621},72,[204,623,624],{},"            \". Is https:\u002F\u002Fshowmytrades.com in Tools > Options > Expert Advisors > Allow WebRequest?\");\n",[204,626,628],{"class":206,"line":627},73,[204,629,630],{},"      smt_nextDownload = TimeCurrent() + 60; \u002F\u002F 1分後に再試行\n",[204,632,634],{"class":206,"line":633},74,[204,635,636],{},"      return false;\n",[204,638,640],{"class":206,"line":639},75,[204,641,503],{},[204,643,645],{"class":206,"line":644},76,[204,646,258],{"emptyLinePlaceholder":257},[204,648,650],{"class":206,"line":649},77,[204,651,652],{},"   string body = CharArrayToString(result, 0, WHOLE_ARRAY, CP_UTF8);\n",[204,654,656],{"class":206,"line":655},78,[204,657,658],{},"   string lines[];\n",[204,660,662],{"class":206,"line":661},79,[204,663,664],{},"   int n = StringSplit(body, '\\n', lines);\n",[204,666,668],{"class":206,"line":667},80,[204,669,258],{"emptyLinePlaceholder":257},[204,671,673],{"class":206,"line":672},81,[204,674,675],{},"   ArrayResize(smt_eventTime, 0);\n",[204,677,679],{"class":206,"line":678},82,[204,680,681],{},"   ArrayResize(smt_eventTitle, 0);\n",[204,683,685],{"class":206,"line":684},83,[204,686,687],{},"   for(int i = 1; i \u003C n; i++) \u002F\u002F 0行目はヘッダー\n",[204,689,691],{"class":206,"line":690},84,[204,692,485],{},[204,694,696],{"class":206,"line":695},85,[204,697,698],{},"      \u002F\u002F 最終行 \"# server_time=1760702400 server_time_iso=...\"：サーバーのUTC時刻\n",[204,700,702],{"class":206,"line":701},86,[204,703,704],{},"      if(StringFind(lines[i], \"# server_time=\") == 0)\n",[204,706,708],{"class":206,"line":707},87,[204,709,710],{},"      {\n",[204,712,714],{"class":206,"line":713},88,[204,715,716],{},"         long serverTime = StringToInteger(StringSubstr(lines[i], 14, 10));\n",[204,718,720],{"class":206,"line":719},89,[204,721,722],{},"         if(serverTime > 0)\n",[204,724,726],{"class":206,"line":725},90,[204,727,728],{},"         {\n",[204,730,732],{"class":206,"line":731},91,[204,733,734],{},"            smt_serverTime  = serverTime;\n",[204,736,738],{"class":206,"line":737},92,[204,739,740],{},"            smt_syncTick    = GetTickCount();\n",[204,742,744],{"class":206,"line":743},93,[204,745,746],{},"            smt_clockSynced = true;\n",[204,748,750],{"class":206,"line":749},94,[204,751,752],{},"         }\n",[204,754,756],{"class":206,"line":755},95,[204,757,758],{},"         continue;\n",[204,760,762],{"class":206,"line":761},96,[204,763,764],{},"      }\n",[204,766,768],{"class":206,"line":767},97,[204,769,770],{},"      string f[];\n",[204,772,774],{"class":206,"line":773},98,[204,775,776],{},"      if(StringSplit(lines[i], ',', f) \u003C 8) continue;\n",[204,778,780],{"class":206,"line":779},99,[204,781,782],{},"      int k = ArraySize(smt_eventTime);\n",[204,784,786],{"class":206,"line":785},100,[204,787,788],{},"      ArrayResize(smt_eventTime, k + 1);\n",[204,790,792],{"class":206,"line":791},101,[204,793,794],{},"      ArrayResize(smt_eventTitle, k + 1);\n",[204,796,798],{"class":206,"line":797},102,[204,799,800],{},"      smt_eventTime[k]  = (datetime)StringToInteger(f[0]);      \u002F\u002F Unix秒、UTC\n",[204,802,804],{"class":206,"line":803},103,[204,805,806],{},"      smt_eventTitle[k] = f[2] + \" \" + f[3] + \": \" + SMT_AfterComma(lines[i], 7);\n",[204,808,810],{"class":206,"line":809},104,[204,811,503],{},[204,813,815],{"class":206,"line":814},105,[204,816,817],{},"   smt_nextDownload = TimeCurrent() + MathMax(SMT_RefreshMinutes, 15) * 60;\n",[204,819,821],{"class":206,"line":820},106,[204,822,823],{},"   Print(\"[SMT] calendar: \", ArraySize(smt_eventTime), \" events loaded. UTC now \",\n",[204,825,827],{"class":206,"line":826},107,[204,828,829],{},"         TimeToString(SMT_Now(), TIME_DATE|TIME_MINUTES), \", broker clock is GMT\",\n",[204,831,833],{"class":206,"line":832},108,[204,834,835],{},"         (SMT_BrokerGmtOffsetSeconds() >= 0 ? \"+\" : \"\"), DoubleToString(SMT_BrokerGmtOffsetSeconds() \u002F 3600.0, 1));\n",[204,837,839],{"class":206,"line":838},109,[204,840,841],{},"   return true;\n",[204,843,845],{"class":206,"line":844},110,[204,846,400],{},[204,848,850],{"class":206,"line":849},111,[204,851,258],{"emptyLinePlaceholder":257},[204,853,855],{"class":206,"line":854},112,[204,856,857],{},"\u002F\u002F--- 停止時間帯に発表があるあいだtrue。reasonにはどの発表かが入る\n",[204,859,861],{"class":206,"line":860},113,[204,862,863],{},"bool SMT_IsNewsTime(string &reason)\n",[204,865,867],{"class":206,"line":866},114,[204,868,376],{},[204,870,872],{"class":206,"line":871},115,[204,873,874],{},"   reason = \"\";\n",[204,876,878],{"class":206,"line":877},116,[204,879,880],{},"   if(MQLInfoInteger(MQL_TESTER)) return false;   \u002F\u002F テスターではネットワークが使えない\n",[204,882,884],{"class":206,"line":883},117,[204,885,886],{},"   if(TimeCurrent() >= smt_nextDownload) SMT_Download();\n",[204,888,890],{"class":206,"line":889},118,[204,891,258],{"emptyLinePlaceholder":257},[204,893,895],{"class":206,"line":894},119,[204,896,897],{},"   datetime now = SMT_Now();\n",[204,899,901],{"class":206,"line":900},120,[204,902,903],{},"   for(int i = 0; i \u003C ArraySize(smt_eventTime); i++)\n",[204,905,907],{"class":206,"line":906},121,[204,908,485],{},[204,910,912],{"class":206,"line":911},122,[204,913,914],{},"      if(now >= smt_eventTime[i] - SMT_MinutesBefore * 60 && now \u003C= smt_eventTime[i] + SMT_MinutesAfter * 60)\n",[204,916,918],{"class":206,"line":917},123,[204,919,710],{},[204,921,923],{"class":206,"line":922},124,[204,924,925],{},"         reason = smt_eventTitle[i];\n",[204,927,929],{"class":206,"line":928},125,[204,930,931],{},"         return true;\n",[204,933,935],{"class":206,"line":934},126,[204,936,764],{},[204,938,940],{"class":206,"line":939},127,[204,941,503],{},[204,943,945],{"class":206,"line":944},128,[204,946,947],{},"   return false;\n",[204,949,951],{"class":206,"line":950},129,[204,952,400],{},[18,954,955,956,959],{},"処理の流れは次のとおりです。入力パラメーターからリクエストを組み立て、CSVをダウンロードし、イベントごとに時刻とラベルを1つずつ保持します。そのうえで、EAが知りたいただ1つの問い、",[156,957,958],{},"いま停止時間帯に発表が入っているか","に答えます。",[41,961,963],{"id":962},"ステップ3エントリーの前に毎回呼び出す","🔌 ステップ3：エントリーの前に毎回呼び出す",[18,965,966],{},"EAでこのファイルをインクルードし、ポジションを持つ前に確認します。",[46,968,971],{"className":198,"code":969,"filename":970,"language":200,"meta":55,"style":55},"#include \u003CSMT_NewsFilter.mqh>\n\nvoid OnTick()\n{\n   string news;\n   if(SMT_IsNewsTime(news))\n   {\n      Comment(\"News filter active: \", news);\n      return;                       \u002F\u002F ニュースの時間帯は新規エントリーしない\n   }\n   Comment(\"\");\n   \u002F\u002F ... エントリーのロジック ...\n}\n","YourEA.mq4",[53,972,973,978,982,987,991,996,1001,1005,1010,1015,1019,1024,1029],{"__ignoreMap":55},[204,974,975],{"class":206,"line":207},[204,976,977],{},"#include \u003CSMT_NewsFilter.mqh>\n",[204,979,980],{"class":206,"line":213},[204,981,258],{"emptyLinePlaceholder":257},[204,983,984],{"class":206,"line":219},[204,985,986],{},"void OnTick()\n",[204,988,989],{"class":206,"line":225},[204,990,376],{},[204,992,993],{"class":206,"line":231},[204,994,995],{},"   string news;\n",[204,997,998],{"class":206,"line":237},[204,999,1000],{},"   if(SMT_IsNewsTime(news))\n",[204,1002,1003],{"class":206,"line":243},[204,1004,485],{},[204,1006,1007],{"class":206,"line":248},[204,1008,1009],{},"      Comment(\"News filter active: \", news);\n",[204,1011,1012],{"class":206,"line":254},[204,1013,1014],{},"      return;                       \u002F\u002F ニュースの時間帯は新規エントリーしない\n",[204,1016,1017],{"class":206,"line":261},[204,1018,503],{},[204,1020,1021],{"class":206,"line":267},[204,1022,1023],{},"   Comment(\"\");\n",[204,1025,1026],{"class":206,"line":273},[204,1027,1028],{},"   \u002F\u002F ... エントリーのロジック ...\n",[204,1030,1031],{"class":206,"line":279},[204,1032,400],{},[18,1034,1035,1036,1039,1040,1043],{},"5つの入力パラメーター（",[53,1037,1038],{},"SMT_Currencies","、",[53,1041,1042],{},"SMT_Impact","、分単位の3つの値）は、ほかの設定と同じくEAのパラメーター画面に表示されます。チャートごとに別の値を設定できます。",[18,1045,1046,1047,1050,1051,1054],{},"再コンパイルしてEAをチャートにセットしたら、「エキスパート」タブを見てください。最初の行に",[53,1048,1049],{},"[SMT] calendar: N events loaded","と出ていれば動いています。指標の少ない日は",[53,1052,1053],{},"N","が0になることもありますが、それは正常で、エラーではありません。",[41,1056,1058],{"id":1057},"️-時刻時計ストラテジーテスター","⏱️ 時刻、時計、ストラテジーテスター",[18,1060,1061],{},"フィルターが正しい分に作動するかどうかは、次の3点で決まります。",[57,1063,1064,1072],{},[60,1065,1066],{},[63,1067,1068,1070],{},[66,1069],{},[66,1071],{},[76,1073,1074,1095,1112],{},[63,1075,1076,1081],{},[81,1077,1078],{},[31,1079,1080],{},"APIはUTCで返し、現在時刻も教えてくれる",[81,1082,1083,1086,1087,1090,1091,1094],{},[53,1084,1085],{},"ts","はUTCのUnixタイム（秒）です。ダウンロードのたびに末尾にサーバー自身の時刻（",[53,1088,1089],{},"# server_time=…","）が付き、",[53,1092,1093],{},"SMT_Now()","がそれをパソコンのティックカウンターで進めていきます。このカウンターはタイムゾーンにも夏時間にも影響されません。ブローカーのタイムゾーン、どこかの国の夏時間、VPSのタイムゾーン設定が正しいかどうか、そのどれにも左右されない仕組みです",[63,1096,1097,1105],{},[81,1098,1099],{},[31,1100,1101,1104],{},[53,1102,1103],{},"TimeCurrent()","は使わない",[81,1106,1107,1108,1111],{},"ブローカー時間はUTCからずれていて、そのずれはEAには分からず、しかも年に2回変わります。",[53,1109,1110],{},"SMT_BrokerGmtOffsetSeconds()","がこのずれを測ってくれるので、それ単体でも役に立ちますが、フィルター自体はこの値に頼っていません",[63,1113,1114,1119],{},[81,1115,1116],{},[31,1117,1118],{},"ストラテジーテスターではインターネットが使えない",[81,1120,1121,1122,1124],{},"テスターでは",[53,1123,149],{},"が無効になるため、バックテストでは関数が「ニュースなし」を返します。過去のデータでニュースフィルターを試すには過去のイベントを収めたローカルファイルが必要で、それはまた別の作業になります",[41,1126,1128],{"id":1127},"️-調整のしかた","🎛️ 調整のしかた",[1130,1131,1132,1147,1160,1170],"ul",{},[1133,1134,1135,1138,1139,1142,1143,1146],"li",{},[31,1136,1137],{},"保有ポジション","：このコードが止めるのは",[156,1140,1141],{},"新規","エントリーだけです。発表前に決済するか、損切りの幅を狭めるか広げるかは、戦略で決めることです。そのタイミングは同じ",[53,1144,1145],{},"SMT_IsNewsTime()","で分かります。",[1133,1148,1149,1152,1153,1155,1156,1159],{},[31,1150,1151],{},"通貨ペアの片方だけ","：ドルのニュースだけを気にするなら、",[53,1154,1038],{},"を",[53,1157,1158],{},"USD","にします。",[1133,1161,1162,1165,1166,1169],{},[31,1163,1164],{},"重要度「中」も含める","：",[53,1167,1168],{},"SMT_Impact = \"high,medium\"","にすると、対象のイベントはおよそ3倍になります。スキャルパーには向いていますが、スイングトレードのシステムには多すぎることがよくあります。",[1133,1171,1172,1165,1175,1178],{},[31,1173,1174],{},"祝日",[53,1176,1177],{},"impact=all","にすると、市場の祝日が終日のイベントとして含まれます。ほとんどのフィルターには不要なので、初期設定では除外しています。",[41,1180,1182],{"id":1181},"データを確かめる","🔍 データを確かめる",[18,1184,1185,1186,1190],{},"同じカレンダーは",[22,1187,1189],{"href":1188},"\u002Ftools\u002Feconomic-calendar","経済指標カレンダー","のページでも見られます。EAが「USD high: Nonfarm Payrolls」で停止したと表示したら、そのページで同じイベントと予想を確認でき、発表後は結果も確認できます。",[41,1192,1194],{"id":1193},"よくある質問","❓ よくある質問",[18,1196,1197],{},[31,1198,1199],{},"ShowMyTradesのアカウントは必要ですか？",[18,1201,1202,1203,1207],{},"不要です。経済指標カレンダーAPIは無料で公開されていて、キーもいりません。",[22,1204,1206],{"href":1205},"\u002Fguides\u002Fhow-to-verify-your-account","認証済みの公開ページ","が欲しいならShowMyTradesで口座を記録するとよいですが、ニュースフィルター自体はそれに依存しません。",[18,1209,1210],{},[31,1211,1212],{},"通信量はどのくらいですか？",[18,1214,1215],{},"チャート1枚につき15分に1回のリクエストで、1回あたり数KBです。1つのターミナルでEAを10個動かしても、1時間に40リクエストです。上限はIPアドレスごとに毎分600リクエストです。",[18,1217,1218],{},[31,1219,1220],{},"Forex Factoryを直接読めばよいのでは？",[18,1222,1223,1224,1227],{},"それもできますし、実際に多くのEAがそうしています。ただ、Forex Factoryの週次ファイルはIPアドレスごとに5分間で2回までしかダウンロードできないため、多数のターミナルを動かすVPSでは破綻します。",[53,1225,1226],{},"actual","（結果）の値もありません。ShowMyTradesのエンドポイントは通貨と重要度をサーバー側で絞り込み、返すデータは数KBだけで、定期的な取得（ポーリング）を前提に作っています。",[18,1229,1230],{},[31,1231,1232],{},"VPSの時計やタイムゾーンがずれています。それでもフィルターは正しい分に作動しますか？",[18,1234,1235],{},"はい。サーバーはダウンロードのたびにUTCの現在時刻をEAに伝え、EAはその時刻を自分で進め続けます。VPSのタイムゾーンが違っていても、時計が数分ずれていても影響はありません。VPSで夏時間の切り替えがあっても同じです。EAは経過時間を、時計ではなくティックカウンターで数えているからです。",[18,1237,1238],{},[31,1239,1240],{},"ダウンロードに失敗したら？",[18,1242,1243,1244,1247],{},"フィルターは最後に読み込んだカレンダーを使い続け、1分後に再試行します。一度も読み込めていない場合（起動したばかりで、インターネットにつながらないときなど）は「ニュースなし」を返すため、EAは取引します。それが困るなら、",[53,1245,1246],{},"ArraySize(smt_eventTime) == 0","をチェックして動作を決めてください。",[18,1249,1250],{},[31,1251,1252],{},"同じファイルはMT5でも使えますか？",[18,1254,1255,1256,1260],{},"はい、そのまま使えます。MT5には",[22,1257,1259],{"href":1258},"\u002Fguides\u002Fnews-filter-mt5-expert-advisor-built-in-calendar-or-api","独自の経済指標カレンダー","もあるので、使いやすいほうを選んでください。",[41,1262,1264],{"id":1263},"関連ガイド","🔗 関連ガイド",[1130,1266,1267,1273,1278,1285],{},[1133,1268,1269,1272],{},[22,1270,1271],{"href":37},"経済指標カレンダーAPIのリファレンス","：すべてのパラメーター、JSON形式、cTrader向けのWebSocket",[1133,1274,1275],{},[22,1276,1277],{"href":1258},"MT5のニュースフィルター：内蔵カレンダーとAPI、どちらを使う？",[1133,1279,1280,1284],{},[22,1281,1283],{"href":1282},"\u002Fguides\u002Fadd-a-news-filter-to-a-ctrader-cbot","cTraderのcBotにニュースフィルターを追加する","：HTTPが使えない環境で同じ考え方を実現",[1133,1286,1287,1291],{},[22,1288,1290],{"href":1289},"\u002Fguides\u002Flive-ea-results-on-your-sales-page","販売ページでEAのフォワード実績をリアルタイムに見せる方法","：EAが結果を出しはじめたら、それを見せる",[1293,1294],"hr",{},[18,1296,1297,1298,1302],{},"ニュースフィルターに必要なのは、1ページ分のコードとURLが1つだけです。EAがすでに",[22,1299,1301],{"href":1300},"\u002Fsignup","ShowMyTradesで記録されている","なら、ニュース前後で見送った取引の分だけ、ドローダウンが浅く済んでいることが記録に表れます。",[1304,1305,1306],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":55,"searchDepth":213,"depth":213,"links":1308},[1309,1310,1311,1312,1313,1314,1315,1316,1317],{"id":43,"depth":213,"text":44},{"id":142,"depth":213,"text":143},{"id":179,"depth":213,"text":180},{"id":962,"depth":213,"text":963},{"id":1057,"depth":213,"text":1058},{"id":1127,"depth":213,"text":1128},{"id":1181,"depth":213,"text":1182},{"id":1193,"depth":213,"text":1194},{"id":1263,"depth":213,"text":1264},"2026-10-17T00:00:00.000Z","MetaTrader 4には、EAから使える経済指標カレンダーがありません。無料のカレンダーAPI、インクルードファイル1つ、エントリー前に呼ぶ関数1つで、10分あれば組み込めます。MQL4のコードを全文掲載、APIキーは不要です。",false,"md",{"src":1323},"\u002Fimages\u002Fblog\u002Fadd-a-news-filter-to-your-mt4-expert-advisor-hero.svg",{},"\u002Fja\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor",{"title":5,"description":1319},"ja\u002F3.guides\u002F41.add-a-news-filter-to-your-mt4-expert-advisor",null,"C7SWvlwpW-n07PU7OWiQ6pzsuLDhGsPalTv5EOcFWac",[1331,1336],{"title":1332,"path":1333,"stem":1334,"description":1335,"children":-1},"1つのページに複数の取引口座を表示する方法","\u002Fja\u002Fguides\u002Fshow-multiple-trading-accounts-on-one-page","ja\u002F3.guides\u002F40.show-multiple-trading-accounts-on-one-page","複数の口座、EA、ブローカーを1つのWebページにまとめる方法です。1口座1行のリアルタイム比較表、チャートの横並び、1本に合算した曲線の3通りを、コード付きで紹介します。",{"title":1277,"path":1337,"stem":1338,"description":1339,"children":-1},"\u002Fja\u002Fguides\u002Fnews-filter-mt5-expert-advisor-built-in-calendar-or-api","ja\u002F3.guides\u002F42.news-filter-mt5-expert-advisor-built-in-calendar-or-api","MetaTrader 5には、EAがダウンロードなしで読み取れる経済指標カレンダーが内蔵されています。それで足りる場合と足りない場合、そして代わりに無料のカレンダーAPIを使う方法を、両方のMQL5コード付きで解説します。",[1341,1343,1345,1347,1348],{"path":1342},"\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor",{"path":1344},"\u002Fde\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor",{"path":1346},"\u002Fes\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor",{"path":1325},{"path":1349},"\u002Fzh\u002Fguides\u002Fadd-a-news-filter-to-your-mt4-expert-advisor",1794154045720]