文章 "MQL5 中的统计分布 - 取最佳的 R" - 页 8

[删除]  

下面就是 R 的许可子程序文本:

      ier = 0
      neval = 0
      last = 0
      result = 0.0 e+00
      abserr = 0.0 e+00
      alist(1) = a
      blist(1) = b
      rlist(1) = 0.0 e+00
      elist(1) = 0.0 e+00
      if(epsabs.le.0.0 e+00.and.epsrel.lt.amax1(0.5 e+02*epmach,0.5 e-14))
     *   ier = 6
      if(ier.eq.6) go to 999
c
c           first approximation to the integral
c           -----------------------------------
c
      uflow = r1mach(1)
      oflow = r1mach(2)
      ierro = 0
      call qk21(f,a,b,result,abserr,defabs,resabs)
c
c           test on accuracy.
c
      dres = abs(result)
      errbnd = amax1(epsabs,epsrel*dres)
      last = 1
      rlist(1) = result
      elist(1) = abserr
      iord(1) = 1
      if(abserr.le.1.0 e+02*epmach*defabs.and.abserr.gt.
     *  errbnd) ier = 2
      if(limit.eq.1) ier = 1
      if(ier.ne.0.or.(abserr.le.errbnd.and.abserr.ne.resabs).or.
     *  abserr.eq.0.0 e+00) go to 140
c
c           initialization
c           --------------
c
      rlist2(1) = result
      errmax = abserr
      maxerr = 1
      area = result
      errsum = abserr
      abserr = oflow
      nrmax = 1
      nres = 0
      numrl2 = 2
      ktmin = 0
      extrap = .false.
      noext = .false.
      iroff1 = 0
      iroff2 = 0
      iroff3 = 0
      ksgn = -1
      if(dres.ge.(0.1 e+01-0.5 e+02*epmach)*defabs) ksgn = 1
c
c           main do-loop
c           ------------
c
      do 90 last = 2,limit
c
c           bisect the subinterval with the nrmax-th largest
c           error estimate.
c
        a1 = alist(maxerr)
        b1 = 0.5 e+00*(alist(maxerr)+blist(maxerr))
        a2 = b1
        b2 = blist(maxerr)
        erlast = errmax
        call qk21(f,a1,b1,area1,error1,resabs,defab1)
        call qk21(f,a2,b2,area2,error2,resabs,defab2)
c
c           improve previous approximations to integral
c           and error and test for accuracy.
c
        area12 = area1+area2
        erro12 = error1+error2
        errsum = errsum+erro12-errmax
        area = area+area12-rlist(maxerr)
        if(defab1.eq.error1.or.defab2.eq.error2) go to 15
        if(abs(rlist(maxerr)-area12).gt.0.1 e-04*abs(area12)
     *  .or.erro12.lt.0.99 e+00*errmax) go to 10
        if(extrap) iroff2 = iroff2+1
        if(.not.extrap) iroff1 = iroff1+1
   10   if(last.gt.10.and.erro12.gt.errmax) iroff3 = iroff3+1
   15   rlist(maxerr) = area1
        rlist(last) = area2
        errbnd = amax1(epsabs,epsrel*abs(area))
c
c           test for roundoff error and eventually
c           set error flag.
c
        if(iroff1+iroff2.ge.10.or.iroff3.ge.20) ier = 2
        if(iroff2.ge.5) ierro = 3
c
c           set error flag in the case that the number of
c           subintervals equals limit.
c
        if(last.eq.limit) ier = 1
c
c           set error flag in the case of bad integrand behaviour
c           at a point of the integration range.
c
        if(amax1(abs(a1),abs(b2)).le.(0.1 e+01+0.1 e+03*epmach)*
     *  (abs(a2)+0.1 e+04*uflow)) ier = 4
