时间框架之间的最高和最低低,并绘制一个矩形,可视化X天

时间:2015-05-31 07:24:25

标签: user-interface trading algorithmic-trading mql4 forex

我的目标是在图表上创建一个矩形对象,该对象可以测量指定时间范围内的最高点和最低点以及 X 天数?

a sample ScreenView

我知道如何为图表创建对象,但我不确定如何重复 X 天数。我怎样才能做到这一点?我想也许For循环会是一个好方法吗?我可以使用一些指导。

2 个答案:

答案 0 :(得分:1)

尝试此代码(EA交易)。好吧,它没有效率(因为它重新计算每个滴答),但我很好地演示了这个概念。 enter image description here

以及它的代码:

//+------------------------------------------------------------------+
//|                                            GeraldHighLowV0R1.mq4 |
//|               Copyright 2015, joseph.lee @ fs [dot] com [dot] my |
//|                                            http://www.fs.com.my/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, joseph.lee @ fs [dot] com [dot] my"
#property link      "http://www.fs.com.my/"
#property version   "1.00"
#property strict

extern int      viTimeOfDayStartHour    =  3;
extern int      viTimeOfDayEndHour      =  9;
extern int      viDaysToDraw            = 10;


void OnTick() {
    string      vsGlobalDebug           = "";
    datetime    vdCurrentDayStart       = iTime(Symbol(), PERIOD_D1, 0);    //Get Broker Today DateTime as of Midnight

    ObjectsDeleteAll();
    //---------------------------------------------------------------
    //Process [viDaysToDraw] number of days (**Sat/Sun is included)
    //---------------------------------------------------------------
    for(int viDay=0; viDay<viDaysToDraw; viDay++) {
        datetime vdDateOfSection        = vdCurrentDayStart-(viDay*PERIOD_D1*60);                       //Get Section Midnight DateTime
        datetime    vdSectionStart      = vdDateOfSection + (viTimeOfDayStartHour*PERIOD_H1*60);        //Add Hours to Mark start of section
        datetime    vdSectionEnd        = vdDateOfSection + (viTimeOfDayEndHour  *PERIOD_H1*60);        //Add Hours to mark End of section

        //----------------------------------------------------------------------
        //Calculate the number of bars between (inclusive) Start and End time
        //----------------------------------------------------------------------
        int     viSectionEndBarIndex         = iBarShift(Symbol(), PERIOD_CURRENT, vdSectionEnd,false);
        int     viSectionStartBarIndex       = iBarShift(Symbol(), PERIOD_CURRENT, vdSectionStart,false);
        int     viBarCountBtwStartAndEndHour = viSectionStartBarIndex-viSectionEndBarIndex+1;
        //-----------------------------------------------------------------

        //-----------------------------------------------------------------
        //Find the Highest/Lowest Bar index within the Day Section
        //-----------------------------------------------------------------
        int     viSectionHighestBar     = iHighest(Symbol(), PERIOD_CURRENT, MODE_HIGH, viBarCountBtwStartAndEndHour, viSectionEndBarIndex);
        int     viSectionLowestBar      = iLowest(Symbol(), PERIOD_CURRENT, MODE_LOW, viBarCountBtwStartAndEndHour, viSectionEndBarIndex);
        //-----------------------------------------------------------------

        //-----------------------------------------------------------------
        //Find the Highest/Lowest Price within the Day Section
        //-----------------------------------------------------------------
        double  viSectionHighestPrice   = iHigh(Symbol(), PERIOD_CURRENT, viSectionHighestBar);
        double  viSectionLowestPrice    = iLow( Symbol(), PERIOD_CURRENT, viSectionLowestBar);
        //-----------------------------------------------------------------

        //-----------------------------------------------------------------
        //Add Verbose/Debug Info for display
        //-----------------------------------------------------------------
        StringAdd(
            vsGlobalDebug, "\n[Day" + IntegerToString(viDay) + "]: "
                + "Start: "     + TimeToString(vdSectionStart)
                + ", Lowest: "  + DoubleToString(viSectionLowestPrice,Digits)
                + ", End: "     + TimeToString(vdSectionEnd)
                + ", Highest: " + DoubleToString(viSectionHighestPrice,Digits));
        //-----------------------------------------------------------------

        //-----------------------------------------------------------------
        //Crete Rectangle Object for the Day section
        //-----------------------------------------------------------------
        string  vsObjName   = "HLDay" + IntegerToString(viDay);
        ObjectCreate(0, vsObjName, OBJ_RECTANGLE, 0, vdSectionStart, viSectionLowestPrice, vdSectionEnd, viSectionHighestPrice);
        ObjectSetInteger(0, vsObjName, OBJPROP_COLOR, clrDarkGreen);
        ObjectSetInteger(0, vsObjName, OBJPROP_WIDTH, 0);
        ObjectSetInteger(0, vsObjName, OBJPROP_BACK, true);
        ObjectSetInteger(0, vsObjName, OBJPROP_SELECTABLE, false);
        //-----------------------------------------------------------------
    }
    ChartRedraw();

    //-----------------------------------------------------------------
    // Show Debug/Verbose Info
    //-----------------------------------------------------------------
    Comment("\n" + vsGlobalDebug );
}

