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

 
Igor Makanu:

内存分配 将在实例1和实例2中进行

例2既是声明又是初始化,例1只有声明。

在帮助中已经可以写得更清楚了。我立即声明了它,因为我在类中有静态计算,我不需要通过new操作符创建对象。

告诉我,我想做这样一件事,这意味着我想声明一个类,然后声明一个数组,并在数组中存储一个指向该类的指针,这到底能不能做到?

 
Seric29:

告诉我,我想做这样一件事,所以我想声明一个类,然后声明一个数组,并在数组中存储一个指向该类的指针,这到底能不能做到?

再三....一个类首先是一个数据类型,如int、double......。

你想要一个这种数据类型的数组?-声明一个数组,如果数组是动态的,那么就调整它的大小,然后用必要的数据初始化每个元素--你需要指针,那么就用指向一个类的指针初始化它们,你需要一个类的实例,那么数组的每个元素将不是一个指针而是一个对象本身

这就是OOP的精髓,任何一个类首先都是一个用户数据类型....。我不知道该怎么说,但是方法和普通的数据类型是一样的,你在类里面写什么是个人的事情,但是新实例的初始化总是从构造函数开始的,而且有什么构造函数--默认的,有参数或没有参数--它允许你选择如何初始化对象......,唉,但是还是要看书,这里没有办法用问题做。

 
Igor Makanu:

通常他们通过开盘价确定最外层的上/下限订单,然后增加一些数值,得到一个新的价格,当价格突破这个水平条件时,他们或者监测并下一个新的订单,或者立即下一个以最大订单数为目标的挂单 网格,然后追踪这个网格。

我感谢你的关注,但我指的是图表上的虚线格子。


你能告诉我在mt4和mt5中如何计算网格的水平线吗? 当我在没有固定比例的情况下滚动图表时,它们会移动,而且在mt4和mt5中它们的移动方式有点不同也许有人知道它是如何计算的,这样我就不必用缩进和捆绑等方式来猜测。

 
Andrey Sokolov:

谢谢你没有与我们擦肩而过,但我说的不是这个,我说的是图表上的虚线格子。


你能告诉我mt4和mt5中网格的水平线是如何计算的吗? 如果刻度不固定,当我滚动图表时,它们就会移动,而且mt4和mt5中移动 方式有点不同也许有人知道它是如何计算的,这样我就不必用缩进、装订和其他东西来猜测。

它只是把窗口分成相等的部分,取决于屏幕分辨率。

我在MT4和MT5中都是垂直划分为15个部分

 
Igor Makanu:

再三....一个类首先是一个数据类型,如int、double......。

你想要一个该类型的数据数组?-声明一个数组,如果数组是动态的,那么就调整它的大小,然后用必要的数据初始化每个元素--你需要指针,那么就用指向类的指针初始化它们,你需要类的实例,那么数组的每个元素将不是指针,而是对象本身

这就是OOP的精髓,任何一个类首先都是一个用户数据类型....。我不知道该怎么说,但是方法和普通的数据类型是一样的,你在类里面写什么是个人的事情,但是新实例的初始化总是从构造函数开始的,什么构造函数--默认的,带参数的或者不带参数的--你可以选择如何初始化一个对象...... ugh,但是还是要看书,没有办法用这种方式来做

是的,我意识到这是不可能的,因为当你创建一个数组时,程序需要指定类型,因为我想在一个数组中保存不同类的指针,这是不可能的,因为在mql中数组不能是不同的类型或杂项,在s++中做到了,但不能用这样复杂的对象。所以我的想法在这里行不通。

 
Seric29:

是的,我意识到这是不可能的,因为当你创建一个数组时,程序要求你指定类型,因为我想在一个数组中保存不同类的指针,这将是不可能的,因为在mql中数组不能有不同的类型或品种,在C++中做到了,但不能用这样复杂的对象。所以我的想法在这里行不通。

一切都已完成。你从基类继承你的对象,并以基类的类型创建一个数组。而且所有继承的对象都可以在数组中。
 
Artyom Trishkin:
一切都已完成。你从基类继承你的对象,并以基类的类型创建一个数组。而且所有继承的对象都可以在数组中。

显示最简单和最原始的例子,有2个类,然后继承,如何将每个类的引用放在2个元素的数组中(0个第一类1个第二类)?

 
Andrey Sokolov:

Makar,你为什么要写一些明显不真实的东西? 当滚动图表时,你可以改变水平网格线的 偏移量,它们在mt4和mt5中移动略有不同

他们不这样做!

它们只有在有指示窗口时才会移动,在所有其他情况下它们不会移动。

 
Seric29:

并展示最简单和最原始的例子,其中有2个类进一步继承,如何将每个类的引用放在一个2个元素的数组中(0个第一类1个第二类)?

class CBase{
protected:
   int v;
   public:
                  CBase(): v(0)  {            }
           int    getV()         { return(v); }
   virtual int    calc() = 0;
};

class A:public CBase
{
   public:
   virtual int calc() {return(--v);} //декремент 
};

class B:public CBase
{
   public:
   virtual int calc() {return(++v);} //инкремент
};

//+------------------------------------------------------------------+
void OnStart()
{
// 2 указателя которые инициализируем экземплярами обьектов  A и B
   CBase *arr_base[2];
   arr_base[0] = new A;
   arr_base[1] = new B;
// вызовем 10 раз метод calc() для каждого обьекта   
   for(int j=ArraySize(arr_base)-1; j>=0; j--)
   {
      for(int i=0; i<10; i++)
         {
            arr_base[j].calc();
         }
   }
   
   Print("A.v = ",arr_base[0].getV());
   Print("B.v = ",arr_base[1].getV());
//удалим обьекты   
   for(int j=ArraySize(arr_base)-1; j>=0; j--)
   {
      delete arr_base[j];
   }   
}
//+------------------------------------------------------------------+

2020.03.22 21:21:38.544 tst (EURUSD,H1) A.v = -10

2020.03.22 21:21:38.544 tst (EURUSD,H1) B.v = 10

 
Igor Makanu:

2020.03.22 21:21:38.544 tst (EURUSD,H1) A.v = -10

2020.03.22 21:21:38.544 tst (EURUSD,H1) B.v = 10

谢谢你。而函数应该是虚拟的简单的不能,我已经会自己实验了。

原因: