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

 
vitaliy zamkovoy 当前 价格中减去 20 秒前的价格,并将其与某个常数进行比较,以便随后开立订单,那么在 Expert Advisor 中该如何写入呢?

请看这段代码:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//ВХОДНОЙ ПАРАМЕТР
input ushort Constanta=50; //Константа

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(20);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   double open_0=iOpen(_Symbol,PERIOD_CURRENT,0);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
   if(open_0-SymbolInfoDouble(_Symbol,SYMBOL_BID)>Constanta*_Point)
      Print("Цена прошла вниз расстояние больше чем Константа, поэтому нужно открыть позицию SELL!");
   if(SymbolInfoDouble(_Symbol,SYMBOL_BID)-open_0>Constanta*_Point)
      Print("Цена прошла вверх расстояние больше чем Константа, поэтому нужно открыть позицию BUY!");
   Sleep(20000);
  }
//+------------------------------------------------------------------+
弗拉基米尔
 
MrBrooklin #:

请看这段代码:

敬上,弗拉基米尔。
很遗憾,这两天我无法检查,但还是请接受我的谢意!
 
vitaliy zamkovoy #:
很遗憾,我这两天无法检查它,但请接受我的谢意!

谢谢您,但请注意,这不是现成的代码,只是我的思考方向。它可能是错的。您需要检查一下。您可以考虑另一种方法--移除 OnTimer,然后在 OnTick() 中尝试相同的代码。总之,试试看吧。

再见,弗拉基米尔

 
vitaliy zamkovoy 当前 价格中提取 20 秒前的价格,并将其与某个常数进行比较,然后开立订单,您该如何记录?

记录当前价格和时间。比较每个刻度的时间和当前时间,如果超过 20 秒,则记住第二个价格。计算第一个价格和第二个价格之间的差额。将所得结果与常数进行比较,然后决定是否下单。

 
Valeriy Yastremskiy #:

记住当前价格和时间。比较每个跳动点的时间和当前时间,如果超过 20 秒,则记住第二个价格。计算第一个价格和第二个价格之间的差值。将所得结果与常数进行比较,然后决定是否下单。

我是否正确理解了您的意思:您需要每秒记住当前价格,然后将其与 20 秒内删除该系列每个值时的当前价格进行比较?

比较应该是连续的。

 
vitaliy zamkovoy #:

我的理解是否正确:您需要记住每秒的当前价格,这样当该系列的每个值被删除 20 秒后,您就可以将其与当前值进行比较?

比较应该是连续的。

如果需要检查所有的刻度,那么所有的刻度都应该记住并进行比较。如果根据算法可以减少次数,那么可以使用计时器,一秒钟后记住价格,20 秒后也记住并进行比较。或者说,您应该记住 20 秒内的所有价格或一秒内的价格,并与新的刻度进行比较。
每秒可能有 1 个刻度,5 秒内可能有 1 个刻度,一秒内可能有 100 个刻度。您必须决定在每 5 秒有一个刻度线和每秒有 100 个刻度线时如何操作。

 
Valeriy Yastremskiy #:

如果您需要检查所有刻度,那么所有刻度都应记住并进行比较。如果可以根据算法减少频率,那么可以使用计时器,一秒钟后记住价格,20 秒后也记住并进行比较。或者说,您应该记住 20 秒内的所有价格或一秒内的价格,并与新的刻度进行比较。
每秒可能有 1 个刻度,5 秒内可能有 1 个,一秒内可能有 100 个。您必须决定在每 5 秒有一个刻度线和每秒有 100 个刻度线时如何操作。

这不是选择的问题,而是我写下来的难度问题....。我今天第一次来这里。我完全是个外行。

我只是想试试我的想法...

 
vitaliy zamkovoy #:

这不是一个选项的选择问题,而是我写下来的难度问题.....。这是我今天第一次来这里。完全是外行。

我只是想试试我的想法。

算法必须精确,并理解其应用条件。你不能以其他方式编写代码。代码是一种行动算法的实现,它不能不准确。

在这里,最好先自己写,也许你会纠正错误。

您了解等号的符号,知道多就是少。

 

环形缓冲区:

取一个缓冲区--一个"价格、时间 "结构组成的 足够大的静态数组(或两个单独的数组)。

我们使用两个变量--指向缓冲区头部和尾部的 "指针"(索引)。

在每一次跳转时,我们都会在头部添加一个元素,并将指针向前推进。

将时间与尾部的元素进行比较,必要时移动指针。

将价格与尾部元素进行比较。

如果某个指针到达了数组的末尾,我们会将该指针重置为零。

 
JRandomTrader 由"价格、时间 "结构组成的 足够大的静态数组(或两个单独的数组)。

取两个变量--指向缓冲区头部和尾部的 "指针"(索引)。

在每次跳转时,我们都会在头部添加一个元素,并移动指针。

将时间与尾部的元素进行比较,必要时移动指针。

将价格与尾部元素进行比较。

如果某个指针已到达数组的末尾,则将该指针重置为零。

👍