金融证券的叠加和干扰

Khristian Piligrim | 8 四月, 2016

“你不会掉进同一个河里两次,
你也不会进入同一个市场两次。
所有事物都是流动的,没有事物会留在原处...”

DAO Piligrimm

简介

我们从物理课上了解到光干涉的原理。 干涉是对交于一点的具有相同频率的波进行增强或减弱。 根据静电学,电荷系统的场域强度等于由每个系统电荷独立生成的场域强度矢量和。

基于这两个法则,我决定检查其在外汇交易市场中的金融证券上的表现如何。 为此,我遵守以下公理:任何时间点上的货币对显示一个货币对比另一个货币的比率;此外,每个国家货币不仅相对于另一个货币在随时间变化,而且还相对自身随时间变化。

国家货币随时间相对自身进行改变,是受到了货币拥有国家的整体多方面经济因素所影响。 每个证券图表内所产生的价位以两个随时间变化的矢量的叠加形式获得,因此矢量根据相位与振幅做出变化。 矢量是货币拥有国家的所有经济因素以及国际因素的叠加衍生产品。

让我们以货币对 EURUSD 为例。 价格图表上的所得变动通过下列方式形成,考虑到了国家货币 EUR 和 USD 随时间流动发生的变化:

1). EURUSD 上升,如果:

а). EUR – 上升并且 USD – 下降;

б). EUR – 上升并且 USD – 不变;

в). EUR – 不变并且 USD – 下降;

г). EUR – 上升并且 USD – 上升;但速度慢于 EUR;

2). EURUSD – 下降,如果:

а). USD – 上升并且 USD – 下降;

б). USD – 上升并且 EUR– 不变;

в). USD – 不变并且 EUR– 下降;

г). USD– 上升并且 EUR– 上升;但速度慢于 USD;

3). EURUSD – 不变,如果:

а). USD – 不变并且 EUR– 不变;

б). USD – 上升并且 EUR– 上升;速度和 USD 一样;

в). USD – 下降并且 EUR– 下降,但速度和 USD 一样;

随着影响货币对行为受到更多因素影响,评估其行为和对未来进行预测将愈发困难。 因此,如果我们成功提取货币对的组成部分,随时间改变的国家货币值,通过和带有此货币以及影响其行为的多个因素的货币对相比较,我们便可以相当程度上界定国家货币移动的自由度。 因此我们可以提高对其行为评估和未来预测的精准度。 如何办到?



金融证券的叠加和干扰的原理

因此,任务通过以下方式定义:我们有一个货币对,如 EURUSD。 我们需要将这个货币对分解为两个组成部分 - EUR 和 USD。 为完成这个任务,我采用了 EUR 和 USD 与其他货币的可用交叉连线: EURGBP, EURJPY, EURAUD, EURCHF, EURCAD, EURNOK, EURSEK, EURDKK, EURNZD, EURSGD, EURHKD, USDCHF, USDJPY, USDCAD, USDNOK, USDSEK, USDDKK, USDSGD, USDHKD, USDMXN, USDZAR, GBPUSD, AUDUSD, NZDUSD. 虽然我有 USDMXN, USDZAR 的交叉连线数据,但我在自己的经纪公司内并没有对应的 EUR 交叉连线。 但这种情况很好解决: EURMXN = EURUSD * USDMXN; EURZAR = EURUSD * USDZAR.

解决任务的首个阶段,我们应将所有货币归入单一尺度。 为此,让我们来计算每个货币对的尺度系数,以作为样本长度 LengthSample 上对应货币对的平均平仓值。 随后,将每个货币对沿整个样本长度的价格值除以货币对所对应的尺度系数,我们便可获得归入单一尺度的货币对。

获得 EUR 和 USD 的第二个阶段,让我们将叠加和干扰法则运用到对应的包含对应 EUR 和 USD 的货币对组内,以及按照所使用证券编号的平均结果。

EUR = (EURUSD + EURGBP + EURJPY + EURAUD + EURCHF + EURCAD + EURNOK + EURSEK + EURDKK + EURNZD + EURSGD + EURHKD + EURMXN + EURZAR)/14;

USD = (USDCHF + USDJPY + USDCAD + USDNOK + USDSEK + USDDKK + USDSGD + USDHKD + USDMXN + USDZAR + 1/GBPUSD + 1/AUDUSD + 1/NZDUSD + 1/EURUSD)/14;