答案 1 :(得分:0)

术语混淆避免

时间框架是市场事件流程的“基于时间的框架”的行业范围内被接受的术语,并且几十年来标准化了这样的含义。

由于自然时间流中周末相关的差距以及由于上面任务定义的性质,在下面的代码片段中,几个TimeFRAME层上并发地确实存在许多与TimeFRAME相关的操作(包括。PERIOD_D1PERIOD_H1并隐藏PERIOD_CURRENT依赖项(未知(隐式),因此完全避免使用))以便允许指针计数和后退索引更新(^ PTR-&gt; TimeSERIES)。

因此,在整个进一步开发过程中,让我们在您给定的任务定义下使用 aGreenBOX 的另一个术语,并以不同方式调用aTimeDOMAIN绑定属性 - aTimeWINDOW &amp; al(但不是TimeFRAME,好吗?)

参数化

最简单的形式将使用下面陈述的extern - s。值得注意的是,extern构造函数是危险的,以防您的GUI层应用程序变得更加智能和复杂,并且如果它直接连接到 XTO s(e X ecute- T rade- O 操作。

#property strict

extern int    aGreenBoxWindow_HOUR__ENDs = 7;      // aTimeWINDOW.ends <<- 05:00 - 07:00 [GMT-ABCD]
extern int    aGreenBoxWindow_HOURs_WIDE = 2;      // aTimeWINDOW.width
extern int    aGreenBoxWindow_nDAYs_BACK = 4;      // aTimeWINDOW.repeatDays
       int    aCallLockPTR               = 0; 
       string anObjNamePREFIX            = "aGreenBOX.id=";

警告

对于基于MT4的实时增强交易服务,其中XTO操作自动绑定/挂钩到某些GUI层元素( V isual-part of M < strong> V C - triade),extern构造函数绑定变量必须避免,因为它们的值有任何变化(由于MT4架构设计)导致复位&amp;你的 M odel&amp;中的非重新碰撞 C ontroller部分实时增强服务和此类交易服务对于使用和XTO将是致命的危险。

增强交易服务的参数化没有extern - s

为了实时运营的增强交易服务,有更好(更安全)的方法可以避免extern对正在运行的服务造成的破坏性影响。除了我最喜欢使用进程到进程/分布式计算消息传递的其他人,这主要使您的 MT4 -Terminal成为基于私有云的交易基础架构内的节点和您的MQL4 - EA开始在Symphonic管弦乐队内部与其他精心设计的乐器一起演奏(无论是AI / ML-NeuralNetwork决策计算过程,都是基于GPU的协方差矩阵评估器,用于投资组合优化量化模型,简单地说,就像这可以“直接”/“命令”MQL4 - 处理“内部” MT4 - 终端以平滑,不间断和实时,非阻塞,完全异步的方式,听起来不是很吸引人吗?Yes, it does!查看this一旦转到约1 [ms]而不是

一个简单的解决方案 - 一个CPU有效的低PRIO方法的例子

一旦进入UI设计领域,您的(最初隐藏的)问题称为UI控制循环和整体UI响应(UI响应您的 MMI <移动的速度有多快/ strong>(M an - M achine - I nterface)和外部“输入”流(鼠标点击/鼠标移动/鼠标拖动 - &amp; - drop / aMarketEVENT / et al)。

必须实施合理的策略,以避免对重复性任务进行无效调用,这些任务不会给XTO / MVC优先级/ MVC延迟可视部件重绘操作带来任何新内容。 / p>

充分尊重约瑟夫的建议,将{-1}}阻止任务直接挂起到每个 OnTick() 的UI流程原则上,对于XTO而言,在生产级软件中都是非常危险的,并且还有CPU /内存访问/ db.POOL资源浪费处理能力(通常需要其他任务)

TickArrivalEVENT

aGreenBOX魔力,用于重新实施Visual MVC-part

int init(){
    // ------------------------------------------- // ------------------------
    aGreenBoxWINDOWs_Update();                     // .init
    aCallLockPTR = iBars( NULL, PERIOD_H1 );       // .set  a CPU-clock saving LOCK
    // ------------------------------------------- // ------------------------
   }

int start(){
    // ------------------------------------------- // -----------------
    // HIGH-PRIORITY OPERATIONS
    // ...
    // ..
    // .
    // ||||||||||||||||||||||||||||||||||||||||||| // |||||||||||||||||
    if (  iBars( NULL, PERIOD_H1 )                 // .TEST
       != aCallLockPTR
       ){ 
          aGreenBoxWINDOWs_UpdateJusTheLiveOne();  // .UPD GUI
          aCallLockPTR = iBars( NULL, PERIOD_H1 ); // .SET PTR
       }
    else {// ///////////////////////////////////// // .UPD GUI in .id=1
          // in case LowestLow or HighestHigh inside the Live part of
          // aGreenBOX "aGreenBOX.id=1"
          // was moved:
          // aGreenBoxWINDOW_UpdateJustTheLiveOne();
          // re-lock Hi/Lo_LOCKs                   // .UPD LOCKs
       }
    }