MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 174

 
mila.com:

こんにちは。

ファイルからのデータをヒストグラムで表示したいのですが、どうすればよいですか?

ファイル "file.txt "では、日付は数字に対応し、次のようになります。

29.03.2017.574391

30.03.2017.741308

31.03.2017.614367

こんな感じで、ファイルからデータを取得してプリントアウトしています。


ヒストグラムをバーの大きさで表示し、インジケーターのように見せる )

プリントアウトではなく、グラフィカルバッファにデータを入れるわけですね。ヒストグラムを描く日付を決め、そこにデータを入れる。
 
-Aleks-:

プリント上ではなく、グラフィックバッファにデータを入れるわけですね。ヒストグラムをプロットする日付を決定し、そこにデータを入れます。

そこが難しいところです。

一般的にファイルからデータを取得していることを明確にするために、プリントアウトしてみました。

該当する日付に割り当てる方法がわからない。

 
mila.com:

そこが難しいところです。

一般的にファイルからデータを取得していることを明確にするために、プリントアウトしてみました。

該当する日付に割り当てる方法がわからない。

ファイルから日付を取り、その日付からバーナンバーを探し、そこに描き込む...。
 
Alexey Viktorov:
ファイルから日付を取り、その日付からバーナンバーを探し、そこに描き込む...。

具体的にはどうするのですか?

見せてください。

 
mila.com:

具体的にはどうするのですか?

見せてください。

文字列関数を使用する。特に

string  StringSubstr(
   string  string_value,     // строка
   int     start_pos,        // с какой позиции начать
   int     length=0          // длина извлекаемой строки
   );

ゼロの位置から10文字を抜き出し、その文字列を日付に変換します。

しかし、文字列にバーのオープン 時間がない場合、D1以外のチャートで実行すると、ヒストグラムはすべてのバーに表示されません。

Строковые функции - Справочник MQL4
Строковые функции - Справочник MQL4
  • docs.mql4.com
Строковые функции - Справочник MQL4
 

私の友人は、私は注文が開かれたバーから始まるバーの数を 計算する関数を書くのを助けてください。

例えば、5本目に未決済の注文がある場合、この関数は5を返すべきです。

 
Bek001:

私の友人は、私は注文が開かれたバーから始まるバーの数を 計算する関数を書くのを助けてください。

例えば、5本目に未決済の注文がある場合、この関数は5を返すべきです。

int shift=iBarShift(NULL,PERIOD_СURRENT,OrderOpenTime());
 
Alexey Viktorov:

文字列関数を使用する。特に

ゼロの位置から10文字を抜き出し、その文字列を日付に変換します。

しかし、文字列にバーのオープンタイムが ない場合、D1以外のチャートで実行するとヒストグラムがすべてのバーに表示されません。

ありがとうございます。日付と値を別々に引っ張っています。

さて、これでどうやってバッファを満たせばいいのでしょうか?

 for(int i=0; i<limit;i++){

string InpFileName="file.txt";
 ResetLastError(); 
  int file_handle=FileOpen(InpFileName,FILE_TXT|FILE_READ);
   
   if(file_handle!=INVALID_HANDLE) 
     { 
      PrintFormat("Файл %s открыт для чтения",InpFileName); 
      PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH)); 
      //--- вспомогательные переменные 
      int    str_size; 
      string str,str_b1,str_dat1; 
      //--- прочитаем данные из файла 
      while(!FileIsEnding(file_handle)) 
        { 
         //--- узнаем сколько символов использовано для записи времени 
         str_size=FileReadInteger(file_handle,INT_VALUE); 
         //--- прочитаем строку 
         str=FileReadString(file_handle,str_size); 
         str_dat1= StringSubstr(str,0,10);
         str_b1= StringSubstr(str,12,6);
         //--- распечатаем строку 
         PrintFormat(str_dat1); 
         PrintFormat(str_b1);
        } 
      //--- закроем файл 
      FileClose(file_handle); 
      PrintFormat("Данные прочитаны, файл %s закрыт",InpFileName); 
     } 
   else 
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError()); 
    //}
   
      Range_Buffer[i]=//???
      }
 
mila.com:

ありがとうございます。日付と値を 別々に引っ張っています。

さて、これでどうやってバッファを満たせばいいのでしょうか?

Range_Buffer[i]=значение//???

ループでないとダメなんです。forループの中のwhileループが無駄になっている。1行を読んで、日付と値を引っ張ってきて作業するのです。時間ごとにバーの 数を求めて、そこに値を入れるのです。そして、その後に初めて次のエントリに進みます。

 
mila.com:

そこが難しいところです。

一般的にファイルからデータを取得していることを明確にするために、プリントアウトしてみました。

該当する日付に割り当てる方法がわからない。

1枚のレコードが1本の小節に対応しているかどうか?