接受优先:一个货币对由两个国家货币的矢量构成,这些矢量随时间发生的相位变化是不同步的,但主要受到特定国家经济因素的影响而形成。我们可以得出以下结论:

根据干扰法则,多个货币交叉连线的叠加处构成了分子,相位一致则加强;分母的构成很大部分因相位不一致而需要相互补偿。

图 1 显示 EUR 和 USD 根据以上公式计算出的结果。 粉色表示 EUR,蓝色 - USD,浅蓝色 - EURUSD。

Fig.1

现在让我们来估计,上述公式的分母构成的补偿不完整会导致 EUR 和 USD 出现什么样的错误结果。 为此,我们建立了 EURUSD 图表,图 2 内的浅蓝色线,已计算的 EUR 和已计算 USD 的比例,表 2 内的红色线。

Fig.2

从以上图表可清楚看到,通过货币交叉连线的叠加和干扰获取的 EUR 和 USD 的相位失真并不显著,但存在重大的振幅误差,这说明了属于 EUR 和 USD 交叉连线一部分的国家货币构成的补偿不完整。 然而,可以发现柱体之间的误差非线性特性很小,这让我们可以通过包含以上公式到前一个柱体之间的补偿器,在当前柱体进行误差弥补。

补偿误差计算如下:

  Och   = EURUSD * USD / EUR;


将获取的误差值作为计算当前柱体时自前一个柱体的补偿元素,包含到 EUR 和 USD 的计算公式内,我们便可获得解决大部分应用问题的可接受计算误差。 图 3 显示了补偿后的计算结果,EURUSD 的图表,图 3 内的浅蓝色线,已计算的 EUR 和已计算 USD 的比例,表 3 内的红色线。 从图表可看出,获得的结果远好于补偿前。

Fig.3

如前所述,通过所提供的方法从 EURUSD 中提取 EUR 和 USD 组成,由此导致的相位失真并不明显,但对零柱历史记录和基于此记录获得的 EUR 和 USD 分析得越深入,历史记录的差异效应就会越明显。 如果忽略柱体,则不同货币交叉连线的同步性将因历史记录差异而受到干扰。 这便导致已计算的 EUR 和 USD 相对于 EURUSD 出现相位失真。

越深入分析历史记录,或使用越短的时间范围,历史记录的差异效应就越明显,所导致的相位失真也越大。 图 4 为可证明以上论述的图表。 这些图表是图 3 深入分析历史记录的图表延续。 由于积累的误差与对使用的多个证券的单独历史柱体的忽略相关,我们可以看到大量的相位失真。 未解决此问题,我们应使用高质量的历史数据,或使用特殊方式以填充历史记录差异。

Fig.4

计算出 EUR 和 USD 后,我们可以计算其他国家货币。


GBP = (EUR / EURGBP + GBPUSD * USD) / 2;
JPY = (EUR / EURJPY + USD / USDJPY) / 2;
AUD = (EUR / EURAUD + AUDUSD * USD) / 2;
CHF = (EUR / EURCHF + USD / USDCHF) / 2;
CAD = (EUR / EURCAD + USD / USDCAD) / 2;
NOK = (EUR / EURNOK + USD / USDNOK) / 2;
SEK = (EUR / EURSEK + USD / USDSEK) / 2;
DKK = (EUR / EURDKK + USD / USDDKK) / 2;
NZD = (EUR / EURNZD + NZDUSD * USD) / 2;
SGD = (EUR / EURSGD + USD / USDSGD) / 2;
HKD = (EUR / EURHKD + USD / USDHKD) / 2;
MXN = (EUR / EURMXN + USD / USDMXN) / 2;
ZAR = (EUR / EURZAR + USD / USDZAR) / 2;

图 5 为以上计算出的货币系列 EURUSD – 浅蓝色, EUR – 粉色, USD – 蓝色, GBP – 红色, JPY – 棕色, AUD – 紫色, CHF – 黄色, CAD – 黑色。

Fig.5

以上所述的本国货币算法,使用了叠加和干扰的原理,实施在我的指标 SuperPosition 内,该指标随附于本文。

