今、色んなスキャルピングの商材や書籍を読んで、EA作成や裁量トレードをやってるんですが、次の足まで何分あるのかが気になって仕方ない。
次のローソク足までの残り時間を算出して表示する自作インジケーターを作ってみました。
インジケーター実行イメージ
右上に、Remining time(残り時間)を、大きく表示するようにしてみました。
ちなみに、10秒以内になると赤字にしてみた。
地味だけど、5分足とか15分足の裁量トレードではとても便利
文字表示の場所
デフォルトは右上設定ですが、移動可能にしました。単なるCommentではなく、ObjectCreate関数でオブジェクト扱いにしたので動かせます。
インジケーターのダウンロード
ソースをビルドすれば使えるけど、ほしい方いますかね。
コメント欄にご連絡頂ければ渡します。
MQL4のソース
ソースコードは、残り時間の計算が面倒だけど、それ意外は簡単。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
//+------------------------------------------------------------------+ //| Reminig_Time.mq4 | //| Copyright 2020, Yanoteck | //| https://investment-vmoney.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, Yanoteck" #property link "https://investment-vmoney.com/" #property version "1.00" #property strict #property indicator_chart_window #property indicator_color1 clrWhite; //Remining time //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping ObjectCreate("Remining Time", OBJ_LABEL, 0, 0, 0); ObjectSet("Remining Time", OBJPROP_XDISTANCE, 20); ObjectSet("Remining Time", OBJPROP_YDISTANCE, 20); ObjectSet("Remining Time", OBJPROP_CORNER, 1); ObjectSet("Remining Time",OBJPROP_COLOR,indicator_color1); EventSetTimer(1); //--- return(INIT_SUCCEEDED); } int OnDeinit(){ ObjectDelete("Remining Time"); return 0; } //+------------------------------------------------------------------+ //| 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() { //--- Display_Remining_time("Remining Time"); } //+------------------------------------------------------------------+ //| Display Remining Time //| input string my_name : name | //+------------------------------------------------------------------+ void Display_Remining_time(string my_name){ string my_object = ""; //残り時間を秒で算出 int reminig_sec = (Time[0] + Period()*60) - TimeCurrent(); //残り時間の算出 int my_Hour = reminig_sec / (60 * 60); int my_Min = (reminig_sec / 60) % 60; int my_Sec = reminig_sec - (my_Min * 60) - (my_Hour * 60 * 60); //マイナス表示対策 MT4の次足表示までの切り替えで2、3秒誤差あり if(my_Sec < 0){ my_Sec = 0; } //文字列変換 string str_h =(string)my_Hour; string str_m = (string)my_Min; string str_s = (string)my_Sec; //残り10秒で赤字表示 if(my_Hour == 0 && my_Min == 0 && my_Sec <= 10){ ObjectSet(my_name,OBJPROP_COLOR,clrRed); }else{ ObjectSet(my_name,OBJPROP_COLOR,indicator_color1); } //表示 my_object = "Remining time = " + (string)str_h +":"+ (string)str_m + ":" + (string)str_s; ObjectSetText(my_name, my_object, 14); } |
アルゴリズム
この計算部分が全て。
1 2 3 4 5 6 7 |
//残り時間を秒で算出 int reminig_sec = Time[0] + Period()*60 - TimeCurrent(); //残り時間の算出 int my_Hour = reminig_sec / (60 * 60); int my_Min = (reminig_sec / 60) % 60; int my_Sec = reminig_sec - (my_Min * 60) - (my_Hour * 60 * 60); |
誤差がでてマイナス表示になる対策
ローカルタイムではなく、取引所の時刻を取得するTimeCurrent()を使っているためか、時々誤差が出ます。
マイナスカウントになっても足が変わらないみたいな事が結構発生します。回避するために、0カットしてます。
1 2 3 4 |
//マイナス表示対策 MT4の次足表示までの切り替えで2、3秒誤差あり if(my_Sec < 0){ my_Sec = 0; } |
残り10秒で赤字表示
これは必須じゃなかったけど、次の足の最初が、陽線なのか陰線なのかを判断する上でも、残り10秒で赤字にすると、かなり分かりやすかったので採用。
1 2 3 4 5 |
if(my_Hour == 0 && my_Min == 0 && my_Sec <= 10){ ObjectSet(my_name,OBJPROP_COLOR,clrRed); }else{ ObjectSet(my_name,OBJPROP_COLOR,indicator_color1); } |
課題
日本語だと、環境によっては文字化けする事もあるので、英語にしました。
ご質問はコメント欄からお願いします
コメント一覧 (2件)
やれ すばらしや
頑張って先読みアルゴちゅくっち21-*+
コメントありがとうございます。先読みは、AI使わないと無理なんですが、MT5だとpythonというプログラムと組み合わせて使えるので理論上は出来るかもと思ってます。チャレンジしてみます