从MT4转移到MT5的问题。或者,更确切地说,在MT5中无法执行某些算法而不出现错误。 - 页 11

 

供思考的信息。

观察市场上公布的一些EA发展。或者一些文章。

他们经常在EA的经纪商选择要求中指定一个小点差。

而且,在我看来,MT5在很大程度上被调整为对市场的变化做出快速反应。这解释了为什么所有带有等待报价更新的刹车都被关闭。

这意味着,如果有更新的报价,终端将拒绝对时间序列的访问。不干扰一些快速算法。

这种范式有权利存在。在这种情况下,交易是短暂的。它被迅速输入。收集几个点。迅速退出。

但还有另一种范式。

市场上有一些极端情况,形成了市场反转。

这些极端情况甚至可能在几年前就已形成。但它们继续影响着当前的市场形势。

在这种情况下,也可以考虑到滴答或分钟历史上的瞬间变化。但它们不是决定性的。

在这种情况下,有可能等待报价更新,而不会因为访问中断而退出处理程序。而且它只在MT4中工作。

一些图片,并附有对所讲内容的解释。

我们采取每月一次的tf。1995年3月、2000年10月和2007年7月的极端情况继续影响着市场。

即使是1985年2月的极端情况也有影响。


可以看出,用这些极值构建的线条被市场注意到了。

让我们转到其他时间框架。大约按照这样的比例,就像我们在做波浪式加价一样。这种选择可能会导致在每个TF中发展一个波段水平

每周tf。

D1:

H4:

M30:

M5:

M1:

我们看到历史上很久之前形成的极值对市场当前的势头有影响。

----------------------------------

应持续提供此类建筑的报价。

我将进一步继续。基本上图片中显示的所有东西都是在手工交易中使用的。

但是。有可能将不同时间段的报价输入到几个神经网络的输入中,例如图片中所代表的。每个NS将处理自己的数据。并在其输出上给出自己对所发生事情的理解。神经网络的输出将根据酒吧的接收时间同步进行。

在这种情况下,来自优先级较高的NS的信号比优先级较低的信号更重要。

从神经网络接收到的信号被送入以下NS的输入,并对优先级有一定的考虑。这里可能有一些变种。

例如,神经网络的第一层可以是LSTM类型的。在这种情况下,我们指的是神经网络从其时间框架中获取报价的层。第一层的每个神经网络可以有几层神经元。

求和神经网络可以有自己的架构。这更像是一项工程任务。

例如,可以用一些交易开仓的算法进行训练。在神经网络的第一层。也就是说,第一层的每个神经网络都是单独训练的。例如,我们在相应层的一个柱子结束时开启交易。你甚至可以在不同的方向开启交易。这些交易是有条件的。 在这些交易结束时,会发出一个信号来训练NS。

因此,聚合神经网络被赋予选择最佳交易模式的权利。

因此,我们得到的算法有点类似于DeepMinde团队在Alfa Zero中实现的算法。

你应该在所有选定的时间段的整个历史上训练这样一个网络。唯一需要考虑的是,MT5的所有时间序列都是基于分钟的。这是不正确的。 1993年以前关于欧元的NCC文件是由时间序列组成的。一定有一种算法可以重建真正的时间序列的时间框架。

你可以在一个货币对上进行训练。并在另一个人身上进行测试。

------------------------------

摘要。为什么在这种方法中,有必要对市场上发生的事情做出快速反应?

 
Eugeni Neumoin:


对不起,离题了,但只要话题有趣,我就不能放弃。


胜利

嗯,我的意思是这样的。

MQL有tyename() - 它返回字符串类型名称,甚至可以工作。

void OnStart()
  {
   Print(typename(Txt()));      // в логе будет       string
  }
string Txt()
{
return(" Txt ");
}

知道MyFunc()类型--写一个宏((,...)。当然,我可以编写所有类型为_Try_helper的宏...在一般情况下,我可能不是冒险家,因为我不知道如何

 
Igor Makanu:

很抱歉有些离题,但只要是有趣的话题,我就不能放弃。


这很好。

 
Igor Makanu:

MQL有tyename() - 它返回字符串类型的名称,甚至可以工作。

知道MyFunc()类型--写一个宏((,...)。当然,我可以编写所有类型为_Try_helper的宏...嗯,我想我不是一个赌徒,因为我不知道如何

µl中的tyename()不会有任何帮助,它不会在编译时给出适合变量声明 的类型,只是打印出来。这就给我们留下了Try_d()、Try_i()、...。.我不知道如何在µl中获得decltype功能。

 
Vict:

µl中的tyename()不会有帮助,它不会在编译时给你一个适合声明变量 的类型,只是打印它。这样我们就只剩下Try_d(), Try_i(), ....我不知道如何在µl中获得decltype功能。

嗯,我一点都不觉得自己是个赌徒!我甚至可以说绝对不是赌徒!"。)))- 我不知道如何,这就是一些东西将如何工作(我真的不明白它是如何在机器层面 "全部旋转 "的--我想我们有一个严格的类型化语言?)

void OnStart()
{
  int i = func(1);
  double d = func(1.123);
  string s = func("s");
  Print("i = ",i);
  Print("d = ",d);
  Print("s = ",s);
}

template<typename T>
T func(T invalue)
{
   string s = typename(T);
   if(s=="int") return(invalue);
   if(s=="double") return(invalue);
   if(s=="string") return("Hello word!!!");
return(NULL);
}

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) i = 1

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) d = 1.123

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) s = Hello word!!!


