初学者的问题 MQL5 MT5 MetaTrader 5 - 页 577

 
Artyom Trishkin:
好吧,我会把所有的东西组成一个函数,并在我需要的时候调用它--甚至在每一个tick(如果它是合理和必要的),或在一个新的蜡烛 开盘时--例如,每小时一次,如果我们在H1工作。

有了这个功能,当然就很方便了。我已经弄清了代码。现在很清楚了。我将思考,如何把它带到我想要的那些目的,并理解,何时和在什么阶段采取必要的数据。

 
Koldun Zloy:

如果它是彻头彻尾的 "鲁莽的高度",它就会被禁止。

WinAPI极大地扩展了MQL的能力。而且即使没有Dll,你也可以做一些愚蠢的事情。

这里是一个字符串传递到剪贴板的例子。

做得好,而且还有评论。

谢谢你。

下面是另一个问题。

是否有可能在给定的坐标上模拟鼠标点击?

 
mila.com:

很好,而且还带有评论。

谢谢你。

还有一个问题。

有没有可能在给定的坐标上对鼠标点击进行模拟?

如果你不需要从MQL做,看看AutoIT,你可以在那里做任何事情。该产品是免费的,你只需要一个DLL来与MQL互动。
 
mila.com:

很好,而且还带有评论。

谢谢你。

还有一个问题。

有没有可能在给定的坐标上对鼠标点击进行模拟?

是的,我们可以。

#define  MK_LBUTTON     0x0001
#define  WM_LBUTTONDOWN 0x0201
#define  WM_LBUTTONUP   0x0202

struct POINT
{
   int x;
   int y;
};

#import "User32.dll"
   uint WindowFromPoint( int x, int y );
   uint PostMessageW( uint hWnd, uint Msg, uint wParam, uint lParam );
   int ScreenToClient( uint hWnd, POINT& lpPoint );
#import

int x = 1000;  // Экранные координаты
int y = 350;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   uint hwnd = WindowFromPoint( x, y ); // Получаем дескриптор окна в нужном месте
   
   if( hwnd ){
      POINT point;
      point.x = x;
      point.y = y;
      ScreenToClient( hwnd, point );  // Преобразуем экранные координаты в координаты рабочей области окна
      
      uint lParam = (point.y * 65536) + (point.x & 0xFFFF);  // Упаковываем координаты в 32-разрядное целое
      
      PostMessageW( hwnd, WM_LBUTTONDOWN, MK_LBUTTON, lParam ); // Посылаем сообщения от "мыши"
      PostMessageW( hwnd, WM_LBUTTONUP, MK_LBUTTON, lParam );
   }
}
 
Artyom Trishkin:
好吧,我将把所有的东西组成一个函数,并在我需要的时候调用它--在每一个tick(如果需要和合理)或在一个新的蜡烛 开盘时--例如,如果我们用H1工作,每小时一次。

Artem,我的理解是正确的,如果我们有一个循环:for(int i=0; i<copy_bars; i++) 并且有一个循环for(int j=0; j<copy_bars; j++) 其中if(j==i) 继续; ,

这将意味着计算是平行的,如果我们有大约5个蜡烛图,那么比较将继续进行。

1与1--丢弃。

1个带2,1个带3,1个带4,1个带5。

然后一个周期将在哪里开始。

2与1,2与3,2与4,2与5。

等等。

会是这样的吗?

 
Andrey Koldorkin:

Artem,我的理解是正确的,如果我们有一个循环:for(int i=0; i<copy_bars; i++) 并且有一个循环for(int j=0; j<copy_bars; j++) 其中if(j==i) 继续; ,

这将意味着计数是平行的,如果我们有大约5个烛台,那么比较将继续。

1与1--丢弃。

1个带2,1个带3,1个带4,1个带5。

然后一个周期将在哪里开始。

2与1,2与3,2与4,2与5。

等等。

会不会是一样的呢?

是的。
 
Artyom Trishkin:
是的。

另一个问题:如果我们不需要比较当前的蜡烛,那么我们不需要从1而不是0开始计数吗?

或者我们应该理解,这里的0是蜡烛1,1是蜡烛2,等等。

 
Andrey Koldorkin:

另一个问题:如果我们不需要比较当前的蜡烛,那么我们不需要从1而不是0开始计数吗?

还是我们应该理解为这里的0是蜡烛1,1是蜡烛2,等等?

这里零是数组的开始。而在数组中,我们写出从第一个到......的烛台,不是 "到",而是我们需要的数字。

int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);

1是要复制的蜡烛图的数量,copy_bars是要复制的蜡烛图的数量。

因此,array[]包含了索引为0的单元格中所需要的蜡烛图--1或1+copy_bars-1。 根据array[]的索引方向(ArraySetAsSeries()设置了索引方向,可以使用ArrayGetAsSeries()、ArrayIsSeries()检查)。

 
Artyom Trishkin:

这里零是数组的开始。在数组中,我们将烛台从第一个写到...,不是 "到",而是我们需要的烛台数量。

1是要复制的蜡烛图的数量,copy_bars是要复制的蜡烛图的数量。

因此,array[]包含了索引为0的单元格中所需要的蜡烛--1或1+copy_bars-1。 根据array[]的索引方向(ArraySetAsSeries()设置了索引方向,可以用ArrayGetAsSeries()、ArrayIsSeries()检查)。

这种编程。越是进入树林....

我首先只是检查了它通过Alert显示的内容。似乎反之亦然,也就是说,最接近当前蜡烛的蜡烛数量最多。

然后我通过检查。

bool series=ArrayIsSeries(dataCandle)。

警报(系列)。

而脚本显示为 "false"。

根据我的逻辑,如果false在错误的一端,那么true就会在正确的一端。

我开了处方。

ArraySetAsSeries (dataCandle, true); //改变方向

bool series=ArrayIsSeries(dataCandle); //再次检查

Alert (series); //在屏幕上写出结果。

但之后我仍然得到 "假"。

我的问题是什么?

 
Andrey Koldorkin:

哦,这个编程。越是进入树林....

我第一次检查只是通过Alert它发出的东西。结果是相反的,也就是说,最接近当前蜡烛的蜡烛有最大的数字。

然后我通过检查。

bool series=ArrayIsSeries(dataCandle)。

警报(系列)。

而脚本显示为 "false"。

根据我的逻辑,如果false在错误的一端,那么true就会在正确的一端。

我开了处方。

ArraySetAsSeries (dataCandle, true); //改变方向

bool series=ArrayIsSeries(dataCandle); //再次检查

Alert (series); //在屏幕上写出结果。

但之后我仍然得到 "假"。

我的问题是什么?

dataCandles是一个结构。我们写下历史上的蜡烛的数组--array[]。因此,我们需要把它作为一个时间序列,使其索引与图表上的蜡烛图索引相吻合。也就是说,数组[]的零格将对应于离当前日期最近的蜡烛图。

即:1.将蜡烛图复制到数组array[]中,2.使其成为一个时间序列,然后将其中的数值读入结构中。

你可以不使用array[]--直接从图表中写入数据到结构中,但我建议这样做是为了与Five兼容--它只允许在指标中使用high[i]、low[i]和其他数据直接复制,但在脚本或专家顾问中,我们必须首先将必要的历史区间复制到阵列中,我就是这样做的。