c
c           append the newly-created intervals to the list.
c
        if(error2.gt.error1) go to 20
        alist(last) = a2
        blist(maxerr) = b1
        blist(last) = b2
        elist(maxerr) = error1
        elist(last) = error2
        go to 30
   20   alist(maxerr) = a2
        alist(last) = a1
        blist(last) = b1
        rlist(maxerr) = area2
        rlist(last) = area1
        elist(maxerr) = error2
        elist(last) = error1
c
c           call subroutine qpsrt to maintain the descending ordering
c           in the list of error estimates and select the
c           subinterval with nrmax-th largest error estimate (to be
c           bisected next).
c
   30   call qpsrt(limit,last,maxerr,errmax,elist,iord,nrmax)
c ***jump out of do-loop
        if(errsum.le.errbnd) go to 115
c ***jump out of do-loop
        if(ier.ne.0) go to 100
        if(last.eq.2) go to 80
        if(noext) go to 90
        erlarg = erlarg-erlast
        if(abs(b1-a1).gt.small) erlarg = erlarg+erro12
        if(extrap) go to 40
c
c           test whether the interval to be bisected next is the
c           smallest interval.
c
        if(abs(blist(maxerr)-alist(maxerr)).gt.small) go to 90
        extrap = .true.
        nrmax = 2
   40   if(ierro.eq.3.or.erlarg.le.ertest) go to 60
c
c           the smallest interval has the largest error.
c           before bisecting decrease the sum of the errors
c           over the larger intervals (erlarg) and perform
c           extrapolation.
c
        id = nrmax
        jupbnd = last
        if(last.gt.(2+limit/2)) jupbnd = limit+3-last
        do 50 k = id,jupbnd
          maxerr = iord(nrmax)
          errmax = elist(maxerr)
c ***jump out of do-loop
          if(abs(blist(maxerr)-alist(maxerr)).gt.small) go to 90
          nrmax = nrmax+1
   50   continue
c
c           perform extrapolation.
c
   60   numrl2 = numrl2+1
        rlist2(numrl2) = area
        call qelg(numrl2,rlist2,reseps,abseps,res3la,nres)
        ktmin = ktmin+1
        if(ktmin.gt.5.and.abserr.lt.0.1 e-02*errsum) ier = 5
        if(abseps.ge.abserr) go to 70
        ktmin = 0
        abserr = abseps
        result = reseps
        correc = erlarg
        ertest = amax1(epsabs,epsrel*abs(reseps))
c ***jump out of do-loop
        if(abserr.le.ertest) go to 100
c
c           prepare bisection of the smallest interval.
c
   70   if(numrl2.eq.1) noext = .true.
        if(ier.eq.5) go to 100
        maxerr = iord(1)
        errmax = elist(maxerr)
        nrmax = 1
        extrap = .false.
        small = small*0.5 e+00
        erlarg = errsum
        go to 90
   80   small = abs(b-a)*0.375 e+00
        erlarg = errsum
        ertest = errbnd
        rlist2(2) = area
   90 continue
c
c           set final result and error estimate.
c           ------------------------------------
c
  100 if(abserr.eq.oflow) go to 115
      if(ier+ierro.eq.0) go to 110
      if(ierro.eq.3) abserr = abserr+correc
      if(ier.eq.0) ier = 3
      if(result.ne.0.0 e+00.and.area.ne.0.0 e+00) go to 105
      if(abserr.gt.errsum) go to 115
      if(area.eq.0.0 e+00) go to 130
      go to 110
  105 if(abserr/abs(result).gt.errsum/abs(area)) go to 115
c
c           test on divergence.
c
  110 if(ksgn.eq.(-1).and.amax1(abs(result),abs(area)).le.
     * defabs*0.1 e-01) go to 130
      if(0.1 e-01.gt.(result/area).or.(result/area).gt.0.1 e+03
     * .or.errsum.gt.abs(area)) ier = 6
      go to 130
