今回の記事はコメントで質問をくれた方に回答として作成しています。
同じ悩みを持っている方もいるかもしれないので、記事にしました。
毎秒の価格を取得するというのは、実際のところできないです。
理由はデータがないからです。
では、どのように毎秒の価格を取得するのかを説明したいと思います。
先に答えを言います。
【配列を作成して、毎秒の価格を保存する。】
前提条件として、
・5分も10分も前の指定秒の価格が知りたいわけではない。
・数秒、数十秒前の価格と現在の価格を比較したい。
・MT5を立ち上げた当初1分間は準備時間として取引等はしない。
・今回は1分間の価格をコメントで表示する。
という条件で作成してみます。
今回はBufferなどの難しい関数等は一切使用しません。
配布用のファイル
参考になるかわかりませんが、作成したデータを添付しました。
コードの解説
全てのコードは以下になります。
//+------------------------------------------------------------------+
//| Second_Price.mq5 |
//| Copyright 2022, Bomcler |
//| https://bomcler.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Bomcler"
#property link "https://bomcler.net"
#property version "1.00"
#property indicator_chart_window
//現在の価格を保存する変数
double now_price;
//毎秒の価格を保存する配列(60秒を想定しているので、60に設定しています。)
//180秒間監視したい場合は60を180に変更すれば可能です。
double second_price[60];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//Ontimerが動作する間隔の設定
EventSetTimer(1);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
//closeがOntimerでは使用できないので、変数now_priceに保存して参照できるようにしています。
now_price = close[rates_total-1];
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
//コメント内容を保存する変数textの初期化
string text = "";
//現在の秒数を保存する変数time
int time = int(TimeLocal()) % 60;
//second_priceのindexに変数timeを指定することによって、現在の秒数のindexに価格を保存できる。
second_price[time] = now_price;
//0秒から59秒までの価格をコメントで表示する処理
//ここから
for(int i=0; i<60; i=i++){
for(int a=0; a<5; a++){
text += IntegerToString(i+a) + "sec:" + second_price[i+a] + " ";
if(a%5 == 0) text += "\n";
}
}
Comment(text);
//ここまで
}
//+------------------------------------------------------------------+
コメント
【MQL5】毎秒の価格を取得する方法【MT5】の記事掲載ありがとうございます。
Second_Price.mq5のファイルを
MT5のエディターに設定し、コンパイル後、実行してみましたが、ビジー状態となり、
Comment 表示されません。
10分ほどビジー状態のままにしておいても、変化無く、Comment 表示されませんでした。
当記事に動作表示画面が掲載されていますので、当方の問題と推察しておりますが、原因不明です。
コメント後、「no indicator plot defined for indicator」という警告が出ています。
チャート表示中の通貨ペアに、挿入→インジケーター→Second_Price.ex5を設定しても、ビジー状態になります。
問題解決後にまた連絡したいと思います。
no indicator plot defined for indicatorはインジゲーターのプログラムなのにチャートに矢印や線が表示されるプログラムがないですよっていう警告です。無視で大丈夫です。
ビジー状態になる原因として考えられるのは、for文のところですね汗
すみません!
i++のところをi=i+5に変更してみてください。
追記 訂正です
9行目あたりの「コメント後」を「コンパイル後」に修正します。すみません。
i++のところをi=i+5に変更してみました。
ビジー状態 無くなりましたが、Comment 表示されません。
チャート表示中に インジケーターリスト→表示中のインジケーターで、Second_Price(Debugging)と表示されます。
コード内容まだ読み取れませんので、すみませんがよろしくお願いいたします。
MT5再インストールし、Second_Price.mq5設定しました。
Comment 表示しますが、2~3分後に Commentの数値が更新されなくなります。
当方の MT5の環境が影響していると思います。
通常、MT4で、トレードしているので、MT5に慣れていません。MQL5と共に勉強し、Second_Price.mq5が使えるようにしたいと思います。
2~3分後の検証は自分もしていませんでした。原因はわかりませんが、価格が更新されていないのではないでしょうか?
今回の記事は配列に各秒数の価格を保存することによって価格を取得することができることへの理解が目的です。
これからの自作EAまたはインジゲーター作成の資となれば幸いです。
Comment 連続表示されるようになりました。
ここから、自作EAの作成にとりかかります。
お手数煩わせてすみません。
本当に、ありがとうございました。