我的目标是在图表上创建一个矩形对象,该对象可以测量指定时间范围内的最高点和最低点以及 X
天数?
我知道如何为图表创建对象,但我不确定如何重复 X
天数。我怎样才能做到这一点?我想也许For循环会是一个好方法吗?我可以使用一些指导。
答案 0 :(得分:1)
尝试此代码(EA交易)。好吧,它没有效率(因为它重新计算每个滴答),但我很好地演示了这个概念。
以及它的代码:
//+------------------------------------------------------------------+
//| 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_D1
,PERIOD_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]而不是
一旦进入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
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
}
}