c
c           compute global integral sum.
c
  115 result = 0.0 e+00
      do 120 k = 1,last
         result = result+rlist(k)
  120 continue
      abserr = errsum
  130 if(ier.gt.2) ier = ier-1
  140 neval = 42*last-21
  999 return
      end
[删除]  

哪种方法更简单:用 C 语言或 MQL4-MQL5 编写一个子程序,只需 0.5...1 个小时,然后就可以为自己和他人使用多年、

作为一种选择 - 使用 MQL4-MQL5 库中的子程序、

或者花几周时间 从 netLib 和 R 软件包的源代码和疯狂的函数名和参数名中挖掘,试图理解它们,尤其是 Fortran 程序员的火星逻辑--物理学家?

如果你想编写一个复杂的程序,你首先应该关心的是程序的简洁性和清晰度,而不是速度。

运行速度是次要的。

Metaquotes 知道如何使事情清晰易懂。顺便说一句,你必须具备这方面的特殊才能。这就是为什么他们在第一轮价格低廉的交易终端和开发环境的竞争中击败了所有人。没有人能够做到清晰、合理、简单。

那就用吧!它很棒而且是免费的!

333).现在有一个坏消息要告诉 San-Sanych、R 软件包和 Metaquotes:

交易中所需的几个基本数学函数在 Netlib、R 和 Metaquotes 中没有正确计算。

我对它们进行了正确的计算,并得到了积极的结果。如果按照其他人的方法计算,交易结果就是负数或几乎不是正数。抱歉,我不会告诉你是哪些函数。这就是为什么我喜欢自己写所有的东西,并在工作中使用长名称。昨天自己写的东西更容易理解。

下面是一个示例:

https://www.mql5.com/en/blogs/post/678673

https://www.mql5.com/en/users/alexeros/blog

Library of Math functions
Library of Math functions
  • 2016.08.29
  • //www.mql5.com/en/users/AlexEros">
  • www.mql5.com
This is an extract from production library of EAs "Graalino-Pro" and "Ocean Breeze". There is a dosen of general math functions here. Everything in this library is PUBLIC DOMAIN (and free). Example...
 
Sergiy Podolyak:

...

太神奇了,我第一次遇到对编写程序 持类似态度的人。这就是为什么我对它情有独钟。

eRaists 的主要论据是一个庞大的函数库和所谓的 "包",这些函数库和 "包 "会不断补充。请注意,所有或 99% 的这些人根本不懂 C 或 MQL。他们不习惯钻研代码,是 "自行车 "的反对者。但是,出于某种原因,eRasts 从来没有说过 R 是不可读的,而且如果您需要自己更正某些内容,实际上是不可能做到的,或者需要付出巨大的劳动成本。他们忘记了一个事实,那就是 C 和 C++(R 本身就是用 C 和 C++ 编写的)的代码可能比任何其他语言都要多。

举例来说,如果 Gadzila 从 MQL4 到 MQL5 开始重写代码库的那一刻起,就从 C 源重写开放 mat 和 stat 库,那么现在 MT5 就会成为最强大的平台,可以进行各种研究和高级交易,但幸运的是,这项工作已经由 MQ 完成。

顺便说一下,在我写 GA 之前,我通过 codeproject 查阅了数百个甚至数十个 C/C++ 源代码,尽管我的编程能力几乎没有超过零水平。也就是说,C/C++ 的开放源代码不仅能让你学习理论和任务方法,还能让远离编程的人创造出独特的新东西。但是,即使是 R 语言专家也很难或不愿意用 R 语言写出新东西,他们更容易满足于别人已经完成的工作,认为一切工作都是正确的。

[删除]  
Andrey Dik:
...

举例来说,如果 Gadzila 从 MQL4 到 MQL5 的代码库开始重写时,就从 C 源重写了开放 mat 和 stat 库,那么现在 MT5 将是最强大的平台,可用于各种研究和高级交易,但幸运的是,这项工作已由 MQ 完成。

同意。

但 "将是 "是什么意思?