//+------------------------------------------------------------------+
//|                                                SuperPosition.mq4 |
//|                                       Copyright © 2009,Piligrimm |
//|                                     mailto: piligrimm_fx@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009,Piligrimm"
#property link      "mailto: piligrimm_fx@mail.ru"
#property indicator_separate_window   
#property indicator_buffers 3
#property indicator_color1 Magenta
#property indicator_color2 Blue
#property indicator_color3 Aqua
//---- input parameters
extern int LengthSample=1000;
int i,j;
double GL[][81],EURClose[],USDClose[],EURUSDClose[],EURHigh[],USDHigh[],EURUSDHigh[],EURLow[],USDLow[];
double GBPClose[],JPYClose[],AUDClose[],CHFClose[],CADClose[],NOKClose[],SEKClose[],EURUSDLow[],Kf[27];
double DKKClose[],NZDClose[],SGDClose[],HKDClose[],MXNClose[],ZARClose[],SGDLow[],HKDLow[],MXNLow[];
double GBPHigh[],JPYHigh[],AUDHigh[],CHFHigh[],CADHigh[],NOKHigh[],SEKHigh[],DKKLow[],NZDLow[];
double DKKHigh[],NZDHigh[],SGDHigh[],HKDHigh[],MXNHigh[],ZARHigh[],ZARLow[],CloseOch,HighOch,LowOch;
double GBPLow[],JPYLow[],AUDLow[],CHFLow[],CADLow[],NOKLow[],SEKLow[];
//---- buffers

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   
       SetIndexBuffer(0,EURClose);               // Assigning an array to a buffer
   //    SetIndexBuffer(0,EURHigh);              // Assigning an array to a buffer
   //    SetIndexBuffer(0,EURLow);               // Assigning an array to a buffer
       SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);//   Line style
       SetIndexBuffer(1,USDClose);               // Assigning an array to a buffer
   //    SetIndexBuffer(1,USDHigh);              // Assigning an array to a buffer
   //    SetIndexBuffer(1,USDLow);               // Assigning an array to a buffer
       SetIndexStyle (1,DRAW_LINE,STYLE_SOLID,2);//   Line style
       SetIndexBuffer(2,EURUSDClose);            // Assigning an array to a buffer
   //    SetIndexBuffer(2,EURUSDHigh);           // Assigning an array to a buffer
   //    SetIndexBuffer(2,EURUSDLow);            // Assigning an array to a buffer
       SetIndexStyle (2,DRAW_LINE,STYLE_SOLID,2);//   Line style 
       
       ArrayResize(GL, LengthSample+1);
       ArrayResize(EURClose, LengthSample);
       ArrayResize(USDClose, LengthSample);
       ArrayResize(GBPClose, LengthSample);
       ArrayResize(JPYClose, LengthSample);
       ArrayResize(AUDClose, LengthSample);
       ArrayResize(CHFClose, LengthSample);
       ArrayResize(CADClose, LengthSample);
       ArrayResize(NOKClose, LengthSample);
       ArrayResize(SEKClose, LengthSample);
       ArrayResize(DKKClose, LengthSample);
       ArrayResize(NZDClose, LengthSample);
       ArrayResize(SGDClose, LengthSample);
       ArrayResize(HKDClose, LengthSample);
       ArrayResize(MXNClose, LengthSample);
       ArrayResize(ZARClose, LengthSample);       
       ArrayResize(EURHigh, LengthSample);
       ArrayResize(USDHigh, LengthSample);       
       ArrayResize(GBPHigh, LengthSample);
       ArrayResize(JPYHigh, LengthSample);
       ArrayResize(AUDHigh, LengthSample);
       ArrayResize(CHFHigh, LengthSample);
       ArrayResize(CADHigh, LengthSample);
       ArrayResize(NOKHigh, LengthSample);
       ArrayResize(SEKHigh, LengthSample);
       ArrayResize(DKKHigh, LengthSample);
       ArrayResize(NZDHigh, LengthSample);
       ArrayResize(SGDHigh, LengthSample);
       ArrayResize(HKDHigh, LengthSample);
       ArrayResize(MXNHigh, LengthSample);
       ArrayResize(ZARHigh, LengthSample);
       ArrayResize(EURLow, LengthSample);
       ArrayResize(USDLow, LengthSample);
       ArrayResize(GBPLow, LengthSample);
       ArrayResize(JPYLow, LengthSample);
       ArrayResize(AUDLow, LengthSample);
       ArrayResize(CHFLow, LengthSample);
       ArrayResize(CADLow, LengthSample);
       ArrayResize(NOKLow, LengthSample);
       ArrayResize(SEKLow, LengthSample);
       ArrayResize(DKKLow, LengthSample);
       ArrayResize(NZDLow, LengthSample);
       ArrayResize(SGDLow, LengthSample);
       ArrayResize(HKDLow, LengthSample);
       ArrayResize(MXNLow, LengthSample);
       ArrayResize(ZARLow, LengthSample);
       ArrayResize(EURUSDClose, LengthSample); 
       ArrayResize(EURUSDHigh, LengthSample);      
       ArrayResize(EURUSDLow, LengthSample);
       

