使用MQL4反转数组

时间:2015-12-15 13:40:06

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

使用 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 );

4 个答案:

答案 0 :(得分:3)

for( int i = arraylength - 1; i >= 1; i-- ) {
    value[i] = value[i-1];
    }
value[0] = newValue;

答案 1 :(得分:3)

说明:

幸运的是,TimeSeries组织默认 MQL4工具无法在此方案中使用。

为什么?

MQL4 TimeSeries(反向)数组只在当前的TimeFrame aNewBarEVENT上进行系统驱动的事件锁定单元索引重新混洗,而不仅仅基于每个{{1} (正如在O / P中要求的那样,每个刻度线到达&#34; ...,在每个刻度线上转移/更新anFxQuoteArrivalEVENT,&#34; )。< / p>

如何以某种方式使其工作?

早期提出的一个简单的 [0] 类循环似乎是第一眼看到的,作为一个简单的可以做的黑客攻击。

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

在大约100.000+引号之后,数组增长到大小单个内存页面将无法保持整个数组+处理时间变得非常弱(<线性) for(){ shift 'em all / store new} ,但是对于这样的规模来说,这种规模开始破坏的能力仍然像最终能够等待一些 O(1) / ms一样快用于下一个FOREX市场活动&#39;到达非阻塞模式,因此 MetaTrader终端内部架构失去了与外部事件保持虚假同步错觉的能力。

us 是另一个隐藏的恶魔。

换句话说,这样的代码将开始&#34;缺失&#34;事件(将丢弃数据(在到达时它将永远不会看到,因为仍然在单元格移位循环中移动数据)。)

如何使其快速工作&amp;智能?

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

1 )避免任何阻止步骤。

2 )避免任何类型的哑巴细胞洗牌 - 类似ArrayResize()

3 )避免任何 value[i] = value[i-1];

解决方案导致代理采用循环缓冲架构的形式,具有分布式(唯一可能的非阻塞帮助 ArrayResize() MT4代码执行使用严格的,用户不可控的线程架构)

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

这是非阻止(永远)和快速智能无限 (如果你的算法交易需要那个)

答案 2 :(得分:1)

感谢所有优秀的英特尔!我从解释中学到了很多东西:)

我遇到的问题是,如何将值附加到&#39;开头&#39;反向数组(写入 array[0] 并将其余部分移位)

它仍然不是非阻塞的,可能不是最快的方式,但它现在有效。

这是解决方案,它还需要一个&#39; maxLength&#39; value,根据需要保持数组大小:)

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 );
}

答案 3 :(得分:0)

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

但是,编写此类并非易事,因此,根据您的目标,它可能不是解决您案例的最佳解决方案。