使用 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 );
答案 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中要求的那样,每个刻度线到达" ...,在每个刻度线上转移/更新anFxQuoteArrivalEVENT
,&#34; )。< / p>
早期提出的一个简单的 [0]
类循环似乎是第一眼看到的,作为一个简单的可以做的黑客攻击。
危险是隐藏在细节中的恶魔。
在大约100.000+引号之后,数组增长到大小单个内存页面将无法保持整个数组+处理时间变得非常弱(<线性) for(){ shift 'em all / store new}
,但是对于这样的规模来说,这种规模开始破坏的能力仍然像最终能够等待一些 O(1)
/ ms
一样快用于下一个FOREX市场活动&#39;到达非阻塞模式,因此 MetaTrader终端内部架构失去了与外部事件保持虚假同步错觉的能力。
us
是另一个隐藏的恶魔。
换句话说,这样的代码将开始&#34;缺失&#34;事件(将丢弃数据(在到达时它将永远不会看到,因为仍然在单元格移位循环中移动数据)。)
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()
方法,该方法将非常快,因为它只需要使用指针执行一些操作并仅分配一个内存即可。
但是,编写此类并非易事,因此,根据您的目标,它可能不是解决您案例的最佳解决方案。