【问题标题】:Reversed array with MQL4使用 MQL4 反转数组
【发布时间】:2015-12-15 13:40:06
【问题描述】:

使用 MetaTrader 终端 ( MQL4 ),我尝试创建一个反向数组,将其追加(前置)项目。

因此,在每一次变动中,myArray[0] 都成为“最新”值,而之前的值变为 myArray[1],依此类推。

但它听起来比听起来更难。

我试过这样 ->

       double myArray        = [];                        // GLOBAL Dynamic array
extern int    maxArrayLength = 50;                        // EXTERN iterable

// -----------------------------------------------------------------------
bool   prependToReversedDoubleArray( double& theArray[], double value, int maxLength ) {

       int size = ArraySize( theArray );                 // LOCAL size
       ArraySetAsSeries(     theArray, false );          // Normalize the array ( left to right )
       ArrayResize(          theArray, size + 1 );       // Extend array length

       Alert( "test = ", size );

       theArray[size] = value;                           // Insert the new value
       ArraySetAsSeries(     theArray, true );           // Reverse the array again
       if ( ArraySize(       theArray ) > maxLength ) {
            ArrayResize(     theArray,    maxLength );
       }
       return( true );
}

prependToReversedDoubleArray( myArray, 0.1234, maxArrayLength );

【问题讨论】:

  • 那么问题是什么,Kev?
  • [0] 元素总是最新的。
  • [0] 元素可能是最新的,问题是,在给定的任务 中,反转数组将无济于事(请参阅下面的详细信息)

标签: low-latency algorithmic-trading mql4 metatrader4 back-testing


【解决方案1】:
for( int i = arraylength - 1; i >= 1; i-- ) {
    value[i] = value[i-1];
    }
value[0] = newValue;

【讨论】:

  • 虽然这是可能的,但人们可能会意识到,随着 ArraySize() 的规模不断扩大,它计算效率非常低。高性能任务不应阻塞软实时执行流程,每次滴答到达时都会出现无法控制的内存交换和哑单元移动(节奏按 [ms] 顺序排列)- 这两个致命缺点都已解决您的控制权,并且幸运地出现在建议的算法中。 存在更好的方法。
  • @user3666197.. 我已经注意到,当在 EA 中运行多个自定义指标时,它并没有变得更快.. 所以任何关于高效循环和计算的信息都更受欢迎:)
  • Kev,Technical Indicator-s 的代码执行受到了New-MQL4.56789的重创乙>。它共享一个线程! (是的,所有指标都在一个共享线程的限制下执行...!!!)。可以想象,深度递归算法会带来什么(其中一些几乎扼杀了代码执行的旧 MT4 模型......)......所以是的,指标可以 & DO BLOCK 主要专家顾问代码执行 ...
  • 哎,不好。我刚刚发布了另一个问题 (stackoverflow.com/questions/34355907/…),我认为这将是不可能的。我发现一些代码可以使用 NodeJS 作为“计算”引擎并与 MQL4 通信。你可能可以克隆每个 NodeJS 实例,因此使用多核。你有没有尝试过这样的事情?我预计它会带来很多麻烦,但也许有更多的人在这样做?
  • 是的,我们使用 MQL4 代码,与许多远程外部参与者互连(虽然动机不统一,但技术是统一的,这增加了在学习曲线和掌握低延迟方面的投资回报率)分布式基础设施)。
【解决方案2】:

简介:

幸运的是,TimeSeries 组织的默认 MQL4 工具在这种情况下不起作用。

为什么?

MQL4 TimeSeries ( reversed ) 数组只会在当前 TimeFrame 的 aNewBarEVENT 上获得系统驱动的事件锁定单元格索引重新洗牌,而不是仅基于每个 anFxQuoteArrivalEVENT (如在 O/ P 移动/更新[0] 每次滴答到达 " ...,在每个滴答上," )。


如何让它以某种方式工作?

前面提出的一种微不足道的 for(){ shift 'em all / store new} 循环,乍一看似乎是一种简单的可以做的黑客。

危险是隐藏在细节中的魔鬼。

经过大约 100.000 次引号后,数组增长到单个内存页面无法容纳整个数组的大小 + 处理时间在 O(1)O(1)强>,但是到了这样的规模,开始破坏一个能力仍然一样快,最终能够等待几个ms / us for next外汇市场事件以非阻塞模式出现,因此 MetaTrader 终端 内部架构失去了保持与外部事件错误同步的错觉的能力。

ArrayResize() 是另一个隐藏的恶魔。

换句话说,这样的代码将开始“丢失”事件(将丢弃数据(它在到达时永远不会看到,因为仍在单元格移动循环中打乱数据)。 p>


如何让它运行起来又快又智能?

0 ) 避免内存页面交换 - 留在 RAM 中。

1 ) 避免任何阻塞步骤。

2 ) 避免任何形式的愚蠢的细胞改组 - 类似 value[i] = value[i-1];

3 ) 即时避开任何 ArrayResize()

解决方案以循环缓冲区架构的形式导致代理具有分布式(唯一可能的非阻塞帮助MT4 MQL4 代码执行与刚性,用户不可控,线程架构)

这种方式MQL4 代码可以包含一个轻量级代理对象(内部是一个本地的、类似缓存的托管环形缓冲区),它还可以无缝访问几乎无限量的单元数据,在远程进程中存储和实际维护 /一个快速的计算网格。

这既是非阻塞(永远)和快速智能无限 (如果您的算法交易需要).

【讨论】:

    【解决方案3】:

    感谢所有好的情报!我从解释中学到了很多:)

    我遇到的问题是,如何将值附加到反向数组的“开头”(写入array[0]并将其余部分向上移动)
    它仍然不是非阻塞的,可能不是最快的方式,但它现在可以工作。

    这是解决方案,它还需要一个 'maxLength' 值,以保持所需的数组大小:) :

    int prependToReversedDoubleArray(  double &theArray[],
                                       double  value,
                                       int     maxLength
                                       )
    {   int newSize = ArraySize( theArray ) + 1;
        ArraySetAsSeries( theArray, false );     // Normalize the array (left to right)
        ArrayResize(      theArray, newSize );   // Extend array length
    
        theArray[newSize-1] = value;             // Insert the new value
    
        ArraySetAsSeries( theArray, true );      // Reverse the array again
    
        if (  maxLength > 0
           && newSize   > maxLength )            // Check if the max length is reached
        {     newSize   = maxLength;
              ArrayResize( theArray, maxLength );
        }
        return( newSize );
    }
    

    【讨论】:

    • 这对于说... 10 个阵列是否可行?我需要为此准备几个数组,因为我正在尝试将复杂的 pine 脚本 (tradingview) 脚本转换为 MQL4。在那里,每个变量都神奇地作为一个系列工作,但在 mql4 中似乎要困难得多。
    • 这将使它变得非常简单,只要当我在每根新蜡烛上不断更新几个数组时它不会滞后
    【解决方案4】:

    这可以通过基于指针链接列表创建您自己的动态 Array 类来实现最佳性能。您可以定义自定义运算符[] 来访问其元素,就像使用普通数组一样。这个类可以实现一个Prepend() 方法,该方法非常快,因为它只需要使用指针执行一些操作和一次内存分配。

    但是,这样的类并不是一件简单的代码,因此根据您的目标,它可能不是您案例的最佳解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2017-11-07
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多