新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 508

 
我的类里有各种乱七八糟的东西,如指标参数等作为参数。一般来说,将是静态的、相同的事情。那么,为什么我每次创建对象 时都要传递这些值呢?
 
STARIJ:

这是不是更短? bool barup=...WindowRedraw(); 将仍然执行 - 取自if

它也可以更短......见我的文件

谢谢你。如何正确设置绘制飞博水平的时间间隔?如果是(时间)9.00,应该在М1上画出8.00至8.59的水平。
 
Juer:

有点像问题的陈述很清楚,不是吗。关键是要初始化相同的东西。

你打算如何初始化不存在的东西?对象被创建 后,它开始存在,这时就可以被初始化。

我马上告诉你--让一个对象成为参数化的构造函数,并向其传递所需的参数,这些参数将用于初始化新创建的对象。

你可以通过一个结构来传递参数,在程序的OnInit()中用所需的(对所有这类对象来说是常数)数据来填充。然后,例如在OnTick()中,或者在任何其他的标准处理程序中,你创建你的对象,但是当你创建它的时候,你要写如下。
CMyObject object = new CMyObject(a_here_structure_with_set_parameters);

或者,如果对象数据在不同的程序中不发生变化,并且总是有相同的值,那么在构造函数中通过初始化列表显式地初始化它们所需的参数,正如Igor上面所说的那样。

关于交易、自动交易系统和策略测试的论坛

新手对MQL4的任何问题,对算法和代码的帮助和讨论

Ihor Herasko, 2018.03.28 17:31

这是在初始化列表中完成的,它位于类的构造函数 中。

class CCandle
{
   int      m_nA;
   double   m_fB;
   datetime m_dtC;


   void CCandle::CCandle(void);
};

CCandle::CCandle(void)
            : m_nA(0)
            , m_fB(0.0)
            , m_dtC(0)
{
}

 
Artyom Trishkin:

你打算如何初始化不存在的东西?对象被创建 后,它开始存在,这时就可以被初始化。

我马上告诉你--让一个对象成为参数化的构造函数,并向它传递所需的参数,这些参数将用于初始化新创建的对象。

你可以通过一个结构来传递参数,你将在程序的OnInit()中用所需的(对所有这类对象来说是常数)数据来填充这个结构。然后,例如在OnTick()中,或在任何其他标准处理程序中,你创建你的对象,但在创建时,你写下以下内容。
CMyObject object = new CMyObject(a_here_structure_with_set_parameters);

是的,我明白了。谢谢你。好吧,我只是想有一些解决方案,这样当一个对象被创建时,它就会有一些预先设定的参数,而不必将它们传递给构造函数或其他什么。通过一些家长班或其他方式。

 
Juer:
在我的课上,我有各种各样的东西,如指标参数等作为参数。一般来说,将是静态的、相同的事情。那么,为什么我每次创建对象 时都要传递这些值呢?

所以不要把它传递出去。在初始化列表中初始化,如我所示。在创建类的实例时,将自动调用类的构造函数,它将初始化类的所有成员,在初始化列表中指定。把Print函数放在CCandle方法中,你会看到构造函数是如何被调用而没有任何引用的。

 
Juer:

是的,我明白了。谢谢你。好吧,我只是想有一些解决方案,这样当一个对象被创建时,它就会有一些预先设定的参数,而不必将它们传递给构造函数或其他什么。通过一些父类或其他东西。

再一次。你可以不把数据传输给构造函数。

 
Ihor Herasko:

所以不要把它传递出去。在初始化列表中初始化,如我所示。在创建类的实例时,将自动调用类的构造函数,它将初始化类的所有成员,在初始化列表中指定。把Print函数放在CCandle方法中,你会看到构造函数是如何被调用而没有任何引用的。

我不明白,通过构造函数还是通过初始化函数传递它们有什么区别?

 
Ihor Herasko:

所以不要把它传递出去。在初始化列表中初始化,如我所示。在创建类的实例时,将自动调用类的构造函数,它将初始化类的所有成员,在初始化列表中指定。把Print函数放在CCandle方法中,看看如何在没有任何引用的情况下调用构造函数。

它们将用什么来初始化?有什么价值?我不明白.

假设,我在专家顾问的输入参数 里有初始值。所以,我需要把它们传递给类的每个对象。但不是把它们传递给每个新创建的对象。

 

为什么在这个循环中,我的限价单只有在下一个条形图上放置限价单后没有放置另一个限价单的情况下才会被删除,也就是说,只有在放置了限价单后,随后的两个条形图上没有限价单的情况下才会被删除。

 int i;
   for(i=0;i<=OrderTicket();i++)
     {
      takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

      if(iBarShift(Symbol(),0,OrderOpenTime())==2)//здесь нужно что бы на 2-ом баре если есть ордер его удалить, но удаляется он только если после его установки небыло на след баре еще лимитника
        {
         deletelimit=OrderDelete(ticket);
         if(!deletelimit)
           {
            Comment(GetLastError());
           }
        }
     }
if(условие для байлимита)
{ордерсенд}
else if(условие для селлимита)
{ордерсенд}
 
Juer:

它们将用什么来初始化?有什么价值?不清楚

你写在初始化列表中的那些。

假设我已经在专家顾问的输入参数 中初始化了数值。所以,我需要把它们传递给这个类的每个对象。但不是把它们传递给每个新创建的对象。

在这里,它是。

input int      i_nA     = 10;
input double   i_fB     = 20.0;
input datetime i_dtC    = D'2018.03.08 10:12:14';

class CCandle
{
   int         m_nA;
   double      m_fB;
   datetime    m_dtC;
   
public:
                     CCandle(void);
};

CCandle::CCandle(void)
         : m_nA(i_nA)
         , m_fB(i_fB)
         , m_dtC(i_dtC)
{
   Print("Создан объект со значениями: A = ", m_nA, ", B = ", m_fB, ", C = ", m_dtC);
}

int OnInit()
{
   CCandle arrclass[10];
     
   return(INIT_SUCCEEDED);
}

如果我们运行它,我们会得到。

0       22:09:36.706    Test EURUSD,M1 inputs: i_nA=10; i_fB=20.0; i_dtC=1520503934; 
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: Создан объект со значениями: A = 10, B = 20.0, C = 2018.03.08 10:12:14
0       22:09:36.995    Test EURUSD,M1: initialized
0       22:09:36.995    Test EURUSD,M1: uninit reason 0
0       22:09:37.062    Script Test EURUSD,M1: removed