CSVデータのiBarShift関数の問題についての質問

 

現在、CSVファイルから日時とバランスデータを正しく読み取ることができていますが、 iBarShift 関数で取得されるバーの位置( pos )が期待される範囲外にあるため、バランスの値が正しく反映されません。具体的には、バーの位置が実際のバー数を超えていることがあります。この問題の解決方法についてアドバイスをいただけないでしょうか?

現在のコードの主要部分は以下の通りです:

int OnInit() { ... int pos = iBarShift(NULL, 0, dt, false); if (pos >= 0 && pos < ArraySize(BalanceBuffer)) { BalanceBuffer[pos] = balance; } ... }

何かアドバイスをいただけると助かります。よろしくお願いします。

 
Yuta_N:

現在、CSVファイルから日時とバランスデータを正しく読み取ることができていますが、 iBarShift 関数で取得されるバーの位置( pos )が期待される範囲外にあるため、バランスの値が正しく反映されません。具体的には、バーの位置が実際のバー数を超えていることがあります。この問題の解決方法についてアドバイスをいただけないでしょうか?

現在のコードの主要部分は以下の通りです:

int OnInit() { ... int pos = iBarShift(NULL, 0, dt, false); if (pos >= 0 && pos < ArraySize(BalanceBuffer)) { BalanceBuffer[pos] = balance; } ... }

何かアドバイスをいただけると助かります。よろしくお願いします。

情報が少ないために、アドバイスが難しいと思います。


現在のコードの主要部分は以下の通りです:

int OnInit() { ... int pos = iBarShift(NULL, 0, dt, false); if (pos >= 0 && pos < ArraySize(BalanceBuffer)) { BalanceBuffer[pos] = balance; } ... }

引数に使用されている、"dt"が何の値かも不明ですし (文脈からCSVファイルから取得したものかもしれませんが)

" BalanceBuffer"は、インジケータのバッファですか?こんな感じで設定されています?

SetIndexBuffer(0,  BalanceBuffer, INDICATOR_DATA);


アドバイスですが、

もし、インジケータのバッファを扱う(使用する)のであれば、「OnInit()」イベント内で判断しないほうが良いと思います。


また、前回もアドバイスさせていただきましたが、コードを記載される際は、以下のスタイルを使用されることをおすすめします。

スタイル

 
Yutaka Okamoto #:

情報が少ないために、アドバイスが難しいと思います。


引数に使用されている、"dt"が何の値かも不明ですし (文脈からCSVファイルから取得したものかもしれませんが)

" BalanceBuffer"は、インジケータのバッファですか?こんな感じで設定されています?

SetIndexBuffer(0,  BalanceBuffer, INDICATOR_DATA);


アドバイスですが、

もし、インジケータのバッファを扱う(使用する)のであれば、「OnInit()」イベント内で判断しないほうが良いと思います。


また、前回もアドバイスさせていただきましたが、コードを記載される際は、以下のスタイルを使用されることをおすすめします。

度々アドバイスありがとうございます。 

スタイルの件、使い方がわかっておらず、そのままコードを張り付けてしまってました。

以下が現在のコードと対応するデバッグメッセージです。 データは正しく読み込まれバッファに格納されているように見えますが、残高グラフが正しく表示されません。ご助言頂ければ幸いです。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 2

double BalanceBuffer[];
bool data_loaded = false;
const int MAX_BARS = 1000;

