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

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

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

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

MQL

MQL(Meta Quotes Language)は、Meta Trader4(MT4)で用いられるプログラミング用語です。MQLによりEAやインジケーターの作成が可能。C言語で書かれているため、C言語の知識があれば簡単に扱うことができます。

Q&A

解決済

1回答

1075閲覧

MQL4で時間と曜日を表示する方法

mk88mk040101

総合スコア9

MQL4

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

MQL

MQL(Meta Quotes Language)は、Meta Trader4(MT4)で用いられるプログラミング用語です。MQLによりEAやインジケーターの作成が可能。C言語で書かれているため、C言語の知識があれば簡単に扱うことができます。

0グッド

0クリップ

投稿2022/04/09 16:25

FXのMT4を使う際にエキスパードアドバイザのビジュアルモードでの検証に時間と曜日を表示する簡単なインジケータが欲しいのですがMQL4の知識がありません。日時と時間は上手く表示させれるのですが、曜日は上手く表示させることが出来ません。
具体的には DayOfWeek によって返された 0~6 の整数値に switch - case 文 を使ってそれぞれの曜日を当てはめているのですが、インジケータをチャートにセットしたタイミングの値しか返されず、日をまたいでも値は更新されません。
OnTimer 関数を使うと良いとご教授を頂いたりしたのですが、どう書けば良いのでしょう?
又、より軽い処理で行う書き方等あれば、教えていただけると助かります。

初歩的な質問かも知れませんが分かる人いればよろしくお願いします。

実現したいこと

MT4のエキスパードアドバイザのビジュアルモードで時間と曜日を表示

該当のソースコード

#property copyright "Copyright"
#property link "http://"

#property indicator_chart_window

extern color BrokerTimeColor=Red;
extern int DistanceFromTopLeft=10;
extern double ZoomLevel=1;

extern color BrokerTimeColor_2=Red;
extern int DistanceFromTopLeft_2=260;
extern double ZoomLevel_2=1;

string WeekName = "";

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()

{
//---- indicators
ObjectCreate("Label_bt", OBJ_LABEL, 0, 0, 0); // Creating obj.
ObjectSet("Label_bt", OBJPROP_CORNER, 0); // Reference corner
ObjectSet("Label_bt", OBJPROP_XDISTANCE, DistanceFromTopLeftZoomLevel);// X coordinate
ObjectSet("Label_bt", OBJPROP_YDISTANCE, 30
ZoomLevel);// Y coordinate

ObjectCreate("Label_bt_2", OBJ_LABEL, 0, 0, 0); // Creating obj.
ObjectSet("Label_bt_2", OBJPROP_CORNER, 0); // Reference corner
ObjectSet("Label_bt_2", OBJPROP_XDISTANCE, DistanceFromTopLeft_2ZoomLevel_2);// X coordinate
ObjectSet("Label_bt_2", OBJPROP_YDISTANCE, 30
ZoomLevel_2);// Y coordinate

switch( DayOfWeek()){
case 0: WeekName = "Sunday"; break;
case 1: WeekName = "Monday"; break;
case 2: WeekName = "Tuesday"; break;
case 3: WeekName = "Wednesday"; break;
case 4: WeekName = "Thursday"; break;
case 5: WeekName = "Fryday"; break;
case 6: WeekName = "Saturday"; break;
default: WeekName = "";
}

//----
return(0);

}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{

//----
ObjectSetText("Label_bt",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS),20ZoomLevel,"Arial",BrokerTimeColor);
ObjectSetText("Label_bt_2",WeekName,20
ZoomLevel_2,"Arial",BrokerTimeColor_2);
//----
return(0);
}

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectDelete("Label_bt");
ObjectDelete("Label_bt_2");
//----
return(0);
}
//+------------------------------------------------------------------+

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

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

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

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

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

guest

回答1

0

ベストアンサー

このEAにあるファンクションは、init, start, deinitが定義されています。
initは、このEAが起動した直後や、時間軸を変更したときにのみ実行されます。
deinitは、時間軸切り替え時や、終了時にのみ実行されます。
startは、他者を含めた取引(tick)毎に実行されます。

ここで、サーバー時間と、曜日の表示は、startの中で記述されているので毎回更新されますが、肝心の曜日は、initが呼び出された時に設定した値のままです。
従って、init時の値しか表示できないことになります、
もし常に最新の曜日を表示したいのであれば、startの中で、曜日を表示する前に、initの中で行っているswitch(DayOfWeek()){......}を行えばいいのです。

また、タイマー割り込みで、曜日の文字列を更新するのであれば、
initでEventSetTimer(...);を行い、OnTimer関数で曜日文字列を更新するようにすればよいと思います。
各ファンクションの説明/使用方は、ネットをググれば直ぐに分かると思います。

投稿2022/04/09 17:49

編集2022/04/09 17:53
yu-ima

総合スコア249

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

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

mk88mk040101

2022/04/09 18:13

startの中にswitchを移動したところ正しく動作しました。 私はC言語を勉強していないので文法などちんぷんかんぷんだったのですがとても理解が深まりました。 回答ありがとうございました(_ _)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問