指标杂项问题 - 页 3

 
whroeder1:

建国前600年(2014年 2月3日),只有start()。 现在有OnTick (EA)、OnCalculate (指标)和OnStart (脚本)。我忘了你说的是一个指标。

开始使用新的事件处理函数 - 函数 - 语言基础知识 - MQL4参考。请看如何正确地做你的回看

是的!现在我对你的理解清楚多 了,谢谢 你了。

而你的第20 条评论给了我另一个想法(你曾经和我分享过,现在我把它记在心里)

我也试图为我的指标写出更好的代码,现在我试图学习第18 条评论 -@Marco vd Heijden

那么我将广泛 研究你的评论。

再次感谢!

 
Marco vd Heijden:

请把它放在专家中,而不是指标中,这样在将来你想添加你的交易策略时可以更容易使用。

对于条形图的问题,将条形图的开盘时间 存储在一个日期时间变量中,并简单地将记录的时间与实际时间进行比较,那么每当有新的条形图出现时,就会触发。

下面是一个例子。

datetime M1,M5,M15,M30,H1,H4,D1,W1,MN1;

首先,非常感谢您明确评论

我仍然停留在指标 上。我尝试了一些方法,对我来说效果不错 ,但我面临一个问题,我不能在 "策略测试器 "上测试它--它给我带来致命的错误。MT4 "无响应"。

#1 - 马可,请告诉我它来自哪里?

#2 - 下面的代码是正确的吗?

以下是我试过的代码。

string _prefix = "_Preriod_M5 - " ;
string _vlineName_M5 ;
int _prd = PERIOD_M5 ;

int _prd_add = PeriodSeconds( _prd ) ;
datetime _dt_Prd_M5 ;

int _time_M5 ;
datetime _prdCvrt_M5 ;
datetime _timeCvrt_M5 ;

//---init
EventSetMillisecondTimer( 10 );
_CreateLines();

//---timer
if ( _dt_Prd_M5 != iTime( Symbol(), _prd, 0 ) )
{
    _dt_Prd_M5 = iTime( Symbol(), _prd, 0 );
    _CreateLines();
}

//---_CreateLines()
    //---
    int _dayCnt_M5 = 0;
    int _cnt_M5 = iBarShift( Symbol(), 0, iTime( Symbol(), PERIOD_M15, _dayCnt_M5 ) );
    for ( int i = 0; i < _cnt_M5; i++ )
    {
        //---time convert
        _time_M5     = Time[i];
        _prdCvrt_M5  = PeriodSeconds( _prd );
        _timeCvrt_M5 = _time_M5 - ( _time_M5 % _prdCvrt_M5 ) + _prdCvrt_M5;

        //---name
        _vlineName_M5 = _prefix + "PERIOD_M5 - " + TimeToStr( _timeCvrt_M5, TIME_DATE|TIME_MINUTES );

        //---
        if ( _Period < PERIOD_M30 )
        {
            {
                ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
            }
        }
    }
    ObjectMove ( 0, _vlineName_M5, 0, _dt_Prd_M5, 0 );

我已经停止了工作,在你的评论之后,我将继续。(事实上,我担心上述代码在我使用它的时候会压垮我的其他指标)。

非常感谢。

 
计时器功能在MT4策略 测试器中不起作用,所以你必须把它放在tick功能中。
 
Marco vd Heijden: 计时器功能在MT4策略测试器中 不起作用,所以你必须把它放在tick函数中。
在回测中OnTimer()不执行(M. Ali) - MQL4论坛
MT4回测器的图表事件(Migel) - MQL4论坛
 
Marco vd Heijden:
计时器功能在MT4策略测试器 中不起作用,所以你必须把它放在tick函数中。

非常感谢!

我可以肯定 的是,这个问题不是来自代码。

 
你怎么知道?
 

Marco vd Heijden:

下面是一个例子。

datetime  M5;

//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(250);

//--- create some things

   CreateLines(); // Function that creates time lines

//--- load open times
   M5=iTime(Symbol(),PERIOD_M5,0);

//--- set timelines

   ObjectMove(0,"Time-M5",0,M5,0);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(M5!=iTime(Symbol(),PERIOD_M5,0))
     {
      M5=iTime(Symbol(),PERIOD_M5,0);  // overwrite old value with new value  
      //Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-M5",0,M5,0);
     }
  }
//+------------------------------------------------------------------+

非常感谢你。

这条评论教会了很多东西

看起来这段代码对我很有用,我在之前的评论中提到了这段代码。

但我需要那段代码(对Period_M5有效) 在时钟12:00时不工作 (可能是13:00,14:00......),下面的代码忽略了'OBJ_VLINE'的过去时间 (这对我很好),但当目前时钟12:00时,下面的代码显示我另外的当前时间 VLINE,但我不希望它。

if ( TimeHour( _timeCvrt_M5 ) != 12 )
{
    ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
}   //---if Close

尝试了 一些方法来解决我的问题,但它没有正确工作

我还添加了屏幕截图


请帮助我,我真的需要解决这个问题。

衷心感谢。

附加的文件:
 
Marco vd Heijden:
你怎么知道的?

因为连接中断了,我试着在断开连接 的时候使用'策略测试器',它对我来说非常有效

在我看了 和威廉先生 的评论后,我才确定了 这一点。

这还不够吗,抱歉

 
if ( TimeHour( _timeCvrt_M5 ) != 12 )
{
    ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
}   //---if Close

在这个例子中,除了12:00以外,你在每个小时都得到一行,因为你用!=不同然后12的语句排除了,所以当它==等于12的时候没有一行。

 
Marco vd Heijden:


聪明的 ,谢谢:)

这很简单,但我并不介意。只是简单的,而且是令人惊叹的

(其实我在这个指标中使用了'==',但我真正关注的是'OnTimer')

//-----第二次编辑...

这对我来说很好,但当时间到了00:00时--附加的当前时间 VLINE又显示出来。

if (
     TimeHour( _timeCvrt_M5 ) == 1  ||
     TimeHour( _timeCvrt_M5 ) == 2  ||
     TimeHour( _timeCvrt_M5 ) == 3  ||

     TimeHour( _timeCvrt_M5 ) == 5  ||
     TimeHour( _timeCvrt_M5 ) == 6  ||
     TimeHour( _timeCvrt_M5 ) == 7  ||

     TimeHour( _timeCvrt_M5 ) == 9  ||
     TimeHour( _timeCvrt_M5 ) == 10 ||
     TimeHour( _timeCvrt_M5 ) == 11 ||

     TimeHour( _timeCvrt_M5 ) == 13 ||
     TimeHour( _timeCvrt_M5 ) == 14 ||
     TimeHour( _timeCvrt_M5 ) == 15 ||

     TimeHour( _timeCvrt_M5 ) == 17 ||
     TimeHour( _timeCvrt_M5 ) == 18 ||
     TimeHour( _timeCvrt_M5 ) == 19 ||

     TimeHour( _timeCvrt_M5 ) == 21 ||
     TimeHour( _timeCvrt_M5 ) == 22 ||
     TimeHour( _timeCvrt_M5 ) == 23
)

(我几次更新这个评论是因为我在研究)

请帮助我。