MT4(和 MT5)终端长期以来一直是 用于各种交易研究的教学和学术 终端。他们只是没有在每个角落大肆宣扬,可能是他们对免费(即所谓的 "不可信")感到尴尬。

根据我与中级专业交易员交流的个人经验,我可以肯定地说,如今新的交易算法首先是在 MQL4 中编写的,然后再转移到任何其他拥有更多交易工具和访问更多交易所的付费终端上。但其成本要高得多:平台和报价从每月 250 美元到每月 1500 美元不等。即使是路透社和彭博社的自动交易功能也非常有限,每月费用约为 2000 美元。

至于 "先进性",我可以说,我(我们是一个团队)为 MT4 编写了世界上第一个商用交易程序(智能交易系统),并使用 CUDA GPU 加速。

这里有一个 Multicharts 交易系统(终端和报价每月 100...200 美元)论坛的链接,他们声称 "这是不可能的"。他们声称 "这是不可能的",而且是 nvidia 自己(即 CUDA 子系统的开发者)告诉他们的。

http://www.multicharts.com/discussion/viewtopic.php?f=1&t=8067

........................................................................................................................................................................

"亲爱的 bomberone1、

MultiCharts 的程序实现无法利用 CUDA、GPU 等系统。在 MC 中,当前值的计算基于之前值的计算。我们过去曾联系过 CUDA,他们确认,由于 MC 中使用的算法,他们的技术无法用于加快 MC 的计算速度。这在交易软件中很常见,因为 CUDA、GPU 和其他软件通常不用于交易。我们不知道有任何支持 CUDA 或 GPU 的类似软件"。

.........................................................................................................................................................................

看到了吗?他们说这是不可能的。他们的架构原则上不允许这样做。而 Methaquots 却能在终端上运行。我觉得这太荒谬了。

MultiCharts: Trading Software for Automated Trading and Backtesting • View topic - Windows HPC Server 2008 R2 and CUDA
  • www.multicharts.com
Author Message Will multicharts support the HPC technical computing? I'd like to use the power of computing cloud. In the while is it possible use the power of CUDA, the GPU power calculation for backtesting? Mathlab and other many trading software support this function, when will see these on mc? I write here the possibility to use...
 
Sergiy Podolyak:

我同意。

但 "会 "是什么意思呢?

MT4 终端(和 MT5)长期以来一直是 各种交易研究的教学和学术 终端。他们只是没有在每个角落大肆宣扬,可能是他们对免费(即所谓的 "不可信")感到尴尬。

是的,但对于那些喜欢 "一切从零开始 "的人来说,比如eRaasts,他们甚至不费吹灰之力就能进行研究。我就是这个意思。事实上,MT 是一个独一无二的研究和交易平台--这一点在很长一段时间内都是如此。
[删除]  
Andrey Dik:
是的,但对于大多数eRastas 等 "一切从零开始 "的爱好者来说,不费吹灰之力就能轻松完成研究。我就是这个意思。事实上,MT 是独一无二的研究和交易平台,这一点由来已久。

你骂那些被误导的人有什么意义或好处?不喜欢 R 系统?走过去就是了!好吧,或者有 2-3 次机会来教育他们,这些 R-schniki ,然后擦肩而过。没有完美的数学系统。交易终端也是如此。专业人士首先应该为自己的工作选择专业工具。这就是为什么有时需要使用多种工具。在我的构建中有 8 个版本的 CUDA 子程序:单精度、双精度、顺序算法、并行算法(即 4 种子程序组合)、C 语言版本、CUDA 语言版本以及纯 MQL4 子程序的精简版 - 用于 MQL5.com 市场。这对于错误检查和检查算法的准确性是必要的。在 C、MQL4 和 CUDA 中,一切工作几乎相同。San-Sanych 长期以来一直敦促大家也使用 R - 如何使用?我是否也应该编写第 8 或第 9 个版本的子程序?为什么?为了以后处理额外的参数和额外的错误?

