//+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ voidOnTimer() { if(M1!=iTime(Symbol(),PERIOD_M1,0)) { M1=iTime(Symbol(),PERIOD_M1,0); // overwrite old value with new value //Alert("New Bar on M1! ",TimeToString(M1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M1",0,M1,0); }
if(M5!=iTime(Symbol(),PERIOD_M5,0)) { M5=iTime(Symbol(),PERIOD_M5,0); //Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M5",0,M5,0); }
if(M15!=iTime(Symbol(),PERIOD_M15,0)) { M15=iTime(Symbol(),PERIOD_M15,0); //Alert("New Bar on M15! ",TimeToString(M15,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M15",0,M15,0); }
if(M30!=iTime(Symbol(),PERIOD_M30,0)) { M30=iTime(Symbol(),PERIOD_M30,0); //Alert("New Bar on M30! ",TimeToString(M30,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-M30",0,M30,0); }
if(H1!=iTime(Symbol(),PERIOD_H1,0)) { H1=iTime(Symbol(),PERIOD_H1,0); //Alert("New Bar on H1! ",TimeToString(H1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-H1",0,H1,0); }
if(H4!=iTime(Symbol(),PERIOD_H4,0)) { H4=iTime(Symbol(),PERIOD_H4,0); //Alert("New Bar on H4! ",TimeToString(H4,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-H4",0,H4,0); }
if(D1!=iTime(Symbol(),PERIOD_D1,0)) { D1=iTime(Symbol(),PERIOD_D1,0); //Alert("New Bar on D1! ",TimeToString(D1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-D1",0,D1,0); }
if(W1!=iTime(Symbol(),PERIOD_W1,0)) { W1=iTime(Symbol(),PERIOD_W1,0); //Alert("New Bar on W1! ",TimeToString(W1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-W1",0,W1,0); }
if(MN1!=iTime(Symbol(),PERIOD_MN1,0)) { MN1=iTime(Symbol(),PERIOD_MN1,0); //Alert("New Bar on MN1! ",TimeToString(MN1,TIME_SECONDS)); // do something... //ObjectMove(0,"Time-MN1",0,MN1,0); } } //+------------------------------------------------------------------+
#对象顺序
我创建了3个对象,这些对象相互交叉。
#1 水平线,#2 垂直线,#3 趋势线
我需要设置它们的z位置。
那么,我怎样才能给它们的Z位置值?
谢谢。
你可以在OnInit()中画出所有的线,然后在上一个条形的开放时间发生变化时画出新的条形,你就会知道有一个新的条形。
但我不确定你到底想做什么。
好吧!我试试。 我将尝试 一下。然后我再回到这里来。
谢谢。
@Marco vd Heijden
在我开始研究 这个问题之前。我真的需要问一下,start()函数 是否会减慢图表速度(/MT4平台)?
p.s 我把所有的代码放在start() 函数中,该代码对周期线--H1, H4, D1, W1, MN1有效。
祝您周末愉快,提前感谢。
谢谢你的评论。(在你的评论之后,我决定要改变我所有的指标--因为我几乎把所有的指标都放在start() 函数 中。)
我把下面的代码放在start() 函数中,你能帮助我,哪种方式对我的指标好?
事实上,我不知道如何编辑下面的代码以停止持续更新 (不把所有start()代码放在init()函数中)。
int _cnt_MN1 = 11; // 12 lines for a year 24 for two years and etc.
for ( int i_MN = 0; i_MN < _cnt_MN1; i_MN++ )
{
if ( _Period < PERIOD_MN1 )
{
//---time convert
datetime _tltpMN1 = TimeToString( iTime( Symbol(), PERIOD_MN1, i_MN ), TIME_DATE );
datetime _time = iTime( Symbol(), PERIOD_MN1, i_MN );// + PeriodSeconds( PERIOD_MN1 );
//---name
string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
ObjectCreate ( 0, _vlineName_MN, OBJ_VLINE , 0, _time, 0 );
ObjectSetString ( 0, _vlineName_MN, OBJPROP_TOOLTIP , _tltpMN1 );
ObjectSetInteger ( 0, _vlineName_MN, OBJPROP_COLOR , C'180,160,080' );
ObjectSet ( _vlineName_MN, OBJPROP_BACK , true );
ObjectSet ( _vlineName_MN, OBJPROP_HIDDEN , true );
ObjectSet ( _vlineName_MN, OBJPROP_SELECTABLE , false );
ObjectSet ( _vlineName_MN, OBJPROP_STYLE , STYLE_SOLID );
} //---if Close
} //---for Close
谢谢!
我真的需要帮助,请有人 回答我的问题。
谢谢。
我不同意制作一个新的bar函数,因为它只能在每个tick上调用一次。一个变量可以被多次测试。
static datetime BOMcur=0; dateTime BOMpre = BOMcur;
BOMcur = iTime( _Symbol, PERIOD_MN1, 0); bool isNewMonth = BOMcur != BOMpre;
if(isNewMonth){
DO_UPDATE(); ...
}
string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
请把它放在专家中,而不是指标中,这样在将来你想添加你的交易策略时可以更容易使用。
对于条形图的问题,将条形图的开盘时间 存储在一个日期时间变量中,并简单地将记录的时间与实际时间进行比较,那么每当有新的条形图出现时,就会触发。
下面是一个例子。
int OnInit()
{
//--- create timer
EventSetMillisecondTimer(250);
//--- create some things
CreateLines(); // Function that creates time lines
//--- load open times
M1=iTime(Symbol(),PERIOD_M1,0);
M5=iTime(Symbol(),PERIOD_M5,0);
M15=iTime(Symbol(),PERIOD_M15,0);
M30=iTime(Symbol(),PERIOD_M30,0);
H1=iTime(Symbol(),PERIOD_H1,0);
H4=iTime(Symbol(),PERIOD_H4,0);
D1=iTime(Symbol(),PERIOD_D1,0);
W1=iTime(Symbol(),PERIOD_W1,0);
MN1=iTime(Symbol(),PERIOD_MN1,0);
//--- set timelines
ObjectMove(0,"Time-M1",0,M1,0);
ObjectMove(0,"Time-M5",0,M5,0);
ObjectMove(0,"Time-M15",0,M15,0);
ObjectMove(0,"Time-M30",0,M30,0);
ObjectMove(0,"Time-H1",0,H1,0);
ObjectMove(0,"Time-H4",0,H4,0);
ObjectMove(0,"Time-D1",0,D1,0);
ObjectMove(0,"Time-W1",0,W1,0);
ObjectMove(0,"Time-MN1",0,MN1,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
if(M1!=iTime(Symbol(),PERIOD_M1,0))
{
M1=iTime(Symbol(),PERIOD_M1,0); // overwrite old value with new value
//Alert("New Bar on M1! ",TimeToString(M1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M1",0,M1,0);
}
if(M5!=iTime(Symbol(),PERIOD_M5,0))
{
M5=iTime(Symbol(),PERIOD_M5,0);
//Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M5",0,M5,0);
}
if(M15!=iTime(Symbol(),PERIOD_M15,0))
{
M15=iTime(Symbol(),PERIOD_M15,0);
//Alert("New Bar on M15! ",TimeToString(M15,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M15",0,M15,0);
}
if(M30!=iTime(Symbol(),PERIOD_M30,0))
{
M30=iTime(Symbol(),PERIOD_M30,0);
//Alert("New Bar on M30! ",TimeToString(M30,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-M30",0,M30,0);
}
if(H1!=iTime(Symbol(),PERIOD_H1,0))
{
H1=iTime(Symbol(),PERIOD_H1,0);
//Alert("New Bar on H1! ",TimeToString(H1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-H1",0,H1,0);
}
if(H4!=iTime(Symbol(),PERIOD_H4,0))
{
H4=iTime(Symbol(),PERIOD_H4,0);
//Alert("New Bar on H4! ",TimeToString(H4,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-H4",0,H4,0);
}
if(D1!=iTime(Symbol(),PERIOD_D1,0))
{
D1=iTime(Symbol(),PERIOD_D1,0);
//Alert("New Bar on D1! ",TimeToString(D1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-D1",0,D1,0);
}
if(W1!=iTime(Symbol(),PERIOD_W1,0))
{
W1=iTime(Symbol(),PERIOD_W1,0);
//Alert("New Bar on W1! ",TimeToString(W1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-W1",0,W1,0);
}
if(MN1!=iTime(Symbol(),PERIOD_MN1,0))
{
MN1=iTime(Symbol(),PERIOD_MN1,0);
//Alert("New Bar on MN1! ",TimeToString(MN1,TIME_SECONDS));
// do something...
//ObjectMove(0,"Time-MN1",0,MN1,0);
}
}
//+------------------------------------------------------------------+
static datetime BOMcur=0; dateTime BOMpre = BOMcur;
BOMcur = iTime( _Symbol, PERIOD_MN1, 0); bool isNewMonth = BOMcur != BOMpre;
if(isNewMonth){
DO_UPDATE(); ...
}
string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
谢谢你的评论。
从你的评论开始,我就开始尝试研究你的评论。 (因为我从未使用过'Void OnTick()'函数)
总之,威廉先生,你的评论真的给了我灵感,也教了我一些东西。
(如果我想错了,请告诉我)。
建国前600年(2014年 2月3日),只有start()。 现在有OnTick (EA)、OnCalculate (指标)和OnStart (脚本)。我忘了你说的是一个指标。
开始使用新的事件处理函数 - 函数 - 语言基础知识 - MQL4参考。请看如何正确地做你的回看。