質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

1回答

1158閲覧

MT4のEAにて、1年を通して決まった時間にエントリー・決済させるための「標準時間」「夏時間」の切り替えに関する「エントリー条件」及び「決済条件」のコードの書き方

chahiro

総合スコア0

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2022/08/09 13:48

 MT4にて、毎日日本時間の午前9時に「米ドル/円」を買い、同15時に決済するEAを作成しています。
標準時間の時期では、「MT4時間 2時」が日本時間の9時で、「MT4時間 8時」が日本時間の15時になります。
3月の第2日曜日から11月の第1日曜日までは、米国のサマータイム制度により、夏時間の時期では、「MT4時間 3時」が日本時間の9時、「MT4時間 9時」が日本時間の15時になりますので、下記のようなコードを作成しました。

 3月の最も遅い第2日曜日は、「3月14日」ですよね。
まず、3月14日が何曜日かを「TimeDayOfWeek(SummerStart)」で返します。
3月14日が月曜日であれば「13日が日曜日」、火曜日であれば「12日が日曜日」となりますので、14日から「TimeDayOfWeek」の数値(月は1、火は2、水は3・・・を返す)を引いた日が第2日曜日になりますよね。
11月の「第1日曜日」も、同じ要領でコードを書いています。

「我ながら、良い方法を思い付いた」と思っていたのですが、何度かバックテストを実施してみたのですが、上手くいきませんでした。
すべて、「標準時間」(MT4時間 2時と8時)の方で取引されてしまっています。
下記のコードについて、どこか不備・不具合な箇所がありますでしょうか?
また、決まった時間でのトレードを繰り返す場合、どのようなコードが最も適切なのでしょうか?
時間トレードのEAを作成された経験のある方やMQL4に詳しい方がおられましたら、アドバイスを宜しくお願い致します。

datetime SummerStart;
datetime SummerEnd;
datetime tc=TimeCurrent();
int SummerTime;       //外部宣言

SummerStart=StringToTime(IntegerToString(Year())+".03.14");
SummerStart=SummerStart-TimeDayOfWeek(SummerStart)2460*60;

SummerEnd=StringToTime(IntegerToString(Year())+".11.07");
SummerEnd=SummerEnd-TimeDayOfWeek(SummerEnd)2460*60;

if(tc>SummerStart&&tc<SummerEnd)
{SummerTime=1;}
if(tc<SummerStart||tc>SummerEnd)
{SummerTime=0;}

//夏時間のエントリー及び決済
if(SummerTime==1&&DayOfWeek()!=0&&DayOfWeek()!=6&&Hour()==3&&TicketSB<1)
{TicketSB=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,0,0,0,clrRed);}
if(TicketSB>=1&&Hour()==9)
{TicketCloseSB=OrderClose(TicketSB,Lots,Bid,Slippage,clrRed);}

//標準時間のエントリー及び決済
if(SummerTime==0&&DayOfWeek()!=0&&DayOfWeek()!=6&&Hour()==2&&TicketHB<1)
{TicketHB=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,0,0,0,clrRed);}
if(TicketHB>=1&&Hour()==8)
{TicketCloseHB=OrderClose(TicketHB,Lots,Bid,Slippage,clrRed);}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

検索してみましたら次のような記事がヒットしました。
https://fx-metatrade-labo.com/programming/summertime/

「我ながら、良い方法を思い付いた」と思っていたのですが、

検索でヒットした記事と考え方は同じのようで、良い方法だと思いました。

下記のコードについて、どこか不備・不具合な箇所がありますでしょうか?

動かせる環境がないのでわからないのですが、
気になったのは次のコードです。

SummerStart=SummerStart-TimeDayOfWeek(SummerStart)2460*60;

2460のところは正しそうでしょうか?

投稿2022/08/10 10:48

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chahiro

2022/08/10 14:12

xg63ex2bさん、こんばんは! 早速のご返信、誠に有難うございます。 確認しましたところ、ご指摘の「2460」の箇所は、私が掲載する時に抜けていただけで、MQL4では、「*24*60*60」になっておりました。 ですので、おそらく、その他のどこかの箇所で、MQL4のソースファイルとしての不備があると思うのですが、その他の箇所でxg63ex2bさんがお気になるような要素はありませんでしょうか?
退会済みユーザー

退会済みユーザー

2022/08/10 15:42

コメントありがとうございます。 「datetime tc=TimeCurrent();」 tcの初期値はOnTickの中でしょうか? SummerTimeが0だから「//標準時間のエントリー及び決済」の方の処理がされているということですよね。 良い調査の方法はあまりわからないのですが、 tc、SummerStart、SummerEndを地道にprintして確認してみる感じになるのでしょうか。 1月から12月まで1年分のデータを実行したらtcが徐々にSummerStartとSummerEndの間に入ってくる流れになると思うのですがいかがでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問