MQL4 中的日期时间算法
A datetime arithmetic in MQL4
我想定义一个 datetime
类型变量,它是 datetime
类型变量之间简单算术运算的结果。
我定义了:
datetime duration = ( TimeCurrent() - OrderOpenTime() );
datetime TmStop = StringToTime( "1970.01.01 16:00" );
但是当我在其他一些算术运算中或通常在这样的代码中调用它时
ExitBuy_H1 = ( duration > TmClose && ...
或这个
text[3]= "Duration: " + TimeToStr( duration, TIME_MINUTES );
没用。
TmStop
反而工作正常。
有人知道为什么吗?
datetime
是一个简单的整数,自 1970.01.01 00:00
以来经过的秒数。 duration
在你的例子中也是以秒为单位,即使它是 datetime
格式,当你需要它以分钟为单位时,除以 60。你的例子中的 TmClose
意味着 16*60*60 seconds
和当然,您可以将该整数与任何其他 int
进行比较,但这可能是什么原因呢?
如果您持仓超过 16 小时,则 duration > TmClose 为真。如果你想将秒(持续时间)的差异转换为时间,那么你将从 1970.01.01 00:00 + 持续时间秒数转换为时间。
不管怎样,你做这个计算的目的是什么?如果您想确保持有该特定头寸超过 x 小时,那么简单 bool holdMoreThanXHours = TimeCurrent()-OrderOpenTime()>x*PeriodSeconds(PERIOD_H1)
,如果您有几张未平仓单,请不要忘记重新选择每张票
事实 A) 代码,按原样,绝对没有任何问题。
//+------------------------------------------------------------------+
//| Test_Whosebug.mq4 |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
datetime duration = ( TimeCurrent() - OrderOpenTime() );
string txt = "Duration: " + TimeToStr( duration, TIME_MINUTES );
}
//+------------------------------------------------------------------+
0 error(s), 0 warning(s), compile time: 2000 msec 1 1
事实 B) 代码的完整 MCVE
上下文缺失。
Whosebug 要求用户 post 问题的完整 MCVE 表示。原来post.
没有满足这个要求
虽然 datetime
和 int
数据类型可以互换,但问题似乎并不存在隐藏在值表示的这个固有 "duality" 中,但必须在其他地方。
为什么?的主要嫌疑人是:
- 变量定义被另一个同名的变量屏蔽
- 变量定义范围超出(询问范围外的变量)
- db.Pool-操作 不是 前面有
OrderSelect()
我想定义一个 datetime
类型变量,它是 datetime
类型变量之间简单算术运算的结果。
我定义了:
datetime duration = ( TimeCurrent() - OrderOpenTime() );
datetime TmStop = StringToTime( "1970.01.01 16:00" );
但是当我在其他一些算术运算中或通常在这样的代码中调用它时
ExitBuy_H1 = ( duration > TmClose && ...
或这个
text[3]= "Duration: " + TimeToStr( duration, TIME_MINUTES );
没用。
TmStop
反而工作正常。
有人知道为什么吗?
datetime
是一个简单的整数,自 1970.01.01 00:00
以来经过的秒数。 duration
在你的例子中也是以秒为单位,即使它是 datetime
格式,当你需要它以分钟为单位时,除以 60。你的例子中的 TmClose
意味着 16*60*60 seconds
和当然,您可以将该整数与任何其他 int
进行比较,但这可能是什么原因呢?
如果您持仓超过 16 小时,则 duration > TmClose 为真。如果你想将秒(持续时间)的差异转换为时间,那么你将从 1970.01.01 00:00 + 持续时间秒数转换为时间。
不管怎样,你做这个计算的目的是什么?如果您想确保持有该特定头寸超过 x 小时,那么简单 bool holdMoreThanXHours = TimeCurrent()-OrderOpenTime()>x*PeriodSeconds(PERIOD_H1)
,如果您有几张未平仓单,请不要忘记重新选择每张票
事实 A) 代码,按原样,绝对没有任何问题。
//+------------------------------------------------------------------+
//| Test_Whosebug.mq4 |
//+------------------------------------------------------------------+
#property strict
void OnStart() {
datetime duration = ( TimeCurrent() - OrderOpenTime() );
string txt = "Duration: " + TimeToStr( duration, TIME_MINUTES );
}
//+------------------------------------------------------------------+
0 error(s), 0 warning(s), compile time: 2000 msec 1 1
事实 B) 代码的完整 MCVE
上下文缺失。
Whosebug 要求用户 post 问题的完整 MCVE 表示。原来post.
没有满足这个要求虽然 datetime
和 int
数据类型可以互换,但问题似乎并不存在隐藏在值表示的这个固有 "duality" 中,但必须在其他地方。
为什么?的主要嫌疑人是:
- 变量定义被另一个同名的变量屏蔽
- 变量定义范围超出(询问范围外的变量)
- db.Pool-操作 不是 前面有
OrderSelect()