int OnInit()
{
    SetIndexBuffer(0, BalanceBuffer, INDICATOR_DATA);
    IndicatorSetString(INDICATOR_SHORTNAME, "Balance Display");
    ArraySetAsSeries(BalanceBuffer, true);
    return (INIT_SUCCEEDED);
}

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 limited_rates_total = MathMin(rates_total, MAX_BARS);

    if (!data_loaded)
    {
        string file_path = "tester_balance_history.csv";
        int file_handle = FileOpen(file_path, FILE_READ | FILE_CSV | FILE_ANSI);
        if (file_handle == INVALID_HANDLE)
        {
            Print("ファイルを開くことができませんでした: ", file_path);
            return (prev_calculated);
        }

        FileReadString(file_handle);
        FileReadString(file_handle);

        while (!FileIsEnding(file_handle))
        {
            string line = FileReadString(file_handle);
            string parts[];
            int parts_count = StringSplit(line, ',', parts);
            if (parts_count < 2)
            {
                Print("不正な行: ", line);
                continue;
            }

            string datetime_str = parts[0];
            string balance_str = parts[1];
            Print("読み込んだ行: ", line);

            double balance = StringToDouble(balance_str);
            datetime dt = StringToTime(datetime_str);
            int pos = iBarShift(NULL, 0, dt);

            datetime bar_time = iTime(NULL, 0, pos);
            Print("datetime_str: ", datetime_str, " balance: ", balance, " dt: ", dt, " pos: ", pos, " bar_time: ", bar_time);

            if (pos >= 0 && pos < limited_rates_total)
            {
                int buffer_index = limited_rates_total - 1 - pos;
                if (buffer_index >= 0 && buffer_index < limited_rates_total)
                {
                    BalanceBuffer[buffer_index] = balance;
                    Print("バッファにデータを格納: BufferIndex = ", buffer_index, " Balance = ", balance);
                }
                else
                {
                    Print("無効なバッファインデックス: BufferIndex = ", buffer_index);
                }
            }
            else
            {
                Print("無効なバー位置: pos = ", pos, " datetime = ", datetime_str, " dt = ", dt);
            }
        }

        FileClose(file_handle);
        data_loaded = true;
    }

    return (limited_rates_total);
}
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) 読み込んだ行: 2023/1/4 0:00,5990.2
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) datetime_str: 2023/1/4 0:00 balance: 5990.2 dt: 2023.01.04 00:00:00 pos: 374 bar_time: 2023.01.04 00:00:00
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) バッファにデータを格納: BufferIndex = 625 Balance = 5990.2
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) 読み込んだ行: 2023/1/5 0:00,4974.48
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) datetime_str: 2023/1/5 0:00 balance: 4974.48 dt: 2023.01.05 00:00:00 pos: 373 bar_time: 2023.01.05 00:00:00
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) バッファにデータを格納: BufferIndex = 626 Balance = 4974.48
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) 読み込んだ行: 2023/1/6 0:00,5083.52
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) datetime_str: 2023/1/6 0:00 balance: 5083.52 dt: 2023.01.06 00:00:00 pos: 372 bar_time: 2023.01.06 00:00:00
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) バッファにデータを格納: BufferIndex = 627 Balance = 5083.52
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) 読み込んだ行: 2023/1/9 0:00,3924.95
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) datetime_str: 2023/1/9 0:00 balance: 3924.95 dt: 2023.01.09 00:00:00 pos: 371 bar_time: 2023.01.09 00:00:00
2024.06.13 09:28:14.861 Balance_Display_20240612_1341_ (AUDUSD,D1) バッファにデータを格納: BufferIndex = 628 Balance = 3924.95

P.S. プログラミング初心者で、Chat GPTを使って開発をしており、知識に乏しいため、具体的なアドバイスをいただけると助かります。

 
残高グラフが正しく表示されません。

インジケータの「描画グラフ」の指定が見当たりませんが、どのようなグラフを描こうとされていますか?


#property indicator_plots   X

描画グラフの数なども記述が漏れているようです。


以下などの、ドキュメントをご一読されることをおすすめします。

描画スタイル

https://www.mql5.com/ja/docs/constants/indicatorconstants/drawstyles

指標スタイルの例

https://www.mql5.com/ja/docs/customind/indicators_examples


ロジックについては、ご自身の記述したいやり方があると思いますので、詳しくは読んでいません。:-)




MQL5のドキュメンテーション: 標準的な定数、 列挙と構造体 / 指標定数 / 描画スタイル
MQL5のドキュメンテーション: 標準的な定数、 列挙と構造体 / 指標定数 / 描画スタイル
  • www.mql5.com
カスタム指標 の作成時には、ENUM_DRAW_TYPE列挙体で指定されている(メインチャートウィンドウまたはグラフのサブウィンドウに表示される)18 種類のグラフィックプロットのいずれかを指定することが出来ます。 1 つのカスタム指標でどの 指標作成・描画タイプ...
 
Yutaka Okamoto #:

インジケータの「描画グラフ」の指定が見当たりませんが、どのようなグラフを描こうとされていますか?


#property indicator_plots   X

描画グラフの数なども記述が漏れているようです。


以下などの、ドキュメントをご一読されることをおすすめします。

描画スタイル

https://www.mql5.com/ja/docs/constants/indicatorconstants/drawstyles

指標スタイルの例

https://www.mql5.com/ja/docs/customind/indicators_examples


ロジックについては、ご自身の記述したいやり方があると思いますので、詳しくは読んでいません。:-)




ありがとうございます!

参考にさせて頂きます!