你也可以描述一个指向函数的指针

typedef void(*TFuncvoidPTR)(void);

并进一步使用

TFuncvoidPTR      func[];
....
func[0]();
 
Vict:

µl中的tyename()不会有帮助,它不会在编译时给出适合变量声明 的类型,只会打印出来。这使得我们只能将Try_d()、Try_i()、......相乘。.我不知道如何在µl中获得decltype功能。

一个带有静态T型变量的模板函数。

 
Igor Makanu:

谢谢你!

我看了你的帖子,不幸的是,你在很多方面都是对的,昨天我和版主Artem在这个话题上进行了很多交流,谈话的结果是:如果它是这样实施的,那么它就应该这样运作......一般来说,就像老广告中所说的 "你只是不知道如何烹饪它们!"。

我认为,MQL5编译器的结果真的很好(它的生产力很高!),但它作为一个交易终端 的使用 ...好吧,让我们这样说:它需要非常非常好的技术培训和欲望,比 "在旧的终端 "多写~30%的代码(--甚至这个短语在论坛上也是一个成熟的表达)。

阿伊-伊-伊...我没有这么说 :)

我是说--利用你所拥有的东西来获得你想要的结果。

我把其余的情绪留给自己。

 
Igor Makanu:

我没有说主持人Artem说过这样的话,我只是写了谈话的结果--我认为这是我的判断,我只能根据我的情绪和对谈话的分析形成判断....。))))

也就是说,我不知道别人的脑袋里发生了什么,我只能看到自己的脑袋......幸运的是,现在在镜子里)))。

我会相信它,如果不是

谈话的结果:如果这样实施,那么它应该是有效的......就像以前的广告一样,"你 只是不知道如何烹饪它们!"

我的结论 是:如果它是这样实施的,那么它就应该是这样工作的......就像以前的广告一样,"我 只是不知道如何烹饪它们!"

因此,事实证明,从镜子中引用的一个头像据说是主持人阿尔特姆...

也好,如果是私下里的谈话。但是,对我没有说过的话公开下结论,就是用我所谓的完全错误的观点公开陷害我--我的观点与这句话中所谓的观点完全不同。

我可以发表我的意见。

让我们充分利用我们目前所拥有的,不要抱怨,帮助发现错误,并期待修复--它们确实得到了修复,并出现了新的好功能。

 
Artyom Trishkin:

我会相信它,如果不是

它是

但事实证明,从镜子里引用的一个头像据说是主持人阿尔特姆...

也好,如果是私下里的谈话。但是,对我没有说过的话公开下结论,就是公开用所谓我完全错误的观点来陷害我--我的观点与这句话中所谓的观点完全不同。

我可以发表我的意见。

我不是在抱怨,我是在帮助发现错误并要求修复--它们正在被修复,新的酷炫功能正在出现。

嗯,事情变得多么复杂....自己打扫卫生,我的意见...开发商对他们的产品有自己的看法,这是他们的业务,我的意见是......。如果你在2天内不更新这个主题,它就会被排在前面。


...它将如何改变......好吧,今天一位好心人@Vict- 向我展示了一些简单的调试技术,最重要的是 - 我可以实现我的代码的可读性 - 这改变了我对MQL5的看法,一般来说,论坛的成员

我现在要闭嘴了,幸运的是有一个历史悠久的论坛,你不能回过头来,在这个论坛的搜索中看到太多关于我问题的答案。

 
Igor Makanu:

fxsaber 是正确的 - 有一个选项

 template <typename T> T Try_helper(T val, bool assign) {
   static T sval;
   if (assign)
      sval = val;
   return sval;
}
#define  Try(EXPR, MES)                    \
   Try_helper(EXPR, true);                \
   if (Try_helper(EXPR, false) <= 0.0) {  \
     printf("Error: %s ", MES);           \
     return;                              \
   }

double f(double) {return DBL_MAX;}
ulong f(ulong) {return ULONG_MAX;}

void OnStart()
{

   double d = Try(f(0.), "double error");
   ulong u = Try(f(0), "ulong error");
}

这有点土气--EXPR将被计算两次,但还是比较灵活。不能说它是通用的(只针对算术类型。误差值必须相等,这是令人不快的。我试图通过结构/功能的明确专业化来避免这种情况,但这可能是不可能的。

template <typename T> bool Try_helper_is_valid(T val);
template <> bool Try_helper_is_valid<string>(string val) {val==""?false:true;}  // compile-time error

template <typename T>
struct S;
template <>
struct S<string> {...};      // compile-time error

好吧,看来无论你在µl的什么地方挖掘,你都会发现陷阱无处不在。也许,最好把自己限制在一个固定类型的高度专业化的小宏观上。