首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MetaTrader4终端中获取当前毫秒?

如何在MetaTrader4终端中获取当前毫秒?
EN

Stack Overflow用户
提问于 2017-05-20 10:27:16
回答 6查看 7.5K关注 0票数 4

如何使用专家顾问从MQL4获取当前毫秒。

也就是说:在Java中,我们可以使用system.currenttimemillis()获得当前毫秒

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-06-09 18:25:15

MT4的“获得毫秒”问题已经存在了很长时间。这是我为解决这个问题而设计的一个黑客。

代码语言:javascript
复制
//+------------------------------------------------------------------+
//|                                                     timeInMs.mq4 |
//|                                       Copyright 2017, Joseph Lee |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Joseph Lee"
#property link      "https://www.facebook.com/joseph.fhlee"
#property version   "1.00"
#property strict

int     prevSecondTime      = 0;
uint    prevSecondTick      = 0;


int OnInit()    {
    // Create an Event that triggers every 1 millisecond.
    // **NOTE: GetTickCount() is accurate to 16ms only, so
    // in practice, no need to trigger every 1ms.
    EventSetMillisecondTimer(1);
    return(INIT_SUCCEEDED);
}

void OnTick() {
    Comment( "Now: " + TimeLocal() + " :: " + getCurrentMs() + " ms. +- 16ms accuracy.");
}

int getCurrentMs() {
    return(GetTickCount() - prevSecondTick);
}

// This is an EVENT function that will be called every
// x milliseconds [see EventSetMillisecondTimer() in OnInit()]
void OnTimer() {
    // If a new "second" occurs, record GetTickCount()
    if(TimeLocal() > prevSecondTime) {
        prevSecondTick  = GetTickCount();
        prevSecondTime  = TimeLocal();
    }
}
票数 3
EN

Stack Overflow用户

发布于 2017-05-23 14:41:36

可能有亲戚ms甚至我们

要小心,因为两者都是相对的,但是一个是关于系统启动的,另一个是关于MQL4代码执行单元启动的。

uint GetTickCount();函数返回自系统启动以来经过的的毫秒数。计数器受系统计时器的限制。时间是以无符号整数的形式存储的,因此,如果计算机不间断地工作,那么每隔49.7天时间就会被过度填充。

GetMicrosecondCount()函数返回自MQL程序启动以来经过的的微秒数。ulong GetMicrosecondCount();

可以有绝对毫秒,甚至我们,与康斯特(!)绝对错误,

这将显示出在精确测量时间时既没有任何漂移,也没有抖动。。

这不是很好的外汇领域,毫秒是“充满事件”的和微秒(在最近的专业级设计纳秒)重要吗?!

代码语言:javascript
复制
// -----------------------------------------------------------------
ulong system_currenttimemillis(){
      return(   OnStart_GLOB_MILLISECONDS       // ABS [ms] SYNC-ed OnStart() WITH [s]-EDGE-ALIGNMENT
            + (           GetMicrosecondCount() // + DELTA ------------------
              - OnStart_BASE_MICROSECONDS       //   since SYNC-ing OnStart()
                ) / 1000 // =================== //   DELTA [ms] =============
              );
}
// -----------------------------------------------------------------
static ulong    OnStart_GLOB_MICROSECONDS;
static ulong    OnStart_GLOB_MILLISECONDS;
static ulong    OnStart_EoDY_MICROSECONDS;
static datetime OnStart_EoDY_DATETIME;
static datetime OnStart_BASE_DATETIME;
static uint     OnStart_BASE_MILLISECONDS;
static ulong    OnStart_BASE_MICROSECONDS;
// -----------------------------------------------------------------
void            OnStart(){ /* { SCRIPT | EXPERT ADVISOR | CUSTOM INDICATOR } CALL
                                                                             THIS */
                OnStart_BASE_DATETIME      = TimeLocal();           // .SET int == the number of seconds elapsed since January 01, 1970.
         while( OnStart_BASE_DATETIME     == TimeLocal() ){ // ---- // EDGE-ALIGNMENT -------------------------------------------------------
                OnStart_BASE_MICROSECONDS  = GetMicrosecondCount(); //      .SET ulong, since MQL4 program launch
                OnStart_BASE_MILLISECONDS  = GetTickCount();        //      .SET uint,  since system start
         } // ==[ MAX 1 SECOND ]=============================== NOW // EDGE-ALIGNED TO [s] ==================================================
                OnStart_BASE_DATETIME      = TimeLocal();           // .SET date and time as the number of seconds elapsed since January 01, 1970.
                OnStart_GLOB_MICROSECONDS  = (       (ulong) OnStart_BASE_DATETIME ) * 1000000;
                OnStart_GLOB_MILLISECONDS  = (       (ulong) OnStart_BASE_DATETIME ) * 1000;
                OnStart_EoDY_DATETIME      =                 OnStart_BASE_DATETIME
                                           - (               OnStart_BASE_DATETIME % 86400 );
                OnStart_EoDY_MICROSECONDS  = (   TimeSecond( OnStart_BASE_DATETIME )
                                             + ( TimeMinute( OnStart_BASE_DATETIME )
                                               + TimeHour(   OnStart_BASE_DATETIME ) * 60 ) * 60 ) * 1000000;
}
// -----------------------------------------------------------------
int OnInit()    {
    OnStart();             /*   HACK 4 { EXPERT ADVISOR | CUSTOM INDICATOR } CALL
    ...                                                                      THAT */
    ..
    return( INIT_SUCCEEDED );
}
// -----------------------------------------------------------------
ulong Get_a_Microsecond_of_a_Day(){           // THIS HAS A !!_CONSTANT_!! ONLY ABSOLUTE SYSTEMATIC TIMING ERROR
      return( (   OnStart_EoDY_MICROSECONDS   // EDGE-SYNC OnStart_EoDY + DELTA-SINCE-OnStart-SYNC-ed:
              + (           GetMicrosecondCount()                       // == NOW ( 8B ulong ) ROLL-OVER ~ 213M504 DAYS AFTER THE PROGRAM START, WAY LONGER, THAN WE WILL LIVE UNDER THE SUN
                - OnStart_BASE_MICROSECONDS   //                        //  - OnStart_BASE_MICROSECONDS
                  )
                ) // ================== // SECONDS-EDGE-SYNC-ed DISTANCE FROM EoDY-EDGE
              % 86400000000             // MODULO DAY-LENGTH ROLL-OVER
              );                        // ALL DST-MOVs TAKE PLACE OVER WEEKENDS, SO NOT DURING TRADING-HOURS, SHOULD BE JUST-ENOUGH GOOD SOLUTION :o)
}
// -----------------------------------------------------------------
uint Get_a_Millisecond_of_a_Day(){      // IMMUNE TO A uint ROLL-OVER ~ 49.7 DAYS
     return( Get_a_Microsecond_of_a_Day()
           / 1000
             );
}
  • 此解决方案运行在所有{=自定义指示器}中。
票数 2
EN

Stack Overflow用户

发布于 2017-05-20 12:04:49

就像这样:

ulong time = GetTickCount(); // function(); time = GetTickCount()-time;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44084760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档