指标杂项问题 - 页 2

 

#对象顺序

我创建了3个对象,这些对象相互交叉。

#1 水平线#2 垂直线,#3 趋势线

我需要设置它们的z位置

那么,我怎样才能给它们的Z位置值

谢谢。

 
Marco vd Heijden:

你可以在OnInit()中画出所有的线,然后在上一个条形的开放时间发生变化时画出新的条形,你就会知道有一个新的条形。

但我不确定你到底想做什么。

好吧!我试试。 我将尝试 一下。然后我再回到这里来

谢谢。

 

@Marco vd Heijden

在我开始研究 这个问题之前。我真的需要问一下,start()函数 是否会减慢图表速度(/MT4平台)?

p.s 我把所有的代码放在start() 函数中,该代码对周期线--H1, H4, D1, W1, MN1有效。

祝您周末愉快,提前感谢。

 
Max Enrik: 我真的需要问一下,start()函数是否会使图表变慢(/MT4平台)?
当所有的指标都在更新时,终端不做其他事情。这就是为什么指标不能睡觉,不能交易,或做网络请求
 
whroeder1:
当所有的指标都在更新时,终端不做其他事情。这就是为什么指标不能睡觉,不能交易,或做网络请求。

谢谢你的评论。(在你的评论之后,我决定要改变我所有的指标--因为我几乎把所有的指标都放在start() 函数 中。)

我把下面的代码放在start() 函数中,你能帮助我,哪种方式对我的指标好?

事实上,我不知道如何编辑下面的代码以停止持续更新 (不把所有start()代码放在init()函数中)

//---MN1
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

谢谢!

 

我真的需要帮助,请有人 回答我的问题。

谢谢。

 
Max Enrik: 事实上,我不知道如何编辑下面的代码以停止持续更新
  1. 为新的月份适应新的条形代码。
    Bars是不可靠的(刷新/重新连接可以改变图表上的条数)volume是不可靠的(错过ticks)总是使用时间。新蜡烛 - MQL4论坛
    我不同意制作一个新的bar函数,因为它只能在每个tick上调用一次。一个变量可以被多次测试。
    void OnTick(){
       static datetime BOMcur=0;                dateTime BOMpre     = BOMcur;  
       BOMcur = iTime( _Symbol, PERIOD_MN1, 0); bool     isNewMonth = BOMcur != BOMpre;
       if(isNewMonth){
          DO_UPDATE(); ...
       }

  2. for ( int i_MN = 0; i_MN < _cnt_MN1; i_MN++ ){ ...
       string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
    不要 在对象名称中使用移位数字。一旦一个新的条形图开始,你所有的对象都会被错误地命名,你不能创建一个新的"<前缀>0"。你在你的原帖中说得很对(使用时间)
    string   _vlineName_MN1 = _prefix + "PERIOD_MN1 - " + TimeToStr( _timeCvrt_MN1, TIME_DATE )    ;
    或者将时间转换为一个int到一个字符串。
 

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

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

下面是一个例子。

datetime M1,M5,M15,M30,H1,H4,D1,W1,MN1;
//+------------------------------------------------------------------+
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);
     }

  }
//+------------------------------------------------------------------+
 
whroeder1:
  1. 为新的月份调整新的条形码。
    void OnTick(){
       static datetime BOMcur=0;                dateTime BOMpre     = BOMcur;  
       BOMcur = iTime( _Symbol, PERIOD_MN1, 0); bool     isNewMonth = BOMcur != BOMpre;
       if(isNewMonth){
          DO_UPDATE(); ...
       }

  2. for ( int i_MN = 0; i_MN < _cnt_MN1; i_MN++ ){ ...
       string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
    不要 在对象名称中使用移位数字。一旦新的条码开始,你所有的对象都会被错误地命名,你不能创建一个新的"<前缀>0"。你在你的原帖中说得很对(使用时间)
    string   _vlineName_MN1 = _prefix + "PERIOD_MN1 - " + TimeToStr( _timeCvrt_MN1, TIME_DATE )    ;
    或者把时间转换为int,变成一个字符串。

谢谢你的评论。

从你的评论开始,我就开始尝试研究你的评论。 (因为我从未使用过'Void OnTick()'函数)

所以,我读了下面的链接,然后我明白'OnTick()'函数只在专家顾问系统中运行。

我已经在我的图表中使用了一个专家顾问(Trade Panel) (我需要在一个图表窗口中 使用我所有的指标和专家顾问)。

如果你的意思是我可以在 "专家顾问 "中 使用你的代码,实际上我不会,因为我将改进我的"交易面板",而且我想单独写代码。(有可能将来我会把那一堆指标(对我来说很重要) 结合起来- 但现在还不行)。

总之,威廉先生,你的评论真的给了我灵感,也教了我一些东西。

(如果我想错了,请告诉我)。

再一次感谢您!
Event Handling Functions - Functions - Language Basics - MQL4 Reference
Event Handling Functions - Functions - Language Basics - MQL4 Reference
  • docs.mql4.com
Event Handling Functions - Functions - Language Basics - MQL4 Reference
 
Max Enrik(因为我从未使用过'Void OnTick()'函数)

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

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

Event Handling Functions - Functions - Language Basics - MQL4 Reference
Event Handling Functions - Functions - Language Basics - MQL4 Reference
  • docs.mql4.com
Event Handling Functions - Functions - Language Basics - MQL4 Reference