什么时候在指标中保留部分机器人代码才有意义? - 页 33

 

泽洛有用的论述...

在了解了参与者的资源和潜力后,我挑衅性地提议测量抽搐的速度和 "不可控性"。

1) 索夫尼格

2) 以1毫秒的频率运行的循环脚本

3) 诱导

4)一个第三方DDE接收器。

对于像我这样的新手来说,它也将是有用的。

;)

 

在晚上结束的时候。

附加的文件:
experts.zip  1 kb
 

我想补充我自己的两点意见。

将指标代码完全放在EA中的专家顾问的性能往往比调用自定义指标 的同类产品快三倍左右。对于指标计算量非常大的变体来说,情况也是如此。如果这些计算很轻,就不会有什么区别。EMA指标的计算方式过于原始,无法用于此类测量。在我最近在这个网站上的一些文章中,我甚至提出了一个专家顾问的变种,用非常重的指标计算JMA。使用没有指标调用的代码的版本要快三倍。

我个人并不想向任何人证明什么,我只是得出自己的结论,我亲眼看到的,而且不是一次;当然,我不是永远做这种事情,很可能是MT4的最后几个版本让这幅图看起来有些不同。甚至在MT5中,一开始也绝对是这样。但我没有记录这些细节,因此我不能断言现在也是如此。

 

GODZILLA:

在我最近在这个网站上的一些文章中,我甚至发布了一个专家顾问的变体,有一个非常重的指标计算JMA。不含指标调用的代码的变体工作速度快三倍。

在这里?结论很简单,有3种可能性。

1.没有指标调用的代码写得不正确,这是不可能的。

2.指标写得很不有效。

3.显示的数字并不反映现实。

 
GODZILLA:

我想补充我自己的两点意见。

将指标代码完全放在专家顾问中的专家顾问的性能往往比调用自定义指标的同类产品快三倍左右。对于指标计算量非常大的变体来说,情况也是如此。如果这些计算很轻,就不会有什么区别。EMA指标的计算方式过于原始,无法用于此类测量。在我最近在这个网站上的一些文章中,我甚至提出了一个专家顾问的变种,用非常重的指标计算JMA。使用没有指标调用的代码的版本要快三倍。

我个人并不想向任何人证明什么,我只是得出自己的结论,我亲眼看到的,而且不是一次;当然,我不是永远做这种事情,很可能是MT4的最后几个版本让这幅图看起来有些不同。甚至在MT5中,一开始也绝对是这样。但我没有记录这些细节,因此我不能断言现在也是如此。


别傻了。你只是还没有学会如何写指标。

在这样的异端之后。

//---- ЭМУЛЯЦИЯ ИНДИКАТОРНЫХ БУФЕРОВ
  int NewSize = iBars(symbol, timeframe);
  //----  Проверка на смену нулевого бара
  if(ArraySize(Ind_Buffer0) < NewSize)
    {
      //---- Установить прямое направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, false);
      ArraySetAsSeries(Ind_Buffer1, false);
      ArraySetAsSeries(Ind_Buffer2, false);
      //---- Изменить размер эмулируемых индикаторных буферов 
      ArrayResize(Ind_Buffer0, NewSize); 
      ArrayResize(Ind_Buffer1, NewSize); 
      ArrayResize(Ind_Buffer2, NewSize); 
      //---- Установить обратное направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, true);
      ArraySetAsSeries(Ind_Buffer1, true);
      ArraySetAsSeries(Ind_Buffer2, true); 
    } 
//----

你完全可以不在这个主题中发表意见。

 

揭穿谬论#1:你可以不使用IndicatorCounted()。

一个与之相关的指标。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

extern double Alpha = 0.9;

double EMA[];

int init()
{
   SetIndexBuffer(0, EMA);
   return(0);
}

int start()
{
   int toCount = MathMin(Bars - 1, Bars - IndicatorCounted());
   if (toCount == Bars - 1) EMA[Bars - 1] = Open[Bars - 1];
   for(int i = toCount - 1; i >= 0; i--)
   {
      EMA[i] = (1 - Alpha)*Open[i] + Alpha*EMA[i + 1];
   }
   return(0);
}

没有它,根据hrenfx 的原则

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

extern double Alpha = 0.9;

double EMABuffer[];

double GetPrice( int Shift )
{
  return(Open[Shift]);
}

double EMA;

int init()
{
   EMA = GetPrice(Bars - 1);

   SetIndexBuffer(0, EMABuffer);
   return(0);
}

double GetEMA()
{
   static int PrevTime = 0;

   if (PrevTime == Time[0])
      return(EMA);

   int i = iBarShift(Symbol(), Period(), PrevTime) - 1;

   PrevTime = Time[0];
   while (i >= 0)
   {
      EMA = EMA * Alpha + (1 - Alpha) * GetPrice(i);
      EMABuffer[i] = EMA;
      i--;
   }
   return(EMA);
}

void start()
{
  GetEMA();
}

然后,我们将指数应用到图表中,并在自动机运行时模拟失去连接的情况。结果。


 

是的,我也研究了一下这个话题。当然,在平台开发者的废话中乱来,真的很扯淡,但不管怎样。

你把我的EA转换成了一个指标。和你一样,我在24小时前就确定专家顾问的指标和简单EA的指标一定会显示相同的结果,因为它们都是在tick上触发的。但它们被触发的方式不同。连接出现后的第一个刻度,对于EA和从EA得出的指标来说是不一样的。你 可以自己检查一下。

上面的截图显示,在连接中断后,EA(不是EA的指标)与iCustom进行比较。沟通的中断在那里没有任何问题。

 

我假设在连接中断后的第一个刻度上,指标不会立即触发。更确切地说,指标等待IndicatorCounted()函数被执行。但这个功能的执行时间(取决于连接)可长达数秒。即,这里有一个计划。

  1. 连接失败后的第一次勾选。
  2. 指标已经开始。
  3. IndicatorCounted()被执行(似乎是在指标启动后立即执行,即使 IndicatorCounted()没有出现在指标主体中)一段时间。
  4. 收到结果后,交易环境被更新。
  5. 而指标开始执行它的代码,就像它不是在第一个tick,而是在IndicatorCounted()结果之前的最后一个tick开始的。

P.S. 在build 226上测试。

 
事实证明,为了使 "一体式 "的EA绝对可靠,我们应该在函数的最开始调用Empty指标和RefreshRates()。这将保证加载历史记录(中断后),并在第一个刻度上执行EA,对应于已经加载的历史记录。
 
hrenfx:
事实证明,为了使 "一体式 "的EA绝对可靠,我们应该在函数的最开始调用Empty指标和RefreshRates()。这将保证加载历史记录(中断后),并在第一个刻度上执行EA,对应于已经加载的历史记录。


还有,你能不能把关于这个猜测的研究和检查结果公布出来?

嗯... 如果是这样,而且它能保证装载,那么它就是一个非常好的选择。

我看到一个ForexTools的主题,其中没有解决在启动终端和专家顾问的时刻交换历史的问题。