タイトル通りのコードです。ラウンドナンバーになっている価格に水平線を描画します。MQLの勉強も兼ねて書いてみました。
チャート・リーディングをする時にどのラウンドナンバーが意識されているか調べることが主な使用目的です。
使い方
基本的にはデフォルトのまま実行して良いと思います。
デフォルトでは「0にする桁数」(SelectedDigits)が「2」なので、ダブルオーに水平線を描画します。
もし下3桁が0(つまり、000)の価格に水平線を描画したい場合、「0にする桁数」を「3」にします。
コード(スクリプト版)
//-------------------------------------------------------------- // FileName : DrawHLineRoundNum_Script.mq4 // // Feature : This script draws horizontal lines at level of // round numbers. //-------------------------------------------------------------- #property copyright "Copyright 2020. PHILOJUAN" #property link "https://uhoho.hatenablog.jp/" #property version "1.00" #property strict #property script_show_inputs // ***************** パラメーター ***************** input int SelectedDigits = 2; // 0 にする桁数(下2桁を00にする場合は 2) input int Step = 1; // ステップ数(1 ~ 9の整数) extern int BarsToSearch = 0; // 検索対象とする本数(0 はチャート全体) input color LineColor = clrDarkTurquoise; // 水平線の色 input ENUM_LINE_STYLE LineStyle = STYLE_SOLID; // 水平線のスタイル //<簡単な説明> // SelectedDigits // 0 にする桁数。例えば、下2桁を00にする場合は 2 を入力。 // // Step // 下2桁を0(つまり、00)にしているとして実例を示すと・・・ // Step = 1 なら、価格の下3桁が 100 → 200 → 300 という幅で水平線を描画 // Step = 2 なら、価格の下3桁が 100 → 300 → 500 という値幅で水平線を描画 // Step = 3 なら、価格の下3桁が 100 → 400 → 700 という値幅で水平線を描画 // // BarsToSearch // キリ番表示範囲の上限と下限となる高値・安値を調べる時、1本前から // 何本前までを検索対象とするかを指定する。 // 0を指定した場合は、(現在足を除く)チャート上の全てのローソク足 // が対象となる。 int OnStart() { // 不正なパラメーターが指定された場合の処理 1 if((Digits < SelectedDigits) || (SelectedDigits < 1)){ Alert("Error : Read the message displayed on Expert!"); printf("「0にする桁数」が不正です。この通貨ペアの場合、指定できるのは 1 ~ %d です。", Digits); return(INIT_PARAMETERS_INCORRECT); } // 不正なパラメーターが指定された場合の処理 2 if(Step < 1 || Step > 9){ Alert("Error : Read the message displayed on Expert!"); printf("「ステップ数」が不正です。指定できるのは 1 ~ 9 です。"); return(INIT_PARAMETERS_INCORRECT); } // 不正なパラメーターが指定された場合の処理 3 if(BarsToSearch < 0 || (BarsToSearch > Bars - 1)){ Alert("Error : Read the message displayed on Expert!"); printf("「検索対象とする本数」が不正です。このチャートの場合、指定できるのは 0 ~ %d です。", Bars - 1); return(INIT_PARAMETERS_INCORRECT); } if(!BarsToSearch) BarsToSearch = Bars - 1; double LowestPrice = Low[iLowest( NULL, 0, MODE_LOW, BarsToSearch, 1)]; double HighestPrice = High[iHighest(NULL, 0, MODE_HIGH, BarsToSearch, 1)]; double multiplier = MathPow(10, Digits - SelectedDigits); // 乗数 int RoundPriceLow = (int)(LowestPrice * multiplier); // LowestPriceに乗数を掛けて、小数点以下を切捨て int RoundPriceHigh = (int)(HighestPrice * multiplier); // HighestPriceに乗数を掛けて、小数点以下を切捨て for(int i = RoundPriceLow, j = 0; i <= RoundPriceHigh; i += Step, j++){ double DrawPrice = i / multiplier; // 小数点の位置を元に戻した値 (multiplierはdouble型) string hLineName = "uhoRoundNumLine" + IntegerToString(j); // オブジェクト名を生成 // [備考] 他のオブジェクト名と被らないように、変わった名称の方が無難 if(ObjectFind(0, hLineName) < 0){ // 同じ名前のオブジェクトが無いかチェック ObjectCreate( 0, hLineName, OBJ_HLINE, 0, 0, DrawPrice); ObjectSetInteger(0, hLineName, OBJPROP_COLOR, LineColor); ObjectSetInteger(0, hLineName, OBJPROP_STYLE, LineStyle); ObjectSetInteger(0, hLineName, OBJPROP_WIDTH, 1); ObjectSetInteger(0, hLineName, OBJPROP_BACK, false); ObjectSetInteger(0, hLineName, OBJPROP_SELECTABLE, true); ObjectSetInteger(0, hLineName, OBJPROP_SELECTED, false); } } return(0); }
上述のスクリプトで描画した水平線を削除するコード
//-------------------------------------------------------------- // // FileName : DeleteHLineRoundNum_Script.mq4 // //-------------------------------------------------------------- #property copyright "Copyright 2020, PHILOJUAN" #property link "https://uhoho.hatenablog.jp/" #property version "1.00" #property strict void OnStart() { int numObj = ObjectsTotal(); for(int k = 0; k < numObj; k++){ string hLineName = "uhoRoundNumLine" + IntegerToString(k); if(ObjectFind(0, hLineName) >= 0) ObjectDelete(0, hLineName); } }