在EA中逆向分析条形图 - 页 3

 
paranoyakX:

谢谢你的建议,这是我的代码的一个非常简单的版本,这不是我真正的代码,但我希望这能更清楚。

正如我所说,这不是真正的代码,寻找模式等只是一个例子。我开这个话题的原因是DetectExistingPattern()函数

我已经给你提供了如何在OnTick() 的第一次运行中运行代码的示例代码,所以现在相应地更新你的代码帖,使你的DetectExistingPattern()在OnTick() 的第一次调用中运行,而不是在OnInit() 中。

另外,你不能用 "Bars "来检测一个新条。这是不正确的。你应该使用 "Time[0]"或 "SeriesInfoInteger( _Symbol, _Period,SERIES_LASTBAR_DATE)"。下面是一个例子。

bool isNewBar()
{
   static datetime last_time = WRONG_VALUE;
   datetime lastbar_time = (datetime) SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE ); // to be compatible with MQL5

   if( last_time != WRONG_VALUE )
   {
      if( last_time != lastbar_time )
      {
         last_time = lastbar_time;
         return( true );
      }
   }
   else
      last_time = lastbar_time;

   return( false );
}
 
FMIC:

我已经给你提供了如何在OnTick() 的第一次运行中运行代码的示例代码,所以现在相应地更新你的代码帖,使你的DetectExistingPattern()在OnTick() 的第一次调用中运行,而不是在OnInit()

另外,你不能用 "Bars "来检测一个新条。这是不正确的。你应该使用 "Time[0]"或 "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )"。这里有一个例子。

谢谢 @FMIC,我添加了简单的代码,因为@jjc要求这样做。顺便说一下,我是从我的记忆中学习使用Bars 的,每个人都是这样写的,所以我也这样做了。为什么它是错的?它是否可以不正常地工作?

ps:我使用metatrader 4,所以是mql4,对吗?

 
paranoyakX:

谢谢@FMIC,我添加了简单的代码,因为@jjc要求这样做。顺便说一下,我是从我的记忆中学习使用Bars的,大家都是这样写的,所以我也是这样做的。为什么它是错的?它是否可以不正常地工作?

ps:我使用metatrader 4,所以是mql4,对吗?

不是的!在论坛上,你会发现许多用户表明,"Bars "方法是非常古老不可靠 的,因为图表的 "选项 "可以改变条数,或者当达到每个图表的最大条数时,它可以保持不变。所以,使用它是错误的。使用 "Time[0]",或者如果你想让它与MQL5兼容,使用 "SeriesInfoInteger( _Symbol, _Period,SERIES_LASTBAR_DATE) "。请看我的例子。
 

FMIC:
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.

哇,我不知道,我将使用你的代码,非常感谢你。
 
Bars是不可靠的(刷新/重新连接可以改变图表上的条数)volume是不可靠的(错过ticks)总是使用时间。新蜡烛 - MQL4论坛
 
paranoyakX:

正如我所说,这不是真正的代码,寻找模式等只是一个例子。我开这个话题的原因是DetectExistingPattern()函数

回到你最初的问题上...在这个例子中,一个选择是你改变你的CheckTrendPattern()函数,这样它就可以被告知从一个特定的条形开始。你不使用1-10条的固定范围,而是使用1-10条的偏移,从指定的起点开始。

bool CheckTrendPattern(int StartAtBar){
 
  for(int i=StartAtBar + 10; i>=StartAtBar + 1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[StartAtBar + 10];
  LowestValue  = Low[StartAtBar + 1];
  
  return true;
};

当没有现有的订单,而你想检查当前是否符合模式,那么你就使用CheckTrendPattern(0)而不是CheckTrendPattern()。

当启动时,如果你有一个现有的订单,那么你可以寻找触发它的模式,如下所示。这与我一开始提出的建议相同:你得到相当于现有订单的开仓时间 的条形指数,然后从那里开始向后寻找。

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

然而,正如FMIC所说,最好是在第一次调用OnTick()时做这个检查,而不是在OnInit()时。我自己建议这样做的原因与 "耽误初始化 "无关。相反,我担心的是,当MT4重新启动时,EA已经连接到图表上,你还没有100%可靠地从经纪人那里获得订单列表或更新的条形历史。

你可能想记住的另一个考虑因素是以下情况,所有这些都发生在一个条形图所覆盖的时间内。

  • 你发现了一个模式并进行了交易
  • 您的开仓交易被关闭,例如,因为它碰到了止损。
  • MT4关闭(无论是否故意)。
  • MT4重新启动
  • EA重新找到当前模式,并在同一时间段进行另一笔交易,因为没有未平仓的交易。

您可能想检查已关闭的订单和未关闭的订单,以防止这种情况。

 
@jjc,你的建议很好,谢谢你的经验分享。
jjc:

回到你最初的问题...在这个例子中,一个选择是你改变你的CheckTrendPattern()函数,这样它就可以被告知从一个特定的柱子开始。你不使用1-10条的固定范围,而是使用1-10条的偏移,从指定的起点开始。

当没有现有的订单,而你想检查当前是否满足模式,那么你就使用CheckTrendPattern(0)而不是CheckTrendPattern()。

我的真实模式不是这样的,所以没有固定的数字(如10个例子),它是动态的,但我的模式检查方法是不同的,所以我无法回忆起它,这真的困扰着我,因为我写了一个类似的代码来再次寻找模式。问题是,当EA运行时,我只是检查最后一栏是否我的模式仍在继续,如果它是,那么我什么都不做,当模式被打破时,我开一个订单。因此,我不能在再次寻找模式时使用该代码,因为这次我必须回到条形上,而不是向前。我也不想向后搜索模式,因为在这种情况下,我将反复检查相同的条形。我只是担心性能问题,但正如我所看到的,这不会是一个问题,所以我正在考虑改变我的模式寻找方法,这样我就可以像你说的那样在启动和运行时都使用它。这也将防止可能出现的问题,比如如果我改变了我的模式,我将不得不改变重新寻找模式的程序,而我可以忘记这个。另外,正如@FMIC所说,也许我应该把这部分作为一个指标(我没怎么写),这样就不会出现寻找和重新寻找的问题。
jjc:

当启动时,如果你有一个现有的订单,那么你可以寻找触发该订单的模式,如下所示。这与我一开始提出的建议相同:你得到相当于现有订单开仓时间的条形索引,然后从那里开始向后寻找。 然而,正如FMIC所说,最好是在第一次调用OnTick()时进行这种检查,而不是在OnInit()时。我自己建议这样做的原因与 "耽误初始化 "无关。相反,我担心的是,当MT4重新启动时,EA已经连接到图表上,你还没有100%可靠地从经纪人那里获得订单列表或更新的条形历史。

你可能想记住的另一个考虑因素是以下情况,所有这些都发生在一个条形图所覆盖的时间内。

  • 你发现了一个模式并进行了交易
  • 您的开仓交易被关闭,例如,因为它碰到了止损。
  • MT4关闭(无论是否故意)。
  • MT4重新启动
  • EA重新找到当前的模式,并在同一栏中进行另一笔交易,因为没有未平仓的交易。

现在我更清楚为什么我应该在OnInit中这样做了,当然可靠性是最重要的一点,我没有想到你的考虑警告。这部分真的很重要,我可能会开出多余的订单,也许很少,但有可能。我必须以某种方式处理这个问题。真的非常感谢你。

@WHRoeder 你的新条形检查控件是如此简单和漂亮。我把你的方法加入了我的代码中,谢谢你。

 

大家好。

正如@FMIC所建议的,我写了一个指标,可以找到我的模式,给出一个信号,还有一些数据,将用于我的订单(我可能在不同的价格下开多个订单)。现在我想在我的EA中使用它,但我有一个问题,实际上我需要你的经验。当我从我的指标中得到一个信号时,我将打开一个订单或下一个订单(卖出限价或买入限价等),如果我的MT4由于任何原因崩溃,当我重新打开它时,我如何能找到打开的订单是属于我的指标中的哪个信号。我怎样才能使这个订单和指标转变 相匹配?

谢谢。

 
paranoyakX: 大家好,正如@FMIC所建议的,我写了一个指标,它可以找到我的模式,给出一个信号和一些更多的数据,用于我的订单(我可能会在不同的价格下开多个订单)。现在我想在我的EA中使用它,但我有一个问题,实际上我需要你的经验。当我从我的指标中得到一个信号时,我将打开一个订单或下一个订单(卖出限价或买入限价等),如果我的MT4由于任何原因崩溃,当我重新打开它时,我如何能找到打开的订单是属于我的指标中的哪个信号。我怎样才能使这个订单和指标转变相匹配?
是的,你可以使用iBarShift(),就像jjc 在之前的帖子中向你解释的那样,然后通过iCustom() 函数引用你的指标的数据。
 
FMIC:
是的,你可以使用iBarShift(),就像jjc 在之前的帖子中向你解释的那样,然后通过iCustom() 函数引用你的指标数据。
非常感谢@FMIC,所以使用移位是一个很好的解决方案。把我的模式作为指标是一个非常好的建议。当然,我将改变我的整个代码,但它将更加一致。