MQL5 半値インジケータ作った
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 仕様 [#s8e0c733]
日本時間の高値安値の半値を表示させるインジケータを作って...
* 感想 [#m3e1ac67]
3つ前までの半値インジケータの線が効いている
半値をローソク足が離れたら、そっちの方向が優勢ってことで...
しかし、途中で半値を下回ったら、何か異変ありということで...
* コード [#ba5b996c]
//+-----------------------------------------------------...
//| TimeHorizo...
//| Copyright 2024, Haya...
//| https://java.boy.jp/pukiwiki/index.php?%E3%80%90MQL...
//+-----------------------------------------------------...
#property copyright "Copyright 2024, Hayashi Kuniyuki"
#property link "https://java.boy.jp/pukiwiki/index....
#property version "1.00"
#property indicator_chart_window
#property indicator_plots 1
#property indicator_buffers 1
//--- 入力パラメータ
// input double LineLevel = 153.05; // ラ...
input color LineColor = clrRed; // ライ...
input int LineStyle = STYLE_SOLID; // ライ...
input int LineWidth = 1; // ライ...
input int targetCount = 6000; // 何個前のデータを対...
//--- グローバル変数
string lineName;
//+-----------------------------------------------------...
//| TimeSpan クラス - HH:MM形式の時間を扱う ...
//+-----------------------------------------------------...
class TimeSpan
{
private:
int m_hours; // 時間
int m_minutes; // 分
bool m_isValid; // 有効な時間かどうか
public:
// コンストラクタ
TimeSpan(string timeStr)
{
m_hours = 0;
m_minutes = 0;
m_isValid = false;
// "HH:MM" 形式から時間と分を抽出
string parts[];
StringSplit(timeStr, ':', parts);
if(ArraySize(parts) == 2)
{
m_hours = (int)StringToInteger(parts[0]);
m_minutes = (int)StringToInteger(parts[1]);
m_isValid = m_hours >= 0 && m_minutes >= 0 &...
}
if(!m_isValid)
{
Print("Invalid time format: ", timeStr, ". E...
}
}
bool isEqual(datetime checkTime)
{
MqlDateTime timeStruct;
TimeToStruct(checkTime, timeStruct);
return(timeStruct.hour == m_hours && timeStruct.m...
}
// 秒数に変換
int ToSeconds() const
{
return (m_hours * 3600) + (m_minutes * 60);
}
// 有効な時間かどうかを確認
bool IsValid() const
{
return m_isValid;
}
// 文字列表現を取得
string ToString() const
{
return StringFormat("%02d:%02d", m_hours, m_minu...
}
};
//+-----------------------------------------------------...
//| 時間計算用のヘルパーメソッド ...
//+-----------------------------------------------------...
datetime minus(datetime baseTime, string timeStr)
{
TimeSpan span(timeStr);
if(!span.IsValid())
return baseTime;
return baseTime - span.ToSeconds();
}
datetime plus(datetime baseTime, string timeStr)
{
TimeSpan span(timeStr);
if(!span.IsValid())
return baseTime;
return baseTime + span.ToSeconds();
}
//+-----------------------------------------------------...
//| 指定期間の高値と安値を取得する ...
//+-----------------------------------------------------...
void GetHighLowPrices(datetime startTime, datetime endTi...
{
highPrice = 0;
lowPrice = DBL_MAX;
int startBar = iBarShift(_Symbol, PERIOD_CURRENT, st...
int endBar = iBarShift(_Symbol, PERIOD_CURRENT, endT...
// バー数の大きい方を開始位置、小さい方を終了位置と...
int fromBar = MathMax(startBar, endBar);
int toBar = MathMin(startBar, endBar);
// 指定期間の高値と安値を計算
for(int i = fromBar; i >= toBar; i--)
{
double high = iHigh(_Symbol, PERIOD_CURRENT, i);
double low = iLow(_Symbol, PERIOD_CURRENT, i);
if(high > highPrice) highPrice = high;
if(low < lowPrice) lowPrice = low;
}
}
//+-----------------------------------------------------...
//| Custom indicator initialization function ...
//+-----------------------------------------------------...
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------...
//| トレンドラインを描画する ...
//+-----------------------------------------------------...
void DrawTrendLine(string name, datetime startTime, date...
{
// 既存のラインを削除
ObjectDelete(0, name);
// トレンドラインを作成
ObjectCreate(0, name, OBJ_TREND, 0, startTime, level...
// ラインのプロパティを設定
ObjectSetInteger(0, name, OBJPROP_COLOR, LineColor);
ObjectSetInteger(0, name, OBJPROP_STYLE, LineStyle);
ObjectSetInteger(0, name, OBJPROP_WIDTH, LineWidth);
ObjectSetInteger(0, name, OBJPROP_BACK, true);
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false)...
ObjectSetInteger(0, name, OBJPROP_SELECTED, false); ...
ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, false);...
ObjectSetInteger(0, name, OBJPROP_RAY_LEFT, false); ...
}
//+-----------------------------------------------------...
//| 指定された時刻が目標時刻と一致するかチェックする ...
//+-----------------------------------------------------...
bool isEqualTime(datetime checkTime, string targetTimeStr)
{
// チェックする時刻を文字列に変換(年.月.日 時:分 の...
string checkTimeStr = TimeToString(checkTime, TIME_D...
return(StringCompare(checkTimeStr, targetTimeStr, fa...
}
//+-----------------------------------------------------...
//| 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[])
{
int startIdx = MathMax(rates_total - targetCount, 0)...
int endIdx = rates_total - 1; // 最新のIndex
// デバッグ用:処理範囲の時間を出力
Print("Checking time range from ",
TimeToString(time[startIdx]),
" to ",
TimeToString(time[endIdx]));
// n本前から最新までループ(古い方から新しい方へ)
TimeSpan *timeSpan = new TimeSpan("09:00");
for(int i = startIdx; i <= endIdx; i++) {
if (timeSpan.isEqual(time[i])) {
// 高値と安値を格納する変数
double highPrice, lowPrice;
// 高値と安値を取得
datetime analyzeStartTime = minus(time[i], "09...
datetime analyzeEndTime = minus(time[i], "01:0...
GetHighLowPrices(analyzeStartTime, analyzeEndT...
double LineLevel = (highPrice + lowPrice) / ...
// トレンドラインを描画
datetime StartTime = minus(time[i], "01:00");
datetime EndTime = plus(time[i], "15:00");
// ラインの一意の名前を生成
lineName = "TLine_" + i;
DrawTrendLine(lineName, StartTime, EndTime, Li...
}
}
return(rates_total);
}
//+-----------------------------------------------------...
//| Custom indicator deinitialization function ...
//+-----------------------------------------------------...
void OnDeinit(const int reason)
{
// インジケータ終了時にラインを削除
ObjectDelete(0, lineName);
}
終了行:
* 仕様 [#s8e0c733]
日本時間の高値安値の半値を表示させるインジケータを作って...
* 感想 [#m3e1ac67]
3つ前までの半値インジケータの線が効いている
半値をローソク足が離れたら、そっちの方向が優勢ってことで...
しかし、途中で半値を下回ったら、何か異変ありということで...
* コード [#ba5b996c]
//+-----------------------------------------------------...
//| TimeHorizo...
//| Copyright 2024, Haya...
//| https://java.boy.jp/pukiwiki/index.php?%E3%80%90MQL...
//+-----------------------------------------------------...
#property copyright "Copyright 2024, Hayashi Kuniyuki"
#property link "https://java.boy.jp/pukiwiki/index....
#property version "1.00"
#property indicator_chart_window
#property indicator_plots 1
#property indicator_buffers 1
//--- 入力パラメータ
// input double LineLevel = 153.05; // ラ...
input color LineColor = clrRed; // ライ...
input int LineStyle = STYLE_SOLID; // ライ...
input int LineWidth = 1; // ライ...
input int targetCount = 6000; // 何個前のデータを対...
//--- グローバル変数
string lineName;
//+-----------------------------------------------------...
//| TimeSpan クラス - HH:MM形式の時間を扱う ...
//+-----------------------------------------------------...
class TimeSpan
{
private:
int m_hours; // 時間
int m_minutes; // 分
bool m_isValid; // 有効な時間かどうか
public:
// コンストラクタ
TimeSpan(string timeStr)
{
m_hours = 0;
m_minutes = 0;
m_isValid = false;
// "HH:MM" 形式から時間と分を抽出
string parts[];
StringSplit(timeStr, ':', parts);
if(ArraySize(parts) == 2)
{
m_hours = (int)StringToInteger(parts[0]);
m_minutes = (int)StringToInteger(parts[1]);
m_isValid = m_hours >= 0 && m_minutes >= 0 &...
}
if(!m_isValid)
{
Print("Invalid time format: ", timeStr, ". E...
}
}
bool isEqual(datetime checkTime)
{
MqlDateTime timeStruct;
TimeToStruct(checkTime, timeStruct);
return(timeStruct.hour == m_hours && timeStruct.m...
}
// 秒数に変換
int ToSeconds() const
{
return (m_hours * 3600) + (m_minutes * 60);
}
// 有効な時間かどうかを確認
bool IsValid() const
{
return m_isValid;
}
// 文字列表現を取得
string ToString() const
{
return StringFormat("%02d:%02d", m_hours, m_minu...
}
};
//+-----------------------------------------------------...
//| 時間計算用のヘルパーメソッド ...
//+-----------------------------------------------------...
datetime minus(datetime baseTime, string timeStr)
{
TimeSpan span(timeStr);
if(!span.IsValid())
return baseTime;
return baseTime - span.ToSeconds();
}
datetime plus(datetime baseTime, string timeStr)
{
TimeSpan span(timeStr);
if(!span.IsValid())
return baseTime;
return baseTime + span.ToSeconds();
}
//+-----------------------------------------------------...
//| 指定期間の高値と安値を取得する ...
//+-----------------------------------------------------...
void GetHighLowPrices(datetime startTime, datetime endTi...
{
highPrice = 0;
lowPrice = DBL_MAX;
int startBar = iBarShift(_Symbol, PERIOD_CURRENT, st...
int endBar = iBarShift(_Symbol, PERIOD_CURRENT, endT...
// バー数の大きい方を開始位置、小さい方を終了位置と...
int fromBar = MathMax(startBar, endBar);
int toBar = MathMin(startBar, endBar);
// 指定期間の高値と安値を計算
for(int i = fromBar; i >= toBar; i--)
{
double high = iHigh(_Symbol, PERIOD_CURRENT, i);
double low = iLow(_Symbol, PERIOD_CURRENT, i);
if(high > highPrice) highPrice = high;
if(low < lowPrice) lowPrice = low;
}
}
//+-----------------------------------------------------...
//| Custom indicator initialization function ...
//+-----------------------------------------------------...
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------...
//| トレンドラインを描画する ...
//+-----------------------------------------------------...
void DrawTrendLine(string name, datetime startTime, date...
{
// 既存のラインを削除
ObjectDelete(0, name);
// トレンドラインを作成
ObjectCreate(0, name, OBJ_TREND, 0, startTime, level...
// ラインのプロパティを設定
ObjectSetInteger(0, name, OBJPROP_COLOR, LineColor);
ObjectSetInteger(0, name, OBJPROP_STYLE, LineStyle);
ObjectSetInteger(0, name, OBJPROP_WIDTH, LineWidth);
ObjectSetInteger(0, name, OBJPROP_BACK, true);
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false)...
ObjectSetInteger(0, name, OBJPROP_SELECTED, false); ...
ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, false);...
ObjectSetInteger(0, name, OBJPROP_RAY_LEFT, false); ...
}
//+-----------------------------------------------------...
//| 指定された時刻が目標時刻と一致するかチェックする ...
//+-----------------------------------------------------...
bool isEqualTime(datetime checkTime, string targetTimeStr)
{
// チェックする時刻を文字列に変換(年.月.日 時:分 の...
string checkTimeStr = TimeToString(checkTime, TIME_D...
return(StringCompare(checkTimeStr, targetTimeStr, fa...
}
//+-----------------------------------------------------...
//| 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[])
{
int startIdx = MathMax(rates_total - targetCount, 0)...
int endIdx = rates_total - 1; // 最新のIndex
// デバッグ用:処理範囲の時間を出力
Print("Checking time range from ",
TimeToString(time[startIdx]),
" to ",
TimeToString(time[endIdx]));
// n本前から最新までループ(古い方から新しい方へ)
TimeSpan *timeSpan = new TimeSpan("09:00");
for(int i = startIdx; i <= endIdx; i++) {
if (timeSpan.isEqual(time[i])) {
// 高値と安値を格納する変数
double highPrice, lowPrice;
// 高値と安値を取得
datetime analyzeStartTime = minus(time[i], "09...
datetime analyzeEndTime = minus(time[i], "01:0...
GetHighLowPrices(analyzeStartTime, analyzeEndT...
double LineLevel = (highPrice + lowPrice) / ...
// トレンドラインを描画
datetime StartTime = minus(time[i], "01:00");
datetime EndTime = plus(time[i], "15:00");
// ラインの一意の名前を生成
lineName = "TLine_" + i;
DrawTrendLine(lineName, StartTime, EndTime, Li...
}
}
return(rates_total);
}
//+-----------------------------------------------------...
//| Custom indicator deinitialization function ...
//+-----------------------------------------------------...
void OnDeinit(const int reason)
{
// インジケータ終了時にラインを削除
ObjectDelete(0, lineName);
}
ページ名: