米国の代表的な株価指数である「S&P500」のチャートは、ほとんどのFX業者で表示させることができます。
また、米国の株価指数の上昇・下落は、翌日の東京市場の「米ドル/円」の値動きと強い相関関係があると言われています。
(「SP500」「US500」「SPXm」など、FXブローカーによって表記は様々ですが、ここでは
「SP500]と記載します。)
これらを利用し、前日のS&P500の終値(標準(冬)時間 米国時間16時 MT4時間23時 日本時間翌6時)が、前々日のS&P500の終値(同)よりも「0、5%」以上高ければ、その日の日本時間8時に「米ドル/円」を買い
反対に、前日のS&P500の終値(同)が、前々日のS&P500の終値よりも「0、5%」以上低ければ、その日の日本時間8時に「米ドル/円」を売る
つまり、
if(前日「SP500」(MT4時間22時59分(CLOSE)) ≧ 前々日「SP500」(同)×1、005)
午前8時(OPEN) USD/JPY OP_BUY
if(前日「SP500」(同) ≦ 前々日「SP500」(同)×0、995
午前8時(OPEN) USD/JPY OP_SELL
といったEAの構築を考えているのですが、なかなか上手くいきません。
上述のように、USD/JPYのトレードのエントリー条件に「S&P500」の値動き(過去のデータ)を取り込むためには、どのようなソースファイルを書けばよろしいのでしょうか?
また、米国の株式市場も日本同様に土、日、祝日、年末年始等は休場のため、「前日」「前々日」という指示では上手く実行されないかと思うのですが、どのようなソースファイルを書くのが最も適切なのでしょうか?
どなたか、MQL4に詳しい方がおられましたら、アドバイスを宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
こんな感じでどうでしょう?
サマー時間を求める関数は分からないので、ロジックで書いてみました。
日本時間をもとに 米国サマー時間を求めているので、米国時間に直してからチェックした方がいいかもしれません。
ただ、 日曜日が切り替わりなので問題はないかと思います。
終値の時間 15時, 14時のデータがなかった場合、その直前の時間を終値としています。
以上.
double Array[][6]; int nums; void xxx() { int time = ( CheckSummerTime_US( TimeLocal() ) ) ? 14: 15; // サマータイムによるチェック nums = ArrayCopyRates( Array, "SPX.pro", PERIOD_H1 ); // double_array[][6]配列に物理的にコピー int yesterday, before_yesterday; if ( ! GetSP500( Array, nums, time, yesterday,before_yesterday ) ) { Print ( "前日か、前々日のデータが見つけられなかった。" ); } else { Print ( "本日 : ", TimeLocal() ); Print ( "前日 : ", (datetime) Array[ yesterday][0], " 終値: ", Array[ yesterday][4] ); Print ( "前々日 : ", (datetime) Array[before_yesterday][0], " 終値: ", Array[before_yesterday][4] ); double d = Array[yesterday][4] / Array[before_yesterday][4]; if ( d >= 1.005 ) { // USD/JPY Buy } else if ( d <= 0.995 ) { // USD/JPY Sell } } } //+------------------------------------------------------------------+ // S & P 500の前日、前々日のポインターを求め。 // ary[][6] : 1時間足データ // nums : データ数 // time : 求める時間 // pos1 : 前日ポインタ // pos2 : 前々日ポインタ bool GetSP500( double &ary[][6], int nums, int time, int &pos1, int &pos2 ) { MqlDateTime dt; int ed, bd; int ep, bp; pos1 = -1; pos2 = -1; // 最初の前日データを探す for ( ep=0; ep < nums; ep++ ) { TimeToStruct( ary[ep][0], dt ); if ( dt.day != Day() ) break; // 今日ではない } if ( ep >= nums ) return ( false ); // 前日が見つからない。 ed = dt.day; // 前日 // 前日の中で、指定時間のデータを探す for ( ; ep < nums; ep++ ) { TimeToStruct( ary[ep][0], dt ); if ( dt.day != ed ) return ( false ); // 前日の指定時間のデータが無かった。 if ( dt.hour <= time ) break; } // 最初の前々日データを探す for ( bp=ep; bp < nums; bp++ ) { TimeToStruct( ary[bp][0], dt ); if ( dt.day != ed ) break; } if ( bp >= nums ) return ( false ); // 前々日が見つからない。 bd = dt.day; // 前々日 // 前々日の中で、指定時間のデータを探す for ( ; bp < nums; bp++ ) { TimeToStruct( ary[bp][0], dt ); if ( dt.day != bd ) return ( false ); // 指定時間のデータが無かった。 if ( dt.hour <= time ) { pos1 = ep; // 前日の指定時間データポインタ pos2 = bp; // 前々日の指定時間データポインタ return ( true ); // 前日、前々日のデータがあった。 } } return ( false ); // // 前々日の指定時間のデータが見つからない。 } //+------------------------------------------------------------------+ // 米国におけるサマータイムチェック 注. 時差による補正、現地時間の考慮はしていない。 // dt : 日本時間 (TimeLocal) // true : summer time // false : winter time bool CheckSummerTime_US( datetime dt ) { MqlDateTime dts ; MqlDateTime dts1; int dy; TimeToStruct( dt, dts ); if ( dts.mon < 3 ) return ( false ); else if ( dts.mon == 3 ) // 3月 { dts1 = dts; dts1.day= 1; dt = StructToTime( dts1 ); TimeToStruct( dt, dts1 ); // 3月1日の曜日を求める。 dy = ( 8 - dts1.day_of_week ); if ( dy == 8 ) dy = 1; // 8なら日曜日が1日 dy += 7; // 3月 第2日曜日 return ( dts.day >= dy ); // 夏時間? } else if ( dts.mon > 11 ) return ( false ); else if ( dts.mon < 11 ) return ( true ); else // 11月 { dts1 = dts; dts1.day= 1; dt = StructToTime( dts1 ); TimeToStruct( dt, dts1 ); // 11月1日の曜日を求める。 dy = ( 8 - dts1.day_of_week ); if ( dy == 8 ) dy = 1; // 8なら日曜日が1日 return ( dts.day <= dy ); // 夏時間? } } /**/ コード
投稿2022/03/09 11:31
編集2022/03/10 02:54総合スコア249
0
私も使ったことは無いのですが、
ArrayCopyRates : 配列に価格データをコピーし、コピーしたバー数を返す関数が使えるのではないでしょうか?
以下のように、[0][4]に前日の終値、[1][4]に前々日の終値が入ります。
前日、前々日とは、あくまでも営業日の事です。
時間を指定する場合は、PERIOD_H1として配列にある時間[?][0]をサーチしてから参照すればいいと思います。
また、配列の参照には、配列数(n)を確認して参照してください。
double double_array[][6]; // 0 - 時間
// 1 - 始値
// 2 - 安値
// 3 - 高値
// 4 - 終値
// 5 - 出来高
int n;
n = ArrayCopyRates( double_array, "SPX.pro", PERIOD_D1 ); // BigBossの場合
投稿2022/03/07 14:50
編集2022/03/07 16:01総合スコア249
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/10 05:58 編集