//----

   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
//
int start()
    {//1

   for (i=0; i<=LengthSample; i++)                    
     {//2
       GL[i][0]=  iClose("EURUSD",0,i); 
       GL[i][1]=  iClose("EURGBP",0,i); 
       GL[i][2]=  iClose("EURJPY",0,i); 
       GL[i][3]=  iClose("EURAUD",0,i); 
       GL[i][4]=  iClose("EURCHF",0,i); 
       GL[i][5]=  iClose("EURCAD",0,i); 
       GL[i][6]=  iClose("EURNOK",0,i); 
       GL[i][7]=  iClose("EURSEK",0,i); 
       GL[i][8]=  iClose("EURDKK",0,i); 
       GL[i][9]=  iClose("EURNZD",0,i); 
       GL[i][10]= iClose("EURSGD",0,i); 
       GL[i][11]= iClose("EURHKD",0,i); 
       GL[i][12]= iClose("USDCHF",0,i); 
       GL[i][13]= iClose("USDJPY",0,i); 
       GL[i][14]= iClose("USDCAD",0,i); 
       GL[i][15]= iClose("USDNOK",0,i); 
       GL[i][16]= iClose("USDSEK",0,i); 
       GL[i][17]= iClose("USDDKK",0,i); 
       GL[i][18]= iClose("USDSGD",0,i); 
       GL[i][19]= iClose("USDHKD",0,i);
       GL[i][20]= iClose("USDMXN",0,i); 
       GL[i][21]= iClose("USDZAR",0,i); 
       GL[i][22]= iClose("GBPUSD",0,i); 
       GL[i][23]= iClose("AUDUSD",0,i); 
       GL[i][24]= iClose("NZDUSD",0,i); 
       GL[i][25]= GL[i][0]*GL[i][20];  //Close"EURMXN"
       GL[i][26]= GL[i][0]*GL[i][21];  //Close"EURZAR"
       GL[i][27]= iHigh ("EURUSD",0,i); 
       GL[i][28]= iHigh ("EURGBP",0,i); 
       GL[i][29]= iHigh ("EURJPY",0,i); 
       GL[i][30]= iHigh ("EURAUD",0,i); 
       GL[i][31]= iHigh ("EURCHF",0,i); 
       GL[i][32]= iHigh ("EURCAD",0,i); 
       GL[i][33]= iHigh ("EURNOK",0,i); 
       GL[i][34]= iHigh ("EURSEK",0,i); 
       GL[i][35]= iHigh ("EURDKK",0,i); 
       GL[i][36]= iHigh ("EURNZD",0,i); 
       GL[i][37]= iHigh ("EURSGD",0,i); 
       GL[i][38]= iHigh ("EURHKD",0,i); 
       GL[i][39]= iHigh ("USDCHF",0,i); 
       GL[i][40]= iHigh ("USDJPY",0,i); 
       GL[i][41]= iHigh ("USDCAD",0,i); 
       GL[i][42]= iHigh ("USDNOK",0,i); 
       GL[i][43]= iHigh ("USDSEK",0,i); 
       GL[i][44]= iHigh ("USDDKK",0,i); 
       GL[i][45]= iHigh ("USDSGD",0,i); 
       GL[i][46]= iHigh ("USDHKD",0,i);
       GL[i][47]= iHigh ("USDMXN",0,i); 
       GL[i][48]= iHigh ("USDZAR",0,i); 
       GL[i][49]= iHigh ("GBPUSD",0,i); 
       GL[i][50]= iHigh ("AUDUSD",0,i); 
       GL[i][51]= iHigh ("NZDUSD",0,i); 
       GL[i][52]= GL[i][27]*GL[i][47];  //High"EURMXN"
       GL[i][53]= GL[i][27]*GL[i][48];  //High"EURZAR"
       GL[i][54]= iLow  ("EURUSD",0,i); 
       GL[i][55]= iLow  ("EURGBP",0,i); 
       GL[i][56]= iLow  ("EURJPY",0,i); 
       GL[i][57]= iLow  ("EURAUD",0,i); 
       GL[i][58]= iLow  ("EURCHF",0,i); 
       GL[i][59]= iLow  ("EURCAD",0,i); 
       GL[i][60]= iLow  ("EURNOK",0,i); 
       GL[i][61]= iLow  ("EURSEK",0,i); 
       GL[i][62]= iLow  ("EURDKK",0,i); 
       GL[i][63]= iLow  ("EURNZD",0,i); 
       GL[i][64]= iLow  ("EURSGD",0,i); 
       GL[i][65]= iLow  ("EURHKD",0,i); 
       GL[i][66]= iLow  ("USDCHF",0,i); 
       GL[i][67]= iLow  ("USDJPY",0,i); 
       GL[i][68]= iLow  ("USDCAD",0,i); 
       GL[i][69]= iLow  ("USDNOK",0,i); 
       GL[i][70]= iLow  ("USDSEK",0,i); 
       GL[i][71]= iLow  ("USDDKK",0,i); 
       GL[i][72]= iLow  ("USDSGD",0,i); 
       GL[i][73]= iLow  ("USDHKD",0,i);
       GL[i][74]= iLow  ("USDMXN",0,i); 
       GL[i][75]= iLow  ("USDZAR",0,i); 
       GL[i][76]= iLow  ("GBPUSD",0,i); 
       GL[i][77]= iLow  ("AUDUSD",0,i); 
       GL[i][78]= iLow  ("NZDUSD",0,i); 
       GL[i][79]= GL[i][54]*GL[i][74];  //Low"EURMXN"
       GL[i][80]= GL[i][54]*GL[i][75];  //Low"EURZAR"                               
     }//2 

   for (j=0; j<27; j++)
     {//3
      Kf[j]=0;
    for (i=1; i<=LengthSample; i++)
      Kf[j]+=GL[i][j];
      Kf[j]/=LengthSample;
     }//3 
       
      CloseOch   = (GL[LengthSample][0]/Kf[0])*((Kf[0]/GL[LengthSample][0]+GL[LengthSample][12]/Kf[12]+GL[LengthSample][13]/Kf[13]
                   +GL[LengthSample][14]/Kf[14]+GL[LengthSample][15]/Kf[15]+GL[LengthSample][16]/Kf[16]+GL[LengthSample][17]/Kf[17]
                   +GL[LengthSample][18]/Kf[18]+GL[LengthSample][19]/Kf[19]+GL[LengthSample][20]/Kf[20]+GL[LengthSample][21]/Kf[21]
                   +Kf[22]/GL[LengthSample][22]+Kf[23]/GL[LengthSample][23]
                   +Kf[24]/GL[LengthSample][24])/14)/((GL[LengthSample][0]/Kf[0]
                   +GL[LengthSample][1]/Kf[1]+GL[LengthSample][2]/Kf[2]+GL[LengthSample][3]/Kf[3]+GL[LengthSample][4]/Kf[4]
                   +GL[LengthSample][5]/Kf[5]+GL[LengthSample][6]/Kf[6]+GL[LengthSample][7]/Kf[7]+GL[LengthSample][8]/Kf[8]
                   +GL[LengthSample][9]/Kf[9]+GL[LengthSample][10]/Kf[10]+GL[LengthSample][11]/Kf[11]+GL[LengthSample][25]/Kf[25]
                   +GL[LengthSample][26]/Kf[26])/14); 

      HighOch    = (GL[LengthSample][27]/Kf[0])*((Kf[0]/GL[LengthSample][27]+GL[LengthSample][39]/Kf[12]+GL[LengthSample][40]/Kf[13]
                   +GL[LengthSample][41]/Kf[14]+GL[LengthSample][42]/Kf[15]+GL[LengthSample][43]/Kf[16]+GL[LengthSample][44]/Kf[17]
                   +GL[LengthSample][45]/Kf[18]+GL[LengthSample][46]/Kf[19]+GL[LengthSample][47]/Kf[20]+GL[LengthSample][48]/Kf[21]
                   +Kf[22]/GL[LengthSample][49]+Kf[23]/GL[LengthSample][50]
                   +Kf[24]/GL[LengthSample][51])/14)/((GL[LengthSample][27]/Kf[0]
                   +GL[LengthSample][28]/Kf[1]+GL[LengthSample][29]/Kf[2]+GL[LengthSample][30]/Kf[3]+GL[LengthSample][31]/Kf[4]
                   +GL[LengthSample][32]/Kf[5]+GL[LengthSample][33]/Kf[6]+GL[LengthSample][34]/Kf[7]+GL[LengthSample][35]/Kf[8]
                   +GL[LengthSample][36]/Kf[9]+GL[LengthSample][37]/Kf[10]+GL[LengthSample][38]/Kf[11]+GL[LengthSample][52]/Kf[25]
                   +GL[LengthSample][53]/Kf[26])/14);
      
      LowOch     = (GL[LengthSample][54]/Kf[0])*((Kf[0]/GL[LengthSample][54]+GL[LengthSample][66]/Kf[12]+GL[LengthSample][67]/Kf[13]
                   +GL[LengthSample][68]/Kf[14]+GL[LengthSample][69]/Kf[15]+GL[LengthSample][70]/Kf[16]+GL[LengthSample][71]/Kf[17]
                   +GL[LengthSample][72]/Kf[18]+GL[LengthSample][73]/Kf[19]+GL[LengthSample][74]/Kf[20]+GL[LengthSample][75]/Kf[21]
                   +Kf[22]/GL[LengthSample][76]+Kf[23]/GL[LengthSample][77]+Kf[24]/GL[LengthSample][78])/14)/((GL[LengthSample][54]/Kf[0]
                   +GL[LengthSample][55]/Kf[1]+GL[LengthSample][56]/Kf[2]+GL[LengthSample][57]/Kf[3]+GL[LengthSample][58]/Kf[4]
                   +GL[LengthSample][59]/Kf[5]+GL[LengthSample][60]/Kf[6]+GL[LengthSample][61]/Kf[7]+GL[LengthSample][62]/Kf[8]
                   +GL[LengthSample][63]/Kf[9]+GL[LengthSample][64]/Kf[10]+GL[LengthSample][65]/Kf[11]+GL[LengthSample][79]/Kf[25]
                   +GL[LengthSample][80]/Kf[26])/14);
      
   for (i=LengthSample-1; i>=0; i--)
     {//4
      EURUSDClose[i]= GL[i][0]/Kf[0];

      EURClose[i]= (GL[i][0]/Kf[0]+GL[i][1]/Kf[1]+GL[i][2]/Kf[2]+GL[i][3]/Kf[3]+GL[i][4]/Kf[4]+GL[i][5]/Kf[5]+GL[i][6]/Kf[6]
                   +GL[i][7]/Kf[7]+GL[i][8]/Kf[8]+GL[i][9]/Kf[9]+GL[i][10]/Kf[10]+GL[i][11]/Kf[11]+GL[i][25]/Kf[25]
                   +GL[i][26]/Kf[26]+CloseOch)/14; 
                   
      USDClose[i]= (Kf[0]/GL[i][0]+GL[i][12]/Kf[12]+GL[i][13]/Kf[13]+GL[i][14]/Kf[14]+GL[i][15]/Kf[15]+GL[i][16]/Kf[16]
                   +GL[i][17]/Kf[17]+GL[i][18]/Kf[18]+GL[i][19]/Kf[19]+GL[i][20]/Kf[20]+GL[i][21]/Kf[21]+Kf[22]/GL[i][22]
                   +Kf[23]/GL[i][23]+Kf[24]/GL[i][24]+CloseOch)/14;
      
      CloseOch   = EURUSDClose[i]*USDClose[i]/EURClose[i];      
      GBPClose[i]= (Kf[1]*EURClose[i]/GL[i][1]+GL[i][22]*USDClose[i]/Kf[22])/2;                                                                 
      JPYClose[i]= (Kf[2]*EURClose[i]/GL[i][2]+Kf[13]*USDClose[i]/GL[i][13])/2;       
      AUDClose[i]= (Kf[3]*EURClose[i]/GL[i][3]+GL[i][23]*USDClose[i]/Kf[23])/2;       
      CHFClose[i]= (Kf[4]*EURClose[i]/GL[i][4]+Kf[12]*USDClose[i]/GL[i][12])/2;      
      CADClose[i]= (Kf[5]*EURClose[i]/GL[i][5]+Kf[14]*USDClose[i]/GL[i][14])/2;      
      NOKClose[i]= (Kf[6]*EURClose[i]/GL[i][6]+Kf[15]*USDClose[i]/GL[i][15])/2;      
      SEKClose[i]= (Kf[7]*EURClose[i]/GL[i][7]+Kf[16]*USDClose[i]/GL[i][16])/2;      
      DKKClose[i]= (Kf[8]*EURClose[i]/GL[i][8]+Kf[17]*USDClose[i]/GL[i][17])/2;      
      NZDClose[i]= (Kf[9]*EURClose[i]/GL[i][9]+GL[i][24]*USDClose[i]/Kf[24])/2;      
      SGDClose[i]= (Kf[10]*EURClose[i]/GL[i][10]+Kf[18]*USDClose[i]/GL[i][18])/2;      
      HKDClose[i]= (Kf[11]*EURClose[i]/GL[i][11]+Kf[19]*USDClose[i]/GL[i][19])/2;      
      MXNClose[i]= (Kf[25]*EURClose[i]/GL[i][25]+Kf[20]*USDClose[i]/GL[i][20])/2;      
      ZARClose[i]= (Kf[26]*EURClose[i]/GL[i][26]+Kf[21]*USDClose[i]/GL[i][21])/2;      
      EURUSDHigh[i] = GL[i][27]/Kf[0];                   
      EURHigh[i] = (GL[i][27]/Kf[0]+GL[i][28]/Kf[1]+GL[i][29]/Kf[2]+GL[i][30]/Kf[3]+GL[i][31]/Kf[4]+GL[i][32]/Kf[5]
                   +GL[i][33]/Kf[6]+GL[i][34]/Kf[7]+GL[i][35]/Kf[8]+GL[i][36]/Kf[9]+GL[i][37]/Kf[10]+GL[i][38]/Kf[11]
                   +GL[i][52]/Kf[25]+GL[i][53]/Kf[26]+HighOch)/14; 
                 
      USDHigh[i] = (Kf[0]/GL[i][27]+GL[i][39]/Kf[12]+GL[i][40]/Kf[13]+GL[i][41]/Kf[14]+GL[i][42]/Kf[15]+GL[i][43]/Kf[16]
                   +GL[i][44]/Kf[17]+GL[i][45]/Kf[18]+GL[i][46]/Kf[19]+GL[i][47]/Kf[20]+GL[i][48]/Kf[21]+Kf[22]/GL[i][49]
                   +Kf[23]/GL[i][50]+Kf[24]/GL[i][51]+HighOch)/14;             
      
      HighOch    = EURUSDHigh[i]*USDHigh[i]/EURHigh[i];      
      GBPHigh[i] = (Kf[1]*EURHigh[i]/GL[i][28]+GL[i][49]*USDHigh[i]/Kf[22])/2;                                                                 
      JPYHigh[i] = (Kf[2]*EURHigh[i]/GL[i][29]+Kf[13]*USDHigh[i]/GL[i][40])/2;       
      AUDHigh[i] = (Kf[3]*EURHigh[i]/GL[i][30]+GL[i][50]*USDHigh[i]/Kf[23])/2;       
      CHFHigh[i] = (Kf[4]*EURHigh[i]/GL[i][31]+Kf[12]*USDHigh[i]/GL[i][39])/2;      
      CADHigh[i] = (Kf[5]*EURHigh[i]/GL[i][32]+Kf[14]*USDHigh[i]/GL[i][41])/2;      
      NOKHigh[i] = (Kf[6]*EURHigh[i]/GL[i][33]+Kf[15]*USDHigh[i]/GL[i][42])/2;      
      SEKHigh[i] = (Kf[7]*EURHigh[i]/GL[i][34]+Kf[16]*USDHigh[i]/GL[i][43])/2;      
      DKKHigh[i] = (Kf[8]*EURHigh[i]/GL[i][35]+Kf[17]*USDHigh[i]/GL[i][44])/2;      
      NZDHigh[i] = (Kf[9]*EURHigh[i]/GL[i][36]+GL[i][51]*USDHigh[i]/Kf[24])/2;      
      SGDHigh[i] = (Kf[10]*EURHigh[i]/GL[i][37]+Kf[18]*USDHigh[i]/GL[i][45])/2;      
      HKDHigh[i] = (Kf[11]*EURHigh[i]/GL[i][38]+Kf[19]*USDHigh[i]/GL[i][46])/2;      
      MXNHigh[i] = (Kf[25]*EURHigh[i]/GL[i][52]+Kf[20]*USDHigh[i]/GL[i][47])/2;      
      ZARHigh[i] = (Kf[26]*EURHigh[i]/GL[i][53]+Kf[21]*USDHigh[i]/GL[i][48])/2;
            
      EURUSDLow[i]  = GL[i][54]/Kf[0];      
      EURLow[i]  = (GL[i][54]/Kf[0]+GL[i][55]/Kf[1]+GL[i][56]/Kf[2]+GL[i][57]/Kf[3]+GL[i][58]/Kf[4]+GL[i][59]/Kf[5]
                   +GL[i][60]/Kf[6]+GL[i][61]/Kf[7]+GL[i][62]/Kf[8]+GL[i][63]/Kf[9]+GL[i][64]/Kf[10]+GL[i][65]/Kf[11]
                   +GL[i][79]/Kf[25]+GL[i][80]/Kf[26]+LowOch)/14; 
                   
      USDLow[i]  = (Kf[0]/GL[i][54]+GL[i][66]/Kf[12]+GL[i][67]/Kf[13]+GL[i][68]/Kf[14]+GL[i][69]/Kf[15]+GL[i][70]/Kf[16]
                   +GL[i][71]/Kf[17]+GL[i][72]/Kf[18]+GL[i][73]/Kf[19]+GL[i][74]/Kf[20]+GL[i][75]/Kf[21]+Kf[22]/GL[i][76]
                   +Kf[23]/GL[i][77]+Kf[24]/GL[i][78]+LowOch)/14;
      
      LowOch     = EURUSDLow[i]*USDLow[i]/EURLow[i];      
      GBPLow[i]  = (Kf[1]*EURLow[i]/GL[i][55]+GL[i][76]*USDLow[i]/Kf[22])/2;                                                                 
      JPYLow[i]  = (Kf[2]*EURLow[i]/GL[i][56]+Kf[13]*USDLow[i]/GL[i][67])/2;       
      AUDLow[i]  = (Kf[3]*EURLow[i]/GL[i][57]+GL[i][77]*USDLow[i]/Kf[23])/2;       
      CHFLow[i]  = (Kf[4]*EURLow[i]/GL[i][58]+Kf[12]*USDLow[i]/GL[i][66])/2;      
      CADLow[i]  = (Kf[5]*EURLow[i]/GL[i][59]+Kf[14]*USDLow[i]/GL[i][68])/2;      
      NOKLow[i]  = (Kf[6]*EURLow[i]/GL[i][60]+Kf[15]*USDLow[i]/GL[i][69])/2;      
      SEKLow[i]  = (Kf[7]*EURLow[i]/GL[i][61]+Kf[16]*USDLow[i]/GL[i][70])/2;      
      DKKLow[i]  = (Kf[8]*EURLow[i]/GL[i][62]+Kf[17]*USDLow[i]/GL[i][71])/2;      
      NZDLow[i]  = (Kf[9]*EURLow[i]/GL[i][63]+GL[i][78]*USDLow[i]/Kf[24])/2;      
      SGDLow[i]  = (Kf[10]*EURLow[i]/GL[i][64]+Kf[18]*USDLow[i]/GL[i][72])/2;      
      HKDLow[i]  = (Kf[11]*EURLow[i]/GL[i][65]+Kf[19]*USDLow[i]/GL[i][73])/2;      
      MXNLow[i]  = (Kf[25]*EURLow[i]/GL[i][79]+Kf[20]*USDLow[i]/GL[i][74])/2;      
      ZARLow[i]  = (Kf[26]*EURLow[i]/GL[i][80]+Kf[21]*USDLow[i]/GL[i][75])/2;      
     }//4  

   return(0);

     }//1
