OBJ_VLINE - ページ 2

 
また、毎回 オブジェクトを再作成する必要はありません。この場合、エラーログに4200 Object already existsと表示されてしまいますので、代わりに一度、初期化関数でオブジェクトを作成し、後で希望の日付に移動することができます。
 
Marco vd Heijden:
その代わり、初期化関数で一度オブジェクトを作成し、後で希望の日付に移動させることができます。

を使用すると、この問題を回避することができます。

ObjectDelete(0,"v_line");
ObjectCreate(0,"v_line",OBJ_VLINE,0,D'2019.06.04 16:00',0);
 

あるいはさらに、オブジェクトがすでに存在するかどうかを前もってチェック することもできます。

ObjectFind(...
 

Marco, Paul

ご回答とご協力ありがとうございました。

しかし、私が今直面している問題は、ファイルから取得した情報(日付)を変換し、それを使用して線を描くことです。

コードでは、ファイルはMT4ファイルセクションの# Linesとして保存され、保存された日付は例えば2019.05.18 05:30:00ですが、最初のステップでは、日付から下3桁を削除 し、変換します。

次のステップでは、時刻をD'形式にすることに失敗しました。

私は次のように試してみました。

 ObjectCreate(0,"v_line",OBJ_VLINE,0,"D'"+2019.05.18 05:30+"'",0);

しかし、それはうまくいかなかったので、私は文字列を時間に変換する

ObjectCreate(0,"v_line",OBJ_VLINE,0,StringToTime("D'"+2019.05.18 05:30+"'"),0);

どちらの場合も、行は1970.01.01 00:00に作成されます。問題は、ファイルからの日付を、MT4がVラインを作成するために使用できる意味のあるものに変換することです。

私はコードを添付しています、多分あなたは私の間違いを見つけることができます。コードでは、私は2つの行を作成しましたが、私はファイルから取得した日付に行のいずれも作成されていません。

ファイル:
TestDates.mq4  9 kb
 

日付を引用符で囲んで書くのは間違いです。

をそのまま書くと

D'2019.05.18 05:30'


ObjectCreate(0,"v_line",OBJ_VLINE,0,D'2019.05.18 05:30',0);
 
StringToTime("2019.05.18 05:30") == D'2019.05.18 05:30'

どちらもデータタイム です。ちょうど

StringToDouble("1.234") == 1.234
は両方ともdoubleである。
 
paul selvan:

日付を引用符で囲んで書くのは間違いです。

をそのまま書くと

D'2019.05.18 05:30'


私は、ウィリアム・ローダーが 上で説明したように、テキストを日付形式に変換しているので、そうしています。 私は、日付を正しく保存し、D'形式に変換しましたが、まだ行を作成することができないので、私の間違いがどこにあるかわかりません。

 
このような文字列からdatetimeへの 変換の代わりに、seconds since epochのような長い整数値として時間を保存したり読み取ったりする方が、より幸運だと思います。
 
Marco vd Heijden:
このような文字列から日付への 変換の代わりに、エポックからの秒数のような長い整数値として時間を保存したり読み取ったりする方が、より運が良いと思います。

日付は秒数を含めて保存され、例えばこれはファイルから取り出された時間です 2019.05.19 15:00:00

しかし、私はテスト中に、私は秒と日付を使用した場合、それは1970.01.01で 行を作成することがわかりました 私は秒を削除した理由ですが、まだ日付の正しい場所にファイルを作成することができません。

 

その場合、時間軸を見ることもできると思います。

struct MqlDateTime 
  { 
   int year;           // Year 
   int mon;            // Month 
   int day;            // Day 
   int hour;           // Hour 
   int min;            // Minutes 
   int sec;            // Seconds 
   int day_of_week;    // Day of week (0-Sunday, 1-Monday, ... ,6-Saturday) 
   int day_of_year;    // Day number of the year (January 1st is assigned the number value of zero) 
  };

以下のように

TimeToStruct()

という関数が あります。

datetime TimeExit_SymSymbol = (datetime) ObjectGetInteger(0, Exit_SymSymbol, OBJPROP_TIME1);

MqlDateTime str1;

TimeToStruct(TimeExit_SymSymbol,str1); 

そして、ここから必要な値をすべて抽出することができます。

int Year = str1.year;
int Month = str1.mon;
int Day = str1.day;
int Hour = str1.hour;
int Minutes = str1.min;
int Seconds = str1.sec;
これらは整数値であるため、文字列をいじる必要はありません。