mql5 - 自上一次交易后一定时间内的垂直线 - 页 2

 
Vladimir Karputov:

我想澄清一下 "最后交易 "这个词。

它是当前一天内的最后一笔交易吗?还是在过去的N天里?

24小时内的最后一笔交易--你不需要再去追溯历史。

 
renatmt5:

24小时内的最后一笔交易--没有必要再去了解这个故事了。

下面是它的工作原理。

该指标使用代码从OBJ_VLINE 帮助中创建、移动和删除一条垂直线。(到目前为止,只有行的创建在指标中起作用)。行名在输入参数"垂直行名"中设置。

最后一笔交易 移动 竖线

竖线是在OnOnit()中创建的

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   VLineCreate(0,InpVLineName);
//---
   return(INIT_SUCCEEDED);
  }


为了尽量减少负荷,我们每分钟询问一次历史数据。为了这个目的,让我们在程序的全局变量区域(在本例中,在指标中)声明变量ExtLastMove

//---
datetime ExtLastMove=0;                   // "0" -> D'1970.01.01 00:00';

- 这个变量将存储最后一次访问交易历史的时间。


然后在OnCalculate()中,我们将存储的时间ExtLastMove 减去当前时间(使用任何TimeCurrent 符号的最后一次报价时间),如果差异小于60秒,我们退出

//---
   datetime time_current=TimeCurrent();
   if(time_current-ExtLastMove<60) // 60 seconds
      return(rates_total);
   ExtLastMove=time_current;

如果差异较大,那么我们就将一个新的时间 记录到ExtLastMove 中。


使用LastProfitForPeriod()可以访问交易历史。

这里使用了两个日期:从和到。到 "日期被设置为未来(当前时间加一天),"从 "日期通过 从当前时间减去24小时得到

   datetime from_date   = time_current-60*60*24;   // time one day ago
   datetime to_date     = time_current+60*60*24;   // time from the future :)
   double   last_profit = LastProfitForPeriod(from_date,to_date);

   Comment("Last profit: ",DoubleToString(last_profit,2));


暂时就这么多了,这是个很大的文本...

附加的文件:
 
Vladimir,非常感谢你的代码,特别是对其片段的评论
我不明白的是,为什么我们需要to_date等于未来?可能是到现在为止?看来,我们无法确定未来的交易结果:)还是我们需要未来的这一天来划定未来时间的界限?
另一个关于循环的问题。
据我所知,我们加载一个包含交易数据的数组,并从零交易到最后一个交易的数组中进行循环,将时间与最后写入的时间进行比较,如果交易时间较晚,则覆盖变量last_time。或者反过来说--数组可以从末端搜索?实际上,数组的最后一个元素将是我们需要数据的最后一个关闭的交易?
也许我犯了一些逻辑上的错误--请不要过于苛责 :)
 
意味着for(uint i=0;i<total;i++) 改为for(uint i=total;i>=0;i--)
 
事实上,你也不需要一个循环--你只需访问数组中 序号为i=total的元素即可。
 
我只是不明白为什么我们需要to_date等于未来的敲门?

我们需要这种方式。要获得保证的 "从 "和 "到 "当前时间

或者,也许有可能从末尾搜索阵列?

如果任务是找到最后一笔交易,那么数组必须经过并精确寻找时间--以防发生意外或内部内核逻辑被改变,交易将被随机重置。

 
Vladimir Karputov:

这是做的方法。要保证得到 "从 "和到当前时间

如果任务是找到最后一笔交易,那么阵列必须经过并寻找准确的时间--以防发生什么事情或内部内核逻辑发生变化,交易将被随机丢弃。

好的,知道了。原则上,考虑到24小时历史的限制,在翻阅数据时显然不会有明显的负荷 :)

 
renatmt5:

好的,知道了。原则上,考虑到24小时的历史限制,在翻阅数据时显然不会有任何明显的工作量 :)

所以,最后的润色是根据所获利润来移动线。

你还记得那里的搬家规则是什么吗?

 
我没有理解错,last_time和result是我们要处理的变量。其结果决定了该线将被转移(重绘)到未来多少时间。然后,"本期 利润 "代码块应放在 "移动垂直线 "块之前,以便在考虑到最后一笔交易数据的情况下移动该线。
,这是否正确或我混淆了什么?
 

这里解释一下为什么将来要做 "之前 "的参数。

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

错误、漏洞、问题

Renat Fatkhullin, 2016.11.04 12:43

千万不要把TimeCurrent()作为结束日期,要把TimeCurrent()+86400作为结束日期,以确保所有结束交易都被捕获。

TimeCurrent不是准确的最后时间,而是 "更新期间最后已知的 服务器时间",这并不是100%准确。特别是在开始时。