//+------------------------------------------------------------------+

为正确进行终端操作,所有在其中使用的货币对应在相同时间范围内下载。

在受 “//2” 限制的回路内,通过三个函数 iClose、iHigh、iLow 的帮助,数据从所有由指标使用的证券上下载。 在受 “//3” 限制的回路内,将计算所有交易品种的换算因数。 将计算 LengthSample 柱体上的进一步补偿误差。 在受 “//4” 限制的回路内,所有国家货币都根据以上算法以及在该柱体上计算的补偿误差进行计算。

如果需要将计算出的数据显示在主图表窗口而非单独窗口的话,则计算出的货币值应乘以从 EURUSD 获取的换算因数;此外, #property indicator_separate_window 应由 #property indicator_chart_window 替代。 图 6 显示该计算得出的结果。 EUR – 粉色, USD – 蓝色, GBP – 红色, JPY – 棕色, AUD – 紫色, CHF – 黄色, CAD – 黑色。

Fig.6



总结

所展示国家货币的计算方法是通用的,且可同样用于计算其他交易品种。 此外,该算法允许合成未出现在你经纪公司内的货币对,或获取一些根本不存在的外国货币对。 加上从货币对提取的国家货币将提高交易品种的信息特性,你可利用这些特性,来帮你对市场环境进行更准确的预测并建立多种有效的交易策略。