在EA中逆向分析条形图

 

大家好。

这可能是一个非常愚蠢的问题,但我真的找不到方法。我试图创建一个EA。在分析了一些条形图后,它决定是否打开订单。如果我的EA停止或metatrader关闭了,当我重新打开它时,我想找到导致打开订单的条形图。所以我寻找订单并找到我的订单(EA刚刚打开的),我想开始回溯分析这些条形。我怎样才能做到这一点?我怎样才能找到我的订单打开的条形图并开始回溯条形图。

比如说。

我在H1时段运行,寻找12:00、13:00、14:00和15:00的条形图,然后我决定在16:00开一个订单。

我想过使用时间阵列等,但是,当我试图找到这些条形时,如果出现一个新的条形会发生什么?

我也不想把这些信息写入文件,这需要太多的时间和大量的异常处理等。

谢谢。

 
paranoyakX:

我想过使用时间数组等,但是,当我试图寻找条形图时,如果出现新的条形图会发生什么? 移位将被改变,我的搜索将是不合逻辑的。


在EA执行其代码时,不应该出现新的条形。当调用OnTick()时,它与加载的数据一起工作。

但不确定如果使用RefreshRates()会发生什么。

 
GumRai: 但不确定如果使用RefreshRates()会发生什么。

虽然,这并不经常发生(事实上,很少发生),但在使用RefreshRates() 时,我有过这样的经历:由于新的柱状体形成,柱状体数据被移位了。为了解决这个问题,我尝试在开始时将所有必要的数据复制到变量中,然后在事件执行的其余部分不再依赖历史数据阵列或相应的函数。这样,即使在我的代码中我需要使用RefreshRates(),我仍然可以安全地引用初始条件。

@paranoyakX: 所以,无论是否使用RefreshRates() ,你都可以尝试类似的方法。事实上,在MQL5中,你没有MQL4那样的能力,你必须把数据复制到你自己的数组中,以便处理它。因此,通过这种方式,你实际上离能够使你的代码与MQL4和MQL5兼容又近了几步。

然而,最好的解决方案不是在EA中编写所有这些代码,而是在一个指标中编写大部分逻辑,这样就不会有这个问题,因为方法完全不同。尽量在指标中编写尽可能多的信号逻辑。这也很有用,因为你可以直观地使用和测试该指标,直到它完全按照你的要求工作。指标解决方案的另一个用途是,它不仅为EA提供信号,也为手动交易提供信号。这样一来,EA只需专注于交易管理而不是信号。

 
paranoyakX:

[......]我想过使用时间数组等,但是,当我试图寻找条形图时,如果出现一个新的条形图,会发生什么? 移位将被改变,我的搜索将是不合逻辑的。

你问的问题可能很简单,我不知道我是否错过了重点。给定一个之前的OrderSelect(),你可以通过以下方式来查找与其OrderOpenTime()相关的条形转换。

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);

比如说

  • H1图表
  • 当前时间 是16:32
  • 订单是在14:23打开的
  • 上面的代码应该返回BarShiftOfOrderOpen=2,即H1的条形图在14:00,而Time[BarShiftOfOrderOpen]将是14:00
 
jjc: 你问的问题可能很简单,以至于我不知道我是否忽略了这一点。给定一个先前的OrderSelect(),你可以简单地通过做以下事情来查询与它的OrderOpenTime()相关的bar-shift。

比如说。

  • H1图表
  • 当前时间是16:32
  • 订单是在14:23打开的
  • 上面的代码应该返回BarShiftOfOrderOpen = 2,即H1图中14:00的条形图,Time[BarShiftOfOrderOpen] 将是14:00。

是的,这正是OP所说的,但他所质疑的不是如何做到这一点,而是如何防止在他处理数据时,由于新进入的tick形成一个新的bar shift而导致的无效。

然而,这不应该发生,除非你使用RefreshRates()。对于这种可能性(这种情况很少),我已经建议采用与MQL5相同的替代方法。

 
FMIC:

但如何防止由于新进入的tick形成新的bar shift而使其失效?

OP是怎么说的?这可能 是问题所在,但我认为你听到的是马蹄声,想到的是斑马而不是马。提到在重新启动MT4时将EA状态持久化到一个文件中,我认为这个问题实际上要简单得多。
 

大家好。

非常感谢你们的回答。

@FMIC,有趣的是,我从未想过使用指标,正如你所说,如果我创建并使用一个指标,这可能会更容易,但这当然会带来新的问题,如如何找到与我的订单配对的指标值等。另外,我不会每次都做这个过程,只是在OnInit()上做一次,所以也许使用EA就可以了。

@jjc,也谢谢你的解决方案。我其实有点担心 "新栏 "的问题,但正如你们所说,在EA运行时,不会有移位变化(而且我没有使用RefreshRates()函数),所以我也可以使用你们的代码。我现在只是好奇,在@FMIC说过之后,如果我把它创建为一个指标会不会更好?

 
jjc:
OP是怎么说的?这可能 是问题所在,但我认为你听到的是马蹄声,想到的是斑马而不是马。提到在重新启动MT4时将EA状态持久化到一个文件中,我认为这个问题实际上要简单得多。

甚至GumRai也发现了这一点,并引用了他的话,我将在这里再做一次。

paranoyakX:

我想过使用时间数组等,但是,当我试图寻找条形图时,如果出现新的条形图会怎样? 移位将被改变,我的搜索将是不合逻辑的。

 
paranoyakX:

@FMIC,有趣的是,我从未想过使用指标,正如你所说,如果我创建并使用一个指标,这可能会更容易,但当然这将带来新的问题,比如如何找到与我的订单配对的指标值等。另外,我不会每次都做这个过程,只是在OnInit()上做一次,所以也许使用EA就可以了。

@jjc,也谢谢你的解决方案。我其实有点担心 "新栏 "的问题,但正如你们所说,在EA运行时,不会有转变(而且我没有使用RefreshRates()函数),所以我也可以使用你们的代码。我现在只是好奇,在@FMIC说过之后,如果我把它创建为一个指标会不会更好?

如果我的建议对你来说太复杂了,请不要介意!你可以用最简单的方式来做。你现在可以用最简单的方式来做,然后当你对它更熟悉时,也可以尝试其他的方式。

PS!你不应该把任何逻辑代码放在OnInit()中,那只是你初始化东西的地方,而不是与历史数据系列数组的数据有关的地方。你所有的逻辑和主要代码都应该放在OnTick()或OnCalculate()中。

 
FMIC:

甚至GumRai也发现了这一点并引用了他的话,我将在这里再次引用。

你和Gumrai对 "如果出现新条形图 "的含义做了一个巨大的假设,而证据还不能证明这一点。OP还没有说 "如果在OnStart期间 有一个新的柱子出现"。

我怀疑paranoyakX在EA的全局变量中存储了交易/信号细节。我怀疑这个问题不是在调用OnStart()期间形成的新条形,而是在EA的生命周期内 形成的新条形。

 
jjc:

你和Gumrai对 "如果有一个新柱子出现 "的含义做了一个巨大的假设,而证据还不能证明这一点。OP还没有说 "如果在OnStart期间 有一个新的柱子出现"。

我怀疑paranoyakX在EA的全局变量中存储了交易/信号细节。我怀疑问题不是在调用OnStart()期间形成的新条,而是在EA的生命周期内 形成的新条。

EA中没有OnStart(),但我明白你的意思。然而,OP甚至在回应你的评论时说,我引用一下。

我实际上有点担心 "新条",但正如你们所说的,在EA运行期间不会有转变(而且我没有使用RefreshRates()函数)。