Metaquotes 开始有条件地从分布函数中 "克隆" R 函数(实际上,这个过程比 R 软件包更广泛,这是好事)。这对于通过统计测试 验证其他统计函数是必要的。

更何况,如果 "可能很快 "MQL4-5 中就会出现相同的函数,那么程序员为什么还要沉浸在 R 这个庞然大物的疯狂世界中呢?将主要资源--时间--用于 R 的经济意义何在?

R 的 "普遍接受 "并没有给我带来任何启发。就我个人而言,我曾多次在科学领域看到这种情况--当 "普遍认可 "的权威出现在崇拜它的人身边时。根据我的亲身经历,我可以说,交易计算所要求的精确度是 R 的作者们做梦也想不到的。RenTec 是第一家也是最成功的全算法交易公司,它首先聘用的是天体物理学家,即从事特别精确计算的人员。自 20 世纪 90 年代以来,RenTec 就知道价格序列是一种密度极高的物质,需要通过非常精确的计算才能自动从中提取其微观结构。

 
Sergiy Podolyak:

你骂那些被误导的人有什么意义或好处?不喜欢 R 系统?路过就好!好吧,或者有 2-3 次他们是在教育他们,这些 R-施尼科夫,然后擦肩而过。没有完美的数学系统。交易终端也是如此。专业人士首先应该为自己的工作选择专业的工具。这就是为什么有时需要使用多种工具。

不,我没有骂你,我是在骂你。你可以叫我 eMQL-jast,如果你喜欢eRasts

我并不认为 eRastes 选择 R 进行研究是错误的,这对他们来说更容易,仅此而已。现成工具的简易性吸引了他们。在电脑上安装 R,从现成的工具中选择一个合适的软件包,加载数据,得到结果--这就是一般原则。但在 MQL 中,您必须编写其他东西!- 这对他们来说很难。这就是为什么现在在 MT 的标准交付中出现现成的软件包是如此重要的原因,它就像那些喜欢 "开箱即用 "的人所需要的一样--不需要在互联网上到处搜索 C 源(从您所需要的十亿种变体中),而只需要在终端本身使用现成的解决方案。

从条件上讲,eRast 和eMQL-ast 可分为多烹饪器菜肴爱好者和即兴烹饪爱好者。两者都应在 MT 中占有一席之地,我相信这是平台成功的关键--人人都能使用。

 

老实说,我不明白大家在争论什么。

我们中有人用 R 语言编写智能交易系统吗?

也许有人想在市场上卖呢?

有人用 R 语言编写全功能的智能交易系统吗?

也许有人创建了混合变体,其 "内核 "同时用 MQL 和 R 编写,并通过 DLL 有效地交织在一起?

在我看来,MQL 缺乏某些功能是很自然的,也是可以纠正的,但 R 中完全缺乏交易功能 是否可以纠正,谁来纠正? 为什么交易者需要它?

(请原谅我的外行)。

[删除]  
Реter Konow:

老实说,我不明白大家在争论什么。

我们中有人用 R 语言编写智能交易系统吗?

也许有人想在市场上卖呢?

有人用 R 语言编写全功能的智能交易系统吗?

也许有人创建了混合变体,其 "内核 "同时用 MQL 和 R 编写,并通过 DLL 有效地交织在一起?

在我看来,MQL 缺乏某些功能是很自然的,也是可以纠正的,但 R 完全缺乏交易功能 是否可以纠正,谁来纠正? 为什么交易者需要它?

(抱歉,我的观点比较外行)。

请原谅。我来帮你:

在谷歌上搜索 "R 交易策略 "可以得到 69,900,000 条结果。

不客气。

 
Sergiy Podolyak:

宽恕。我来帮你

在谷歌上搜索 "R交易策略",会得到69,900,000条结果。

不客气。

不...)

我喜欢 "R-方法",把所有东西都放在盘子里给我吧))