【问题标题】:MT4 Time based entry signal in MetaTrader4MetaTrader4 中基于 MT4 时间的入场信号
【发布时间】:2010-01-22 12:59:14
【问题描述】:

有没有人有任何示例代码来说明如何在 Metatrader 4 中生成基于时间的入场信号?例如在每天的特定小时和分钟

【问题讨论】:

  • 您是否正在寻找其中的某个部分(例如,判断现在几点的逻辑、启动交易的逻辑等)?还是您正在寻找所有这些?
  • 只是在寻找方法。如果满足其他条件,我希望使用它在特定时间进行交易。

标签: finance quantitative-finance metatrader4 forex mql4


【解决方案1】:

我一直在研究这样的功能。它必须进行大量定制——我正在制作一个更通用的版本,它会变得如此庞大和乏味,它需要自己的include 文件。但是能够在不更改代码的情况下将其粘贴在不同的图表上是值得的。这基本上是一个大案例陈述,我在这里已经针对每个单独的时间框架进行了定制。

你一直在做什么?感谢您对时间和外汇的关注!

bool existordertime( datetime time, int otype = -37 ) {
    // +---------------------------------------------------------------+
    // | this function is intended for use inside of if() and other conditionals
    // | usually called with TimeCurrent() example:
    // | 
    // | if ( !existordertime( TimeCurrent() ) )
    // | 
    // | it accepts a datetime. A datetime is:
    // | a number of seconds elapsed from 00:00 January 1, 1970
    // | they can be treated as integers as such or accessed with other functions
    // | so that if statements can be commented in and out easily based on what 
    // | timeframe we plan on looking at.
    // | there is an optional parameter for an order type if you need it.
    // | 
    // | KEEP IN MIND if you want to use this to trade something like a 5min 15min
    // | or 4hr your gonna need a lot of if statements like:
    // | 
    // | if (  MathMod( Minute() + 5, 5 ) == 0 )
    // | 
    // +------------------------------------------------------------------+
    for (int cnt = 0; cnt < OrdersTotal(); cnt++) {

        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

        if (OrderType() == otype || -37 == otype)

        // COMMENT OUT THE if()S YOU DON'T NEED HERE: 
        //                       also add new lines as needed
        // if (  MathMod( TimeMinute( time ) +  5,  5 ) == 0 )   //  5min chart
        // if (  MathMod( TimeMinute( time ) + 15, 15 ) == 0 )   // 15min chart
        // if (  MathMod( TimeMinute( time ) + 30, 30 ) == 0 )   // 30min chart
        // if (  MathMod( TimeHour(   time ) +  4,  4 ) == 0 )   // 4hour chart

        int dbOrderOpenTime = OrderOpenTime();                   // re-use SAVEs dbPOOL-access time ...

        if (                      TimeSeconds( time ) == TimeSeconds( dbOrderOpenTime ) )
            if (                  TimeMinute(  time ) == TimeMinute(  dbOrderOpenTime ) )
                if (              TimeHour(    time ) == TimeHour(    dbOrderOpenTime ) )
                    if (          TimeDay(     time ) == TimeDay(     dbOrderOpenTime ) )
                        if (      TimeMonth(   time ) == TimeMonth(   dbOrderOpenTime ) )
                            if (  TimeYear(    time ) == TimeYear(    dbOrderOpenTime ) )
                                return (TRUE);
    }

    for (cnt = 0; cnt < OrdersHistoryTotal(); cnt++) {

        OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);

        if (OrderType() == otype || -37 == otype)
        // COMMENT OUT THE if()S YOU DON'T NEED HERE: 
        //                       also add new lines as needed
        // if (  MathMod( TimeMinute( time ) +  5,  5 ) == 0 )   //  5min chart
        // if (  MathMod( TimeMinute( time ) + 15, 15 ) == 0 )   // 15min chart
        // if (  MathMod( TimeMinute( time ) + 30, 30 ) == 0 )   // 30min chart
        // if (  MathMod( TimeHour(   time ) +  4,  4 ) == 0 )   // 4hour chart

        int dbOrderOpenTime = OrderOpenTime();                   // re-use SAVEs dbPOOL-access time ...

        if (                      TimeSeconds( time ) == TimeSeconds( dbOrderOpenTime ) )
            if (                  TimeMinute(  time ) == TimeMinute(  dbOrderOpenTime ) )
                if (              TimeHour(    time ) == TimeHour(    dbOrderOpenTime ) )
                    if (          TimeDay(     time ) == TimeDay(     dbOrderOpenTime ) )
                        if (      TimeMonth(   time ) == TimeMonth(   dbOrderOpenTime ) )
                            if (  TimeYear(    time ) == TimeYear(    dbOrderOpenTime ) )
                                return (TRUE);
    }

    return (FALSE);
}

【讨论】:

  • 您的代码看起来不像代码。此外,它不能被人类编辑。你能帮忙把它缩进四个空格吗?它将增加可读性
  • @eeerahul 是的,对。 MQL4 社区有一个非常奇怪的习惯,生成 MQL 代码(C 语法)就好像他们必须为每个字符支付一美元......这个习惯是 IMO 不可改革的。上次看到类似那是在 360KB 软盘的时代,基于 LISP 的大型软件模块实际上被剥离,只保留语法上“必要”的字符,然后代码看起来非常相似,因为需要适应FDD 媒体的有限存储容量。 (孩子们几乎不会相信某些 PC 没有 HDD 并且从 FDD 启动 + 运行......嗯......)
  • @nbrooks 在您对代码块进行了多次重新编辑后,请注意,最初的意图是让作者的算法化方法保持不变。当您修改格式和逻辑时,您可能会被告知,通过Time[iShift(...)] 和其他主要项目对不同时间范围内的操作有更好的算法,这超出了要回答的问题的不那么明确的定义。代码块在初始问题的方向上没有做任何事情,而是广泛地重新读取 dbPOOL(不关心 .Select() 结果)
  • @user3666197 我不确定你在说什么。我唯一改变的是格式和语法,在你最初的编辑之后,这两者仍然不可读。我没有更改操作或调用顺序。此外,您在 if 语句中添加的奇怪间距在我见过的任何样式指南或 IDE 中都不是标准的——它还强制横向滚动查看所有代码。无论如何,它只是间距,对执行没有影响,所以我不确定你在做什么。
  • @nbrooks 别担心,让我震惊的是,一旦保存(格式化)编辑,您就删除/损坏了这些努力。这里没有太多新的发明。 Metatrader4/MQL4 社区的绝大多数安装基础不是专业的 C#/C++ 精英群体,因此概念的清晰性比 C 经验丰富的直觉更重要。当您反对 IDE/风格指南时,不用说,即使是专业圈子也不会对此发表意见 - 只需考虑汽车行业的 MISRA-C 要求,而不是硬实时内核/操作系统行业实践的相反优先级. MQL4 人可读性规则的易用性
【解决方案2】:

TimeLocal() 为您提供自 1970 年 1 月 1 日午夜以来本地计算机(终端客户端)的秒数。

TimeCurrent() 为您提供自 1970 年 1 月 1 日午夜以来您的经纪人计算机(服务器)的秒数。

您可以将其中任何一个转换为字符串,如下所示:

string ct = TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS);
Print("Client Time: ", ct);

string st = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
Print("Server Time: ", st);

您还可以像这样获取日期编号的各个元素:

Print("Year:",TimeYear(TimeCurrent())," Month:",TimeMonth(TimeCurrent()));

可以在here 找到 MQL4 在线程序员指南。

希望这会有所帮助。

干杯,

标记

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2023-03-25
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多