今回は次足が出現するまでの秒数を表示するプログラムを作成しようと思います。
次足が出現するというのは現在のローソク足が確定するという意味も持つので、どちらもこのプログラムで対応できます。
今回紹介するコードは非常に簡単です。
カウントダウンインジゲータのダウンロード
本当にカウントダウンしかしません笑
他の機能は一切ありませんが、それゆえにカウントダウンの為のプログラムは非常にわかりやすいと思います。
めちゃくちゃ簡単すぎて配布する必要ある?って感じですが、参考にしてもらえたらと思います。
ソースコード
//+------------------------------------------------------------------+
//| CountDown.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
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
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[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
int time = int(TimeLocal()) % PeriodSeconds();
Comment(PeriodSeconds() - time);
}
//+------------------------------------------------------------------+
コードを見るとたいそうな感じがしますが、3行しか追加で記述していません。
全部新規作成のままです。
Ontimer関数に記述する。
OnTimer関数は一定時間ごとに呼び出される関数です。
新規作成するときにOnTimerのチェックボックスをチェックすれば自動で出現します。
出現しない場合は下記をコードの一番下に記述すればOKです。
void OnTimer(){
}
以下からOnTimer関数に記述するコードを解説します。
TimeLocal関数で現在の時間を取得する。
TimeLocal関数はtimeframe型でパソコンの現在時間を返してくれます。
timeframe型はint()で囲むことによって数値で取得することが可能です。
上記の関数を組み合わせることで現在時間を秒数で取得することができます。
この秒数を使って現在のローソク足が出現してからの経過時間を取得していきます。
どうやって?
チャートの時間足(5分足、15分足など)を秒数で取得して、あまりを求めると、経過時間を取得することができます。
PeriodSeconds関数でチャートの時間足を秒数で取得する。
PeriodSeconds関数はチャートの時間足を秒数で取得することができます。
この秒数でTimeLocal関数で取得した秒数の余りを計算することで現在の経過時間を取得することができます。
そして完成したコードが以下のコードです。
int time = int(TimeLocal()) % PeriodSeconds();
シンプルすぎ笑
説明長すぎという苦情は受け付けます笑
次にチャートの時間足の時間から経過時間を引くことで残りの秒数を取得することができます。
完成した2行のコードが下記のコードです。
int time = int(TimeLocal()) % PeriodSeconds();
Comment(PeriodSeconds() - time);
Comment関数内のコードが残り時間を計算する式です。
Comment関数については下記で説明します。
Comment関数とは
Comment関数は読んで字のごとくですが、コメントを表示してくれます。
表示される位置は画面左上一択です。場所を変更することはできません。
残り秒数を表示する場所を変更したい場合は、オブジェクトを作成して、座標を指定するのがいいと思います。
これで完成?かと思いきや実行してみると秒数が表示されません。
これはOnTimerを一定間隔で呼び出す準備ができていないからです。
EventSetTimer(1)で1秒ごとにOnTimer関数を呼び出す
OnInit関数内に下記のコードを記述するとOnTimerが動き出します。
int OnInit()
{
EventSetTimer(1);
//---
return(INIT_SUCCEEDED);
}
EventSetTimer関数内の引数は秒数を表しています。5秒に一回カウントダウンしたい場合は1を5に変更すれば実行できます。
カウントダウンを5秒ごとにするという意味については各自で納得いくまで考えていただけたらと思います笑僕は意味が分かりません笑
これで完成です。
まとめ
今回伝えたかったことは、このOntimer関数を使用することで、次のローソク足が出現した1秒後だけ実行したりすることができます。
これはエントリーポイントの結果を表示したりするときに有効です。
Tickごとに結果を表示してしまうと、〇と×が同時に出てしまったりと、バグの原因に鳴ったりしますので、OnTimer関数を使用するのをおすすめします。
今回はとてもシンプルでそんなん使う?って感じですが、かなり使い勝手がいいと思っています。
もしご要望等あればOnTimer関数を使っていろいろ作成作成しようと思っています。
コメントよろしくお願いします。
コメント
初めまして。こんにちわ。
mql5でプログラミングはじめたばかりの、岩手県花巻市在住、67歳の菊池 基と申します。
Ontimer関数の記事があり、興味深く、拝見させていただきました。
とても、簡潔で、分かりやすく解説されていたので、理解出来ました。
初めてのメールで、すみませんが、Ontimer関数に関係した問題があり、困っています。
急騰急落を初動で捉える方法を模索しています。
問題ですが、
「秒単位(任意)で、レートを監視し、任意pips以上の動きがあった時にエントリーする」
です。
試行錯誤で、
1.任意秒前のレート(Ask)は、EventSetTimer()で(Ask)を変数に保存
2.現在レートは、Askそのままで取得
3.任意pips以上の動き==(Ask)を変数に保存 - 現在レート
で出来ると思ったところ、1の任意秒前のレートの更新が出来なく、苦慮しています。
MQL5のリファレンスで、CopyTime、CopyRates 等調べたところ、1分までは取得出来るのですが、秒単位で取得できる方法が見つけられません。
秒単位(任意)のチャート監視間隔は 1秒間隔~59秒間隔で良いと思います。
参考になる事など、ご教授願えれば、幸いです。
秒単位(任意)
コメントありがとうございます。
数秒前のpipsは取得することはできないですね。
対処方法として、60の配列を準備し、毎秒保存しておく。というのは如何でしょうか。
配列のindexに現在の秒を指定して現在の価格を上書きしながら保存しておくことで、数秒前の価格を、参照することが可能と思慮します。
先程の回答でわからない点が有れば簡単なものですがサンプルを作成して記事にさせていただきますので、ご連絡ください。
返信コメントありがとうございます。
概要わかりましたが、初心者なので、済みませんが、サンプル作成お願いいたします。
コメント追加します。
過去(数秒前)のレートから、現在のレートを引いて、この差から(+なら上昇、-なら下降、
数値からpipsに換算できます。)
過去(数秒前)のレートの保存、取得方法が分かりません。
時系列配列を使えば良いらしい?ところまでは分かったのですが、この先、「SetIndexBuffer()関数で指標バッファに割り当てることで時系列配列となります。」という記事を見つけたのですが、意味と具体的にどのようにコードを書けば、時系列配列になるか分かりませんので、ご教授お願いいたします。
名前を「秒単位(任意)」から「hana」に変更します
毎秒の価格を取得する方法という記事を作成しましたので、参考にしてみてください。
また、シンプルなmq5のデータを添付していますので、ご活用ください。
「毎秒の価格を取得する方法」作成、記事掲載ありがとうございます。
速攻対応に驚いています。
今日、出かける予定があり、検証出来ない事が、とても残念です。
今、「とても嬉しい」の一言につきます。
ありがとうございました。