English Русский Español Deutsch 日本語 Português
preview
MQL5 中的范畴论 (第 2 部分)

MQL5 中的范畴论 (第 2 部分)

MetaTrader 5积分 | 21 七月 2023, 14:16
723 0
Stephen Njuki
Stephen Njuki

概述

上一篇文章,我们通过关注其公理,以及介绍本体日志来涵盖类别的定义。 我们将通过研究极限和共限来继续这个关于范畴论的系列;专注于各自类型的乘积余积;最后,获取它们各自对通用属性的看法。然而,在我们深入研究如何在 MQL5 中开发这些概念之前,根据本文所涵盖的内容,分享一些关于如何在交易系统中应用和使用范畴论的想法也许会令人鼓舞。 在此共享的系统非常简陋,只是为了向交易者突出主题的潜力。 这在序言中首先涵盖。


序言

在本文中,我们将观察一种乘积,其范畴论中是一种枚举域元素配对方式,且不丢失先前成分信息。 在 MQL5 向导信号文件中使用它,我们就能创建一个智能系统。 故此,我们的乘积将介于 2 个域之间,即 De-Marker 指标和威廉姆斯百分比范围指标的数值。 然后,这些域中的每一个都将具有“做多条件”和“做空条件”域的态射。 来自两个域的输出相加的净结果,其与典型信号文件的买入和卖出函数同义,将判定智能系统是去做多还是做空。 这是我们的信号文件清单。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CSignalCT : public CExpertSignal
  {
protected:
   CiDeMarker        m_dmk;            // object-oscillator (first corner)
   CiWPR             m_wpr;            // object-indicator (second corner)
   //--- adjusted parameters
   int               m_periods;        // the "period of calculation" parameter of the oscillator & indicator
   ENUM_APPLIED_PRICE m_applied;       // the "prices series" parameter of the oscillator & indicator
   double            m_longdmk;        // long dmk weight
   double            m_shortdmk;       // short dmk weight
   double            m_longwpr;        // long wpr weight
   double            m_shortwpr;       // short wpr weight

public:
   //--- methods of setting adjustable parameters
   void              Periods(int value)                { m_periods=value;  }
   void              Applied(ENUM_APPLIED_PRICE value) { m_applied=value;  }
   
   void              LongDMK(double value) { m_longdmk=value;  }
   void              ShortDMK(double value) { m_shortdmk=value;  }
   void              LongWPR(double value) { m_longwpr=value;  }
   void              ShortWPR(double value) { m_shortwpr=value;  }
   //--- method of verification of settings
   virtual bool      ValidationSettings(void);
   //--- method of creating the indicator and timeseries
   virtual bool      InitIndicators(CIndicators *indicators);
   //--- methods of checking if the market models are formed
   virtual int       LongCondition(void);
   virtual int       ShortCondition(void);
                     CSignalCT(void);
                    ~CSignalCT(void);

protected:
                    
   virtual void      LongMorphism(void);
   virtual void      ShortMorphism(void);
   
   virtual double    Product(ENUM_POSITION_TYPE Position);
   
   NCT::
   CDomain<double>   long_product,short_product;
   //--- method of initialization of the oscillator
   bool              InitDMK(CIndicators *indicators);
   bool              InitWPR(CIndicators *indicators);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CSignalCT::CSignalCT(void)
  {
//--- initialization of protected data
   m_used_series=USE_SERIES_HIGH+USE_SERIES_LOW+USE_SERIES_CLOSE+USE_SERIES_TIME;
   
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CSignalCT::~CSignalCT(void)
  {
  }
//+------------------------------------------------------------------+
//| "Voting" that price will grow.                                   |
//+------------------------------------------------------------------+
int CSignalCT::LongCondition(void)
  {
      int result=0;
      
      //Using Domains Indicator biases (long or short)
      //e.g. an DMK reading of 75 => long-25, short-75 
      //or price at upper WPR => long-0, short-100
      LongMorphism();
      
      result=int(round(Product(POSITION_TYPE_BUY)));
      
      return(result);
  }
//+------------------------------------------------------------------+
//| "Voting" that price will fall.                                   |
//+------------------------------------------------------------------+
int CSignalCT::ShortCondition(void)
  {
      int result=0;
      
      ShortMorphism();
      
      result=int(round(Product(POSITION_TYPE_SELL)));
      
      return(result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CSignalCT::LongMorphism(void)
   {
      int _index=StartIndex();
      
      m_wpr.Refresh(-1);
      m_dmk.Refresh(-1);
      m_close.Refresh(-1);
      
      double _wpr=-1.0*(m_dmk.GetData(0,_index)/100.0);
      double _dmk=(1.0-m_dmk.GetData(0,_index));
      
      NCT::CElement<double> _e;
      _e.Cardinality(2);
      _e.Set(0,_dmk);_e.Set(1,_wpr);
      
      long_product.Cardinality(1);
      long_product.Set(0,_e,true);
   }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CSignalCT::ShortMorphism(void)
   {
      int _index=StartIndex();
      
      m_wpr.Refresh(-1);
      m_dmk.Refresh(-1);
      m_close.Refresh(-1);
      
      double _wpr=-1.0+((m_dmk.GetData(0,_index))/100.0);
      double _dmk=(m_dmk.GetData(0,_index));
      
      NCT::CElement<double> _e;
      _e.Cardinality(2);
      _e.Set(0,_dmk);_e.Set(1,_wpr);
      
      short_product.Cardinality(1);
      short_product.Set(0,_e,true);
   }
//+------------------------------------------------------------------+
//| Morphisms at Product                                             |
//+------------------------------------------------------------------+
double CSignalCT::Product(ENUM_POSITION_TYPE Position)
   {
      double _product=0.0;
      
      NCT::CElement<double> _e;
   
      if(Position==POSITION_TYPE_BUY)
      {
         if(long_product.Cardinality()>=1 && long_product.Get(0,_e))
         {
            _product=100.0*((m_longdmk*_e.Get(0))+(m_longwpr*_e.Get(1)))/(m_longdmk+m_longwpr);
         }
         
         return(_product);
      }
      
      if(short_product.Cardinality()>=1 && short_product.Get(0,_e))
      {
         _product=100.0*((m_shortdmk*_e.Get(0))+(m_shortwpr*_e.Get(1)))/(m_shortdmk+m_shortwpr);
      }
         
      return(_product);
   }


一份测试报告基于 EURJPY 货币对 2022 年大部分时间的即时跳价,它为我们提供了以下曲线。

ct_3_curve


内含这些报告的详细信息。

  ct_3_report

显然,这不是一个完美的系统,但它确实提出了一些思路,可以进一步拓展为更全面的系统。 完整的源代码,请参阅附件。

根据维基百科,极限和共限,就像强烈相关的通用属性概念一样,存在于高度抽象当中,为了理解它们,首先研究这些具体例子,这些概念分别用来概括乘积和余积。



乘积

两个域 A 和 B 的乘积表示为 A x B,并定义为有序对 (a, b) 的集合,其中 A ∈ A 且 b ∈ B。象征性地,

A x B = {(a, b) | a ∈ A, b ∈ B}

该乘积是域的笛卡尔乘积的推广,它捕获了一个类别中域的“对”或“元组”的概念。 直观地,乘积 C 表示 A 和 B 的“联合”或“合成”行为。

除了下面检查的通用属性之外,该乘积还满足以下性质:

  • 该乘积是结合的:(A × B) × C 与 A × (B × C) 同构。
  • 乘积是可交换的:A × B 与 B × A 同构。
  • 具有初始域的域的乘积与域本身同构:A × 1 与 A 同构。
  • 域与终端域的乘积与域本身同构:A × 0 与 0 同构。

乘积的概念可以应用于各种数学结构,包括集合、群、环和向量空间,以及更抽象的结构,如拓扑空间和范畴本身。 在每种情况下,该乘积都捕获了两个域或结构的“联合”或“合成”行为的概念,并为整个系统行为提供了一种合理的方式。在金融中运用范畴论的一个示例是风险管理,它提供了比寻常应用更好的替代方案。

范畴论允许一种更抽象和通用的金融风险建模方式,其可应用于广泛的金融产品和市场。 与为每个金融产品或市场选取特定模型的传统方法相比,这种方式能为理解风险提供更统一和灵活的框架。 此外,在风险管理中运用范畴论可以带来更强大和可扩展的风险管理策略,这些策略更适合现代金融市场的复杂性和相互关联性。

例如,在传统的风险管理中,在进行风险建模时,通常针对每个金融产品或市场选取特定数学模型。 例如,布莱克-斯科尔斯(Black-Scholes)模型通常针对期权风险进行建模,而 VaR(风险价值)模型通常针对资产组合风险进行建模。 这些模型可能有效,但它们受限于其界限,很难推广到新的金融产品或市场。

对比之下,范畴论提供了一种更抽象和更通用的风险建模方法。 例如,市场中的金融产品可以表示为一个范畴中的域,而风险可以表示为自这些域至一个只有两个要素(多头和空头持仓)的持仓域的态射。 这将为理解风险提供一个更加统一和灵活的框架,可以应用于广泛的金融产品和市场。 序言中的信号文件也运用了类似的方法。

例如,假设我们有两种金融产品,A 和 B,我们想针对从 A 转移到 B 的风险进行建模。我们将 A 和 B 表示为域,从 A 移动到 B 的风险表示为它们各自的态射。 这些态射将捕捉与从 A 转移到 B 的相关风险,同时考虑波动性、流动性、和市场条件等因素。 要不然,如序言所示,我们可以有一个金融产品,并想知道在特定时间我们需要何种类型的持仓。 我们将在该金融产品上获取财务指标,并找到它们的加权乘积。 其价值将决定我们的决定。 此处仅部分显示这些指标值组合的清单。首先,我们需要一个类来处理和存储乘积域的信息。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CComposition
   {
      protected:
      
      int                           projectors;
      string                        projector[];
      
      bool                          Projectors(int Value)
                                    { 
                                       if(Value>=0 && Value<INT_MAX)
                                       {
                                          projectors=Value;
                                          ArrayResize(projector,projectors);
                                          return(true);
                                       }
                                       
                                       return(false); 
                                    };
      
      int                           Projectors(){ return(projectors); };
                                    
      public:
                                    
      string                        Get(int ProjectorIndex) { string _projector=""; if(ProjectorIndex>=0 && ProjectorIndex<Projectors()) { _projector=projector[ProjectorIndex]; } return(_projector); }
      bool                          Set(int ValueIndex,string Value) { if(ValueIndex>=0 && ValueIndex<Projectors()) { projector[ValueIndex]=Value; return(true); } return(false); }
      
      CDomain<string>               property;
      CDomain<string>               cone;
      
                                    CComposition(void){ projectors=0;ArrayFree(projector); };
                                    ~CComposition(void){};
   };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CProduct                      :public CComposition  
   {
      protected:
      
      CDomain<string>               surjector[];
      
      public:
      
      bool                          Surjectors(int Value)
                                    { 
                                       if(Value>=0 && Value<INT_MAX)
                                       {
                                          CComposition::Projectors(Value);
                                          ArrayResize(surjector,Value);
                                          return(true);
                                       }
                                       
                                       return(false); 
                                    };
      
      int                           Surjectors(){ return(CComposition::projectors); };
                                    
      bool                          Get(int SurjectorIndex,CDomain<string> &Surjector) { if(SurjectorIndex>=0 && SurjectorIndex<CComposition::Projectors()) { Surjector=surjector[SurjectorIndex]; return(true); } return(false); }
      bool                          Set(int ValueIndex,CDomain<string> &Value) { if(ValueIndex>=0 && ValueIndex<CComposition::Projectors()) { surjector[ValueIndex]=Value; return(true); } return(false); }
      
                                    CProduct(void){ ArrayFree(surjector); };
                                    ~CProduct(void){};
   };

一旦我们定义了这些,我们就可以如下执行乘积

      //////////
      //PRODUCTS
      //////////
      
      CDomain<double> _d_p_a,_d_p_b,_d_p_c;
      _d_p_a.Cardinality(__product_size);_d_p_b.Cardinality(__product_size);_d_p_c.Cardinality(__product_size);
      
      int _rsi_handle=iRSI(_Symbol,_Period,__product_size,__product_price);
      int _cci_handle=iCCI(_Symbol,_Period,__product_size,__product_price);
      int _dmk_handle=iDeMarker(_Symbol,_Period,__product_size);
      int _wpr_handle=iWPR(_Symbol,_Period,__product_size);
      int _stc_handle=iStochastic(_Symbol,_Period,8,4,4,MODE_SMA,STO_LOWHIGH);
      int _trx_handle=iTriX(_Symbol,_Period,__product_size,__product_price);
      
      if
      (
      FillDomain(_d_p_a,0,__product_size,_rsi_handle)
      &&
      FillDomain(_d_p_a,1,__product_size,_cci_handle)
      &&
      FillDomain(_d_p_b,0,__product_size,_dmk_handle)
      &&
      FillDomain(_d_p_b,1,__product_size,_wpr_handle)
      &&
      FillDomain(_d_p_c,0,__product_size,_stc_handle)
      &&
      FillDomain(_d_p_c,1,__product_size,_trx_handle)
      )
      {
         printf(__FUNCSIG__+" domain A: "+PrintDomain(_d_p_a,2));
         printf(__FUNCSIG__+" domain B: "+PrintDomain(_d_p_b,2));
         printf(__FUNCSIG__+" domain C: "+PrintDomain(_d_p_c,5));
         
         CProduct _product;
         
         GetProduct(_d_p_a,_d_p_b,_product,2);
         printf(__FUNCSIG__+" A & B product: "+PrintDomain(_product.cone,2));
         
         GetProduct(_product.cone,_d_p_c,_product,5);
         printf(__FUNCSIG__+" A & B & C product: "+PrintDomain(_product.cone,5));
      }


这些指标值虽然不像序言中信号文件里面的那样标准化,但无论如何都可以被视为或用作交易决策的风险指标。 运行脚本会产生这些日志。

2023.02.17 17:31:33.199 ct_3_1 (USDCHF.ln,W1)   void OnStart() domain A: {(-66.67),(66.67)}
2023.02.17 17:31:33.199 ct_3_1 (USDCHF.ln,W1)   
2023.02.17 17:31:33.199 ct_3_1 (USDCHF.ln,W1)   void OnStart() domain B: {(-61.99),(-68.45)}
2023.02.17 17:31:33.199 ct_3_1 (USDCHF.ln,W1)   
2023.02.17 17:31:33.199 ct_3_1 (USDCHF.ln,W1)   void OnStart() domain C: {(-0.00996),(-0.00628)}
2023.02.17 17:31:33.199 ct_3_1 (USDCHF.ln,W1)   
2023.02.17 17:31:33.199 ct_3_1 (USDCHF.ln,W1)   void OnStart() A & B product: {((66.67),(-68.45)),((66.67),(-61.99)),((-66.67),(-68.45)),((-66.67),(-61.99))}
2023.02.17 17:31:33.199 ct_3_1 (USDCHF.ln,W1)   
2023.02.17 17:31:33.200 ct_3_1 (USDCHF.ln,W1)   void OnStart() A & B & C product: {(((-66.67),(-61.99)),(-0.00628)),(((-66.67),(-61.99)),(-0.00996)),(((-66.67),(-68.45)),(-0.00628)),(((-66.67),(-68.45)),(-0.00996)),(((66.67),(-61.99)),(-0.00628)),(((66.67),(-61.99)),(-0.00996)),(((66.67),(-68.45)),(-0.00628)),(((66.67),(-68.45)),(-0.00996))}

考虑多个因素对于宏观更敏感,超过风险值,举例,后者只考虑过去表现的风险置信区间。将多个因素嵌入态射的概念可以更进一步,以便辨别和量化伴随复杂金融产品衍生物相关的风险,而这些可能难以运用传统方式建模。 再有,这要归功于在域中分离数据,并通过完整性保持态射进行链接的系统方法。 此外,我们可以制定更适合现代金融市场复杂性和相互关联的风险管理策略,例如考虑不同金融产品和市场之间相关性的策略。

例如,范畴论中的乘积概念在金融中也可用于跨多种资产的风险管理。 范畴中两个域的乘积提供了一种将它们组合成单个域的方法,可用于针对与两个域(资产)相关的联合风险进行建模。例如,假设我们有两种金融产品,A 和 B,我们希望针对投资组合中持有这两种工具相关的联合风险进行建模。 我们可以将 A 和 B 表示为一个范畴中的域,将它们的联合风险表示为两个域的乘积。 该乘积域将捕获与 A 和 B 相关的联合风险,考虑它们各自的风险,以及它们之间的任何相互作用。 这种方式保留了每种金融产品的输入风险,故此在训练模型时,可以考虑单独的输入,以便获得更好的准确度和洞察力,好过将两者合一后的平均。 从本质上讲,我们能更好地理解与不同金融产品相关的联合风险,从而能够制定更有效的风险管理策略。 为了描绘这一点,我们可以使用乘积来模拟与复杂金融结构相关的风险,例如由多种基础资产组成的抵押债务债券(CDO)。

范畴论中的乘积倾向于抽象和一般框架,在进行风险建模时,举例来说,可以在金融产品和市场中得到广泛的应用。 这允许更统一和灵活的风险管理方式,且能够帮助我们更好地理解不同金融产品和市场之间的相互作用和依赖关系,而非 VaR/Black-Scholes 那样的特殊性。 假设我们有一个由各种股票组成的标准普尔 500 指数投资组合,我们希望对该投资组合的风险进行建模。 我们可以通过 VaR 来做到这一点,它估算具有给定概率水平的投资组合的最大潜在损失。

然而,VaR 有一些局限性,例如其正态分布假设在实践中可能不成立,无法捕捉投资组合中股票之间的复杂风险关系,以及无法评估 VaR 违规发生时的损失程度。 另一方面,范畴论提供了一种更抽象和灵活的风险建模方法,它关注投资组合各个要素之间的结构和关系,而不仅仅是它们各自的属性。 特别是,范畴论允许我们将标准普尔 500 指数投资组合表示为一个范畴,其中股票是该范畴的域,它们之间的风险关系由该范畴的态射或范畴箭头捕获。

例如,我们可以将两只股票之间的态射定义为代表它们之间的风险关系,例如它们的价格向同一方向或相反方向移动的程度(例如相关性)。 通过定义这些态射,我们可以对投资组合中股票之间的风险关系建立更详细和细致的全景图,这可能比仅使用 VaR 更准确。甚至,通过将股票之间的风险关系抽象为态射,我们可以应用范畴论中的强大工具和概念,如组合、对偶性和通用属性,来分析和管理投资组合中的风险。 例如,我们可以使用态射组合来合并多个股票之间的风险关系,并推导出投资组合的整体风险,或者我们可以使用对偶性(待涵盖)来研究股票之间的逆向风险关系。

这里有一个数值示例,进一步描绘使用范畴论(包括范畴论的乘积)如何提供优于上述传统风险指标的优势。 假设我们有一个由两种金融产品组成的投资组合,A 和 B,每种产品的当前价值为 100 美元,我们希望估算持有这两种工具的相关联合风险。 为简单起见,我们假设 A 和 B 的回报呈正态分布,平均值为 10%,标准差为 20%。 若用 VaR 等传统模型,我们可以估算 A 和 B 的单独风险,以及它们的联合风险。 例如,使用置信水平为 95% 的 VaR,我们估算 A 和 B 的一天 VaR 约为 25.46 美元,联合 VaR 约为 36.03 美元。

VaR = 投资组合价值 x 波动率 x z-得分

VaR = $100 x 20% x 1.645

VaR = $36.03.

 

或者说,我们可以使用范畴论和范畴论的乘积来模拟 A 和 B 的的联合风险。按这种方式,我们将 A 和 B 表示为一个范畴中的域,并将它们的联合风险表示为两个域的乘积。 使用两个正态分布随机变量乘积的标准公式,我们可以计算出 A 和 B 的联合分布的平均值为 10%,标准差约为 0.28。

VaR = $100 x √ ((10%)2 x (28%)2 + (10%)2 x (28%)2) x 1.645

VaR = $29.15.

 

尊照这种方式,我们可以使用 VaR 的标准公式估算 A 和 B 的一天联合风险 VaR。 在 95% 的置信水平下,A 和 B联合风险的单日 VaR 约为 29.15 美元。 在此示例中,使用范畴论和乘积模型,A 和 B的联合风险乘积与上述传统模型的联合 VaR 估算不同。 然而,范畴论可以提供一种更通用和灵活的风险管理方法,可以应用于更广泛的金融产品和市场,并且可以更有效地捕捉与多种金融产品相关的联合风险。 此特性,域乘积的典型输出将是一个矩阵,该矩阵枚举每次迭代的风险结果。 这种连续的数据可作为估算平均值和标准差的基础,具体取决于投资者的目标和指标。

乘积是极限的一种类型,故此为交易者提供一些关于在系统开发中如何把极限作为一个整体的一般说明可能会有所帮助。 在金融关联方面,使用极限可以帮助我们更有效地近似复杂的金融结构,这有助于制定更准确的风险管理策略。 例如,我们可以使用极限的概念来估算包含大量不同金融产品的投资组合的价值。 将投资组合表示为简单域的极限,我们可以更准确、更有效地估算其价值。

例如,假设我们有一个包含 1000 种金融产品的投资组合,每种产品的当前价值为 100 美元。 我们希望估算整个投资组合的价值,以及与持有所有产品相关的共同风险。 由于投资组合的高维性质,使用 VaR 或 Black-Scholes 等传统方法根本难以计算。 然而,使用范畴论中的极限概念,我们可以将投资组合表示为更简单域的极限,例如前 n 个金融产品的总和,其中 n 的范围从 1 到 的1000。 然后,我们可以通过在 n 接近 1000 时取总和的极限,来估算投资组合的价值。 按照使用这种方式,我们可以更准确、更有效地估算投资组合的价值。

甚而,在范畴论中使用极限可令我们推断金融产品和市场在接近某些极限时的行为。 例如,我们可以使用极限概念来分析金融市场在极端波动或压力期间的行为,并制定更适合这些条件的风险管理策略。 总而言之,在范畴论中使用极限可以为范畴理论和乘积在金融中的使用带来额外的好处,因为它允许我们更有效地近似复杂的金融结构,并推理金融产品和市场在接近某些极限时的行为。


乘积通用属性

通用属性是一种表征范畴中的域方式,基于范畴中的域与其它域得交互。 此属性可用于更抽象地定义域和操作,从而产生更强大、更灵活的模型。在金融的关联背景下,通用属性的可以让我们更抽象地定义金融产品和市场,这可以更容易地推理它们,并开发更通用的模型。 例如,我们可以将交易所的交易衍生品定义为满足某些通用属性的范畴中的域,例如识别监管机构是谁,此外还要说明它是期权、亦或期货合约。 这种识别有助于估算合规成本和交易对手风险。 下面附加的部分清单是演示这一点的脚本。

      //////////////////////////////
      //PRODUCT UNIVERSAL-PROPERTY
      //////////////////////////////
      
      CDomain<string> _d_security,_d_exchanges,_d_optioncycle,_d_strikewidth,_d_property;
      //
      CElement<string> _e;_e.Cardinality(1);
      //
      _d_security.Cardinality(2);
      _e.Set(0,"EURUSD");_d_security.Set(0,_e,true);
      _e.Set(0,"USDJPY");_d_security.Set(1,_e,true);
      //
      _d_exchanges.Cardinality(7);
      _e.Set(0,"Chicago Board Options Exchange (CBOE)");_d_exchanges.Set(0,_e,true);
      _e.Set(0,"Shanghai Stock Exchange (SSE)");_d_exchanges.Set(1,_e,true);
      _e.Set(0,"Shenzhen Stock Exchange (SZSE)");_d_exchanges.Set(2,_e,true);
      _e.Set(0,"Tokyo Stock Exchange (TSE)");_d_exchanges.Set(3,_e,true);
      _e.Set(0,"Osaka Exchange (OSE)");_d_exchanges.Set(4,_e,true);
      _e.Set(0,"Eurex Exchange");_d_exchanges.Set(5,_e,true);
      _e.Set(0,"London Stock Exchange (LSE)");_d_exchanges.Set(6,_e,true);
      //
      _d_optioncycle.Cardinality(3);
      _e.Set(0,"JAJO - January, April, July, and October");_d_optioncycle.Set(0,_e,true);
      _e.Set(0,"FMAN - February, May, August, and November");_d_optioncycle.Set(1,_e,true);
      _e.Set(0,"MJSD - March, June, September, and December");_d_optioncycle.Set(2,_e,true);
      //
      _d_strikewidth.Cardinality(2);
      _e.Set(0,"1000 points");_d_strikewidth.Set(0,_e,true);
      _e.Set(0,"1250 points");_d_strikewidth.Set(1,_e,true);
      //
      printf(__FUNCSIG__+" securities domain: "+PrintDomain(_d_security,0));
      printf(__FUNCSIG__+" exchanges domain: "+PrintDomain(_d_exchanges,0));
      printf(__FUNCSIG__+" option cycle domain: "+PrintDomain(_d_optioncycle,0));
      printf(__FUNCSIG__+" strike width domain: "+PrintDomain(_d_strikewidth,0));
      
      CProduct _product_1;
      
      GetProduct(_d_security,_d_exchanges,_product_1,0);
      printf(__FUNCSIG__+" securities & exchanges product: "+PrintDomain(_product_1.cone,0));
      
      CProduct _product_2;
      
      GetProduct(_d_optioncycle,_d_strikewidth,_product_2,0);
      printf(__FUNCSIG__+" securities & exchanges & optioncycle product: "+PrintDomain(_product_2.cone,0));
      
      CProduct _product_all;
      
      GetProduct(_product_1.cone,_product_2.cone,_product_all,0);
      printf(__FUNCSIG__+" securities & exchanges & optioncycle & strikewidth product: "+PrintDomain(_product_all.cone,0));
      
      _d_property.Cardinality(5);
      _e.Set(0,"Commodity Futures Trading Commission (CFTC)");_d_property.Set(0,_e,true);
      _e.Set(0,"China Securities Regulatory Commission (CSRC)");_d_property.Set(1,_e,true);
      _e.Set(0,"Financial Services Agency (FSA)");_d_property.Set(2,_e,true);
      _e.Set(0,"Federal Financial Supervisory Authority (BaFin)");_d_property.Set(3,_e,true);
      _e.Set(0,"Financial Conduct Authority (FCA)");_d_property.Set(4,_e,true);
      
      //
      _product_all.property=_d_property;
      //
      _product_all.universality.domain=_product_all.property;
      _product_all.universality.codomain=_product_all.cone;
      //
      CMorphism<string,string> _mm;
      _mm.domain=_product_all.property;
      _mm.codomain=_product_all.cone;
      //
      
      for(int c=0;c<_product_all.property.Cardinality();c++)
      {
         CElement<string> _e_property;_e_property.Cardinality(1);
         if(_product_all.property.Get(c,_e_property) && _e_property.Get(0)!="")
         {
            for(int cc=0;cc<_product_all.cone.Cardinality();cc++)
            {
               CElement<string> _e_cone;_e_cone.Cardinality(1);
               if(_product_all.cone.Get(cc,_e_cone) && _e_cone.Get(0)!="")
               {
                  if(_e_property.Get(0)=="Commodity Futures Trading Commission (CFTC)")
                  {
                     if(StringFind(_e_cone.Get(0),"Chicago Board Options Exchange (CBOE)")>=0)
                     {
                        if(_product_all.universality.Morphisms(_product_all.universality.Morphisms()+1))
                        {
                           if(_mm.Morph(_product_all.property,_product_all.cone,_e_property,_e_cone))
                           {
                              if(!_product_all.universality.Set(_product_all.universality.Morphisms()-1,_mm))
                              {
                              }
                           }
                        }
                     }
                  }
                  else if(_e_property.Get(0)=="China Securities Regulatory Commission (CSRC)")
                  {
                     if(StringFind(_e_cone.Get(0),"Shanghai Stock Exchange (SSE)")>=0||StringFind(_e_cone.Get(0),"Shenzhen Stock Exchange (SZSE)")>=0)
                     {
                        if(_product_all.universality.Morphisms(_product_all.universality.Morphisms()+1))
                        {
                           if(_mm.Morph(_product_all.property,_product_all.cone,_e_property,_e_cone))
                           {
                              if(!_product_all.universality.Set(_product_all.universality.Morphisms()-1,_mm))
                              {
                              }
                           }
                        }
                     }
                  }
                  else if(_e_property.Get(0)=="Financial Services Agency (FSA)")
                  {
                     if(StringFind(_e_cone.Get(0),"Tokyo Stock Exchange (TSE)")>=0||StringFind(_e_cone.Get(0),"Osaka Exchange (OSE)")>=0)
                     {
                        if(_product_all.universality.Morphisms(_product_all.universality.Morphisms()+1))
                        {
                           if(_mm.Morph(_product_all.property,_product_all.cone,_e_property,_e_cone))
                           {
                              if(!_product_all.universality.Set(_product_all.universality.Morphisms()-1,_mm))
                              {
                              }
                           }
                        }
                     }
                  }
                  else if(_e_property.Get(0)=="Federal Financial Supervisory Authority (BaFin)")
                  {
                     if(StringFind(_e_cone.Get(0),"Eurex Exchange")>=0)
                     {
                        if(_product_all.universality.Morphisms(_product_all.universality.Morphisms()+1))
                        {
                           if(_mm.Morph(_product_all.property,_product_all.cone,_e_property,_e_cone))
                           {
                              if(!_product_all.universality.Set(_product_all.universality.Morphisms()-1,_mm))
                              {
                              }
                           }
                        }
                     }
                  }
                  else if(_e_property.Get(0)=="Financial Conduct Authority (FCA)")
                  {
                     if(StringFind(_e_cone.Get(0),"London Stock Exchange (LSE)")>=0)
                     {
                        if(_product_all.universality.Morphisms(_product_all.universality.Morphisms()+1))
                        {
                           if(_mm.Morph(_product_all.property,_product_all.cone,_e_property,_e_cone))
                           {
                              if(!_product_all.universality.Set(_product_all.universality.Morphisms()-1,_mm))
                              {
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
      }

在运行此脚本时,我们应该生成下面的日志,这些日志打印锥形域和属性域之间的同态。 这种同态标志着普遍性。

/*
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   void OnStart() universal property: 
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   {(Commodity Futures Trading Commission (CFTC)),(China Securities Regulatory Commission (CSRC)),(Financial Services Agency (FSA)),(Federal Financial Supervisory Authority (BaFin)),(Financial Conduct Authority (FCA))}
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   |
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((EURUSD),(Chicago Board Options Exchange (CBOE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((EURUSD),(Chicago Board Options Exchange (CBOE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((EURUSD),(Chicago Board Options Exchange (CBOE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((EURUSD),(Chicago Board Options Exchange (CBOE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((EURUSD),(Chicago Board Options Exchange (CBOE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((EURUSD),(Chicago Board Options Exchange (CBOE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((USDJPY),(Chicago Board Options Exchange (CBOE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((USDJPY),(Chicago Board Options Exchange (CBOE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((USDJPY),(Chicago Board Options Exchange (CBOE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((USDJPY),(Chicago Board Options Exchange (CBOE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((USDJPY),(Chicago Board Options Exchange (CBOE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (Commodity Futures Trading Commission (CFTC))|----->(((USDJPY),(Chicago Board Options Exchange (CBOE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shanghai Stock Exchange (SSE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shanghai Stock Exchange (SSE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shanghai Stock Exchange (SSE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shanghai Stock Exchange (SSE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shanghai Stock Exchange (SSE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shanghai Stock Exchange (SSE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.077 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shenzhen Stock Exchange (SZSE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shenzhen Stock Exchange (SZSE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shenzhen Stock Exchange (SZSE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shenzhen Stock Exchange (SZSE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shenzhen Stock Exchange (SZSE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((EURUSD),(Shenzhen Stock Exchange (SZSE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shanghai Stock Exchange (SSE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shanghai Stock Exchange (SSE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shanghai Stock Exchange (SSE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shanghai Stock Exchange (SSE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shanghai Stock Exchange (SSE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shanghai Stock Exchange (SSE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shenzhen Stock Exchange (SZSE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shenzhen Stock Exchange (SZSE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shenzhen Stock Exchange (SZSE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shenzhen Stock Exchange (SZSE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shenzhen Stock Exchange (SZSE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (China Securities Regulatory Commission (CSRC))|----->(((USDJPY),(Shenzhen Stock Exchange (SZSE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Tokyo Stock Exchange (TSE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Tokyo Stock Exchange (TSE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Tokyo Stock Exchange (TSE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Tokyo Stock Exchange (TSE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Tokyo Stock Exchange (TSE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Tokyo Stock Exchange (TSE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Osaka Exchange (OSE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Osaka Exchange (OSE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Osaka Exchange (OSE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Osaka Exchange (OSE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Osaka Exchange (OSE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((EURUSD),(Osaka Exchange (OSE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Tokyo Stock Exchange (TSE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Tokyo Stock Exchange (TSE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Tokyo Stock Exchange (TSE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Tokyo Stock Exchange (TSE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Tokyo Stock Exchange (TSE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Tokyo Stock Exchange (TSE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Osaka Exchange (OSE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Osaka Exchange (OSE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Osaka Exchange (OSE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Osaka Exchange (OSE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Osaka Exchange (OSE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Financial Services Agency (FSA))|----->(((USDJPY),(Osaka Exchange (OSE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((EURUSD),(Eurex Exchange)),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((EURUSD),(Eurex Exchange)),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((EURUSD),(Eurex Exchange)),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((EURUSD),(Eurex Exchange)),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((EURUSD),(Eurex Exchange)),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((EURUSD),(Eurex Exchange)),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((USDJPY),(Eurex Exchange)),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((USDJPY),(Eurex Exchange)),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.078 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((USDJPY),(Eurex Exchange)),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((USDJPY),(Eurex Exchange)),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((USDJPY),(Eurex Exchange)),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Federal Financial Supervisory Authority (BaFin))|----->(((USDJPY),(Eurex Exchange)),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((EURUSD),(London Stock Exchange (LSE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((EURUSD),(London Stock Exchange (LSE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((EURUSD),(London Stock Exchange (LSE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((EURUSD),(London Stock Exchange (LSE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((EURUSD),(London Stock Exchange (LSE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((EURUSD),(London Stock Exchange (LSE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((USDJPY),(London Stock Exchange (LSE))),((JAJO - January, April, July, and October),(1000 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((USDJPY),(London Stock Exchange (LSE))),((JAJO - January, April, July, and October),(1250 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((USDJPY),(London Stock Exchange (LSE))),((FMAN - February, May, August, and November),(1000 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((USDJPY),(London Stock Exchange (LSE))),((FMAN - February, May, August, and November),(1250 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((USDJPY),(London Stock Exchange (LSE))),((MJSD - March, June, September, and December),(1000 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   (Financial Conduct Authority (FCA))|----->(((USDJPY),(London Stock Exchange (LSE))),((MJSD - March, June, September, and December),(1250 points)))
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   |
2023.02.21 09:57:41.079 ct_3_1 (USDCHF.ln,H1)   {(((EURUSD),(Chicago Board Options Exchange (CBOE))),((JAJO - January, April, July, and October),(1000 points))),(((EURUSD),(Chicago Board Options Exchange (CBOE))),((JAJO - January, April, July, and October),(1250 points))),(((EURUSD),(Chicago Board Options Exchange (CBOE))),((FMAN - February, May, August, and November),(1000 points))),(((EURUSD),(Chicago Board Options Exchange (CBOE))),((FMAN - February, May, August, and November),(1250 points))),(((EURUSD),(Chicago Board Options Exchange (CBOE))),((MJSD
*/

使用通用属性还可以更轻松地推理复杂的金融结构,例如抵押债务债券(CDO)。 这些结构典型情况下由多种标的资产组成,每种资产都有自己的风险状况。 通过将基础资产定义为范畴中的域,并使用通用属性来定义 CDO 的结构,我们可以开发更抽象和通用的模型,更有效地捕获与基础资产相关的联合风险。此外,通用属性的概念可通过判定其所需的通用属性来开发新的金融产品或产品,而非试图从头开始创建特定的金融产品。 这可以带来更具创新性和强大的金融产品,更适合投资者和市场的需求。

      ////////////////////////////
      //PRODUCT UNIVERSAL-PROPERTY
      ////////////////////////////
      
      //EX no.2
      
      CDomain<string> _d_hedge,_d_cover,_d_postion,_d_p2_property;
      //
      CElement<string> _ep2;_ep2.Cardinality(1);
      //
      _d_hedge.Cardinality(2);
      _ep2.Set(0,"EURUSD");_d_hedge.Set(0,_ep2,true);
      _ep2.Set(0,"GBPUSD");_d_hedge.Set(1,_ep2,true);
      //
      _d_cover.Cardinality(2);
      _ep2.Set(0,"USDCHF");_d_cover.Set(0,_ep2,true);
      _ep2.Set(0,"USDJPY");_d_cover.Set(1,_ep2,true);
      //
      _d_postion.Cardinality(4);
      _ep2.Set(0,"EURCHF");_d_postion.Set(0,_ep2,true);
      _ep2.Set(0,"EURJPY");_d_postion.Set(1,_ep2,true);
      _ep2.Set(0,"GBPCHF");_d_postion.Set(2,_ep2,true);
      _ep2.Set(0,"GBPJPY");_d_postion.Set(3,_ep2,true);
      //
      printf(__FUNCSIG__+" hedge domain: "+PrintDomain(_d_hedge,0));
      printf(__FUNCSIG__+" cover domain: "+PrintDomain(_d_cover,0));
      printf(__FUNCSIG__+" postion domain: "+PrintDomain(_d_postion,0));
      
      CProduct _product_hc;
      
      GetProduct(_d_hedge,_d_cover,_product_hc,0);
      printf(__FUNCSIG__+" hedge & cover product: "+PrintDomain(_product_hc.cone,0));
      
      CProduct _product_hcp;
      
      GetProduct(_product_hc.cone,_d_postion,_product_hcp,0);
      printf(__FUNCSIG__+" hedge & cover & postion product: "+PrintDomain(_product_hcp.cone,0));
      //
      
      CDomain<double> _d_p2_eu,_d_p2_gu,_d_p2_uc,_d_p2_uj,_d_p2_ec,_d_p2_ej,_d_p2_gc,_d_p2_gj;
      _d_p2_eu.Cardinality(1);_d_p2_gu.Cardinality(1);_d_p2_uc.Cardinality(1);_d_p2_uj.Cardinality(1);
      _d_p2_ec.Cardinality(1);_d_p2_ej.Cardinality(1);_d_p2_gc.Cardinality(1);_d_p2_gj.Cardinality(1);
      
      int _eu_handle=iATR("EURUSD",_Period,__product_size);
      int _gu_handle=iATR("GBPUSD",_Period,__product_size);
      int _uc_handle=iATR("USDCHF",_Period,__product_size);
      int _uj_handle=iATR("USDJPY",_Period,__product_size);
      int _ec_handle=iATR("EURCHF",_Period,__product_size);
      int _ej_handle=iATR("EURJPY",_Period,__product_size);
      int _gc_handle=iATR("GBPCHF",_Period,__product_size);
      int _gj_handle=iATR("GBPJPY",_Period,__product_size);
      
      if
      (
      FillDomain(_d_p2_eu,0,1,_eu_handle)
      &&
      FillDomain(_d_p2_gu,0,1,_gu_handle)
      &&
      FillDomain(_d_p2_uc,0,1,_uc_handle)
      &&
      FillDomain(_d_p2_uj,0,1,_uj_handle)
      &&
      FillDomain(_d_p2_ec,0,1,_ec_handle)
      &&
      FillDomain(_d_p2_ej,0,1,_ej_handle)
      &&
      FillDomain(_d_p2_gc,0,1,_gc_handle)
      &&
      FillDomain(_d_p2_gj,0,1,_gj_handle)
      )
      {
         CElement<double> _e_eu,_e_gu,_e_uc,_e_uj,_e_ec,_e_ej,_e_gc,_e_gj;
         //
         if
         (
         _d_p2_eu.Get(0,_e_eu) && _d_p2_gu.Get(0,_e_gu) && 
         _d_p2_uc.Get(0,_e_uc) && _d_p2_uj.Get(0,_e_uj) && 
         _d_p2_ec.Get(0,_e_ec) && _d_p2_ej.Get(0,_e_ej) && 
         _d_p2_gc.Get(0,_e_gc) && _d_p2_gj.Get(0,_e_gj)
         )
         {
            _d_p2_property.Cardinality(4);
            _ep2.Set(0,DoubleToString(_e_eu.Get(0),3)+","+DoubleToString(_e_uc.Get(0),3)+","+DoubleToString(_e_ec.Get(0),3));_d_p2_property.Set(0,_ep2,true);
            _ep2.Set(0,DoubleToString(_e_gu.Get(0),3)+","+DoubleToString(_e_uc.Get(0),3)+","+DoubleToString(_e_gc.Get(0),3));_d_p2_property.Set(1,_ep2,true);
            _ep2.Set(0,DoubleToString(_e_eu.Get(0),3)+","+DoubleToString(_e_uj.Get(0),3)+","+DoubleToString(_e_ej.Get(0),3));_d_p2_property.Set(2,_ep2,true);
            _ep2.Set(0,DoubleToString(_e_gu.Get(0),3)+","+DoubleToString(_e_uj.Get(0),3)+","+DoubleToString(_e_gj.Get(0),3));_d_p2_property.Set(3,_ep2,true);
            
            //
            _product_hcp.property=_d_p2_property;
            //
            _product_hcp.universality.domain=_product_hcp.property;
            _product_hcp.universality.codomain=_product_hcp.cone;
            //
            CMorphism<string,string> _m_p2;
            _m_p2.domain=_product_hcp.property;
            _m_p2.codomain=_product_hcp.cone;
            //
            
            for(int c=0;c<_product_hcp.property.Cardinality();c++)
            {
               CElement<string> _e_property;_e_property.Cardinality(1);
               if(_product_hcp.property.Get(c,_e_property) && _e_property.Get(0)!="")
               {
                  for(int cc=0;cc<_product_hcp.cone.Cardinality();cc++)
                  {
                     CElement<string> _e_cone;_e_cone.Cardinality(1);
                     if(_product_hcp.cone.Get(cc,_e_cone) && _e_cone.Get(0)!="")
                     {
                        if(c==0)
                        {
                           if(StringFind(_e_cone.Get(0),"EURUSD")>=0&&StringFind(_e_cone.Get(0),"USDCHF")>=0&&StringFind(_e_cone.Get(0),"EURCHF")>=0)
                           {
                              if(_product_hcp.universality.Morphisms(_product_hcp.universality.Morphisms()+1))
                              {
                                 if(_m_p2.Morph(_product_hcp.property,_product_hcp.cone,_e_property,_e_cone))
                                 {
                                    if(!_product_hcp.universality.Set(_product_hcp.universality.Morphisms()-1,_m_p2))
                                    {
                                    }
                                 }
                              }
                           }
                        }
                        else if(c==1)
                        {
                           if(StringFind(_e_cone.Get(0),"GBPUSD")>=0&&StringFind(_e_cone.Get(0),"USDCHF")>=0&&StringFind(_e_cone.Get(0),"GBPCHF")>=0)
                           {
                              if(_product_hcp.universality.Morphisms(_product_hcp.universality.Morphisms()+1))
                              {
                                 if(_m_p2.Morph(_product_hcp.property,_product_hcp.cone,_e_property,_e_cone))
                                 {
                                    if(!_product_hcp.universality.Set(_product_hcp.universality.Morphisms()-1,_m_p2))
                                    {
                                    }
                                 }
                              }
                           }
                        }
                        else if(c==2)
                        {
                           if(StringFind(_e_cone.Get(0),"EURUSD")>=0&&StringFind(_e_cone.Get(0),"USDJPY")>=0&&StringFind(_e_cone.Get(0),"EURJPY")>=0)
                           {
                              if(_product_hcp.universality.Morphisms(_product_hcp.universality.Morphisms()+1))
                              {
                                 if(_m_p2.Morph(_product_hcp.property,_product_hcp.cone,_e_property,_e_cone))
                                 {
                                    if(!_product_hcp.universality.Set(_product_hcp.universality.Morphisms()-1,_m_p2))
                                    {
                                    }
                                 }
                              }
                           }
                        }
                        else if(c==3)
                        {
                           if(StringFind(_e_cone.Get(0),"GBPUSD")>=0&&StringFind(_e_cone.Get(0),"USDJPY")>=0&&StringFind(_e_cone.Get(0),"GBPJPY")>=0)
                           {
                              if(_product_hcp.universality.Morphisms(_product_hcp.universality.Morphisms()+1))
                              {
                                 if(_m_p2.Morph(_product_hcp.property,_product_hcp.cone,_e_property,_e_cone))
                                 {
                                    if(!_product_hcp.universality.Set(_product_hcp.universality.Morphisms()-1,_m_p2))
                                    {
                                    }
                                 }
                              }
                           }
                        }
                     }
                  }
               }
            }
            
            printf(__FUNCSIG__+" universal property hcp: "+PrintHomomorphism(_product_hcp.universality,0));
         }
      }
      


再次运行此脚本时,我们得到并打印通用属性的同态,本质上将风险水平(在本例中为 ATR 值)映射到锥形域中的投资组合,该投资组合是由各种证券产品形成的。

2023.02.21 20:21:53.614 ct_3_1 (USDCHF.ln,H1)   void OnStart() universal property hcp: 
2023.02.21 20:21:53.614 ct_3_1 (USDCHF.ln,H1)   
2023.02.21 20:21:53.614 ct_3_1 (USDCHF.ln,H1)   {(0.002,0.001,0.001),(0.002,0.001,0.002),(0.002,0.145,0.189),(0.002,0.145,0.258)}
2023.02.21 20:21:53.614 ct_3_1 (USDCHF.ln,H1)   |
2023.02.21 20:21:53.614 ct_3_1 (USDCHF.ln,H1)   (0.002,0.001,0.001)|----->(((EURUSD),(USDCHF)),(EURCHF))
2023.02.21 20:21:53.614 ct_3_1 (USDCHF.ln,H1)   (0.002,0.001,0.002)|----->(((GBPUSD),(USDCHF)),(GBPCHF))
2023.02.21 20:21:53.614 ct_3_1 (USDCHF.ln,H1)   (0.002,0.145,0.189)|----->(((EURUSD),(USDJPY)),(EURJPY))
2023.02.21 20:21:53.614 ct_3_1 (USDCHF.ln,H1)   (0.002,0.145,0.258)|----->(((GBPUSD),(USDJPY)),(GBPJPY))
2023.02.21 20:21:53.614 ct_3_1 (USDCHF.ln,H1)   |
2023.02.21 20:21:53.614 ct_3_1 (USDCHF.ln,H1)   {(((EURUSD),(USDCHF)),(GBPJPY)),(((EURUSD),(USDCHF)),(GBPCHF)),(((EURUSD),(USDCHF)),(EURJPY)),(((EURUSD),(USDCHF)),(EURCHF)),(((EURUSD),(USDJPY)),(GBPJPY)),(((EURUSD),(USDJPY)),(GBPCHF)),(((EURUSD),(USDJPY)),(EURJPY)),(((EURUSD),(USDJPY)),(EURCHF)),(((GBPUSD),(USDCHF)),(GBPJPY)),(((GBPUSD),(USDCHF)),(GBPCHF)),(((GBPUSD),(USDCHF)),(EURJPY)),(((GBPUSD),(USDCHF)),(EURCHF)),(((GBPUSD),(USDJPY)),(GBPJPY)),(((GBPUSD),(USDJPY)),(GBPCHF)),(((GBPUSD),(USDJPY)),(EURJPY)),(((GBPUSD),(USDJPY)),(EURCHF))}


余积

在代数中,两个群(G 和 H)的余积是一个包含 G 和 H 的所有元素的域,其域运算的定义方式是,生成的结构是同时包含 G 和 H 的“最小”域。这与两个域的乘积不同,两个域是一个包含所有元素对 (g,h)的域,其中 g 在 G 中,h 在 H 中,域操作按分量定义。 余积是一个余限,因为它是 G 和 H 的“最小上界”,从某种意义上说,任何其它同时包含 G 和 H 的域也必须包含余积。

两个域 A 和 B 的余积也是第三个域 C,以及分别从 A 和 B 到 C 的两个注入态射,使得对于分别具有来自 A 和 B 的两个态射的任何其它域 D,存在从 C 到 D 的唯一态射,令某些示意图能来回互通。 余积也被称为 A 和 B 的“不相交并集”或“总和”,因为它捕获了在两个不同域之间进行选择的想法。 直观上,余积 C 表示 A 和 B 的“替代”或“发散”行为。

余积通常满足以下特性:

  • 它们是结合的:(A + B)+ C 与 A +(B + C)同构。
  • 它们是可交换的:A + B 与 B + A 同构。
  • 具有初始域的域的余积与域本身同构:A + 0 与 A 同构。
  • 域与终端域的余积与域本身同构:A + 1 同构于 1。

余积的概念也可以应用于各种数学结构,包括集合、群、环和向量空间,以及更抽象的结构,如拓扑空间和范畴本身。 在每种情况下,余积都捕获两个域或结构之间的“选择”或“替代方案”的想法,并提供了一种推理整个系统行为的途径。

从交易者的角度来看,范畴论中的余积可用于对投资组合进行建模和分析,并且可以为投资组合估值的传统方法提供更好的替代方案。 这是因为它们是将域组合到一个范畴中的一种途径,其中生成的域表示原始域之间的选择。 例如,两个数字的余积是它们的最大值。 此属性可用于为投资组合选择不同资产的行为建模,并以更灵活和更通用的方式分析这些投资组合的估值。

举例说明,假设我们有一个包含两种资产的投资组合:股票和债券。 我们希望分析投资组合的价值,以及它在不同市场条件下的变化。 传统上,这将使用贴现现金流分析或资本资产定价模型(CAPM)等方式完成。 然而,在范畴论中使用余积,我们可以将投资组合建模为股票和债券之间的选择。 由此产生的余积域将代表投资组合在不同市场条件下的价值,并将捕获与持有两种资产相关的共同风险。

为了示意这一点,为简单起见,我们假设股票的当前价值为 50 美元,债券的当前价值为 100 美元。 我们可以将股票和债券的余积定义为它们的最大值,即 100 美元。 这意味着无论市场状况如何,投资组合的价值至少为 100 美元。遵照这种方法,我们可以分析投资组合在不同市场情景下的行为。 举例,如果股票价格上涨到 60 美元,且债券价格保持不变,则投资组合的价值将为 110 美元,大于 60 美元或 100 美元,捕获价格增量,但仍小于总和 160 美元。 与此类似,如果债券价格降至 90 美元,而股票价格保持不变,投资组合的价值仍将为 100 美元,大于 50 美元或 90 美元,但仍低于 140 美元的总和。 总体而言,余积提供了一种保守的波动性较小的估值方法,与市场价格波动挂钩较小。 因此,我们可以为投资组合选择不同资产的行为建模,并以更灵活和更通用的方式分析其行为。 这能带来更准确和有效的长线投资组合估值策略,并可以更好地捕捉与持有多种资产相关的共同风险。

 

余积和通用属性

如上余积所示,通用属性的概念是范畴论中的有力工具,也可用于进一步加强金融中余积的分析。 它提供了一种正式的途径来表征余积在某种同构下是唯一的,这可以为投资组合带来更有效和精确的推理。 例如,考虑一个由三种资产组成的投资组合:股票、债券和房地产投资信托(REIT)。 我们可以使用股票、债券和 REIT 在一类投资资产中的余积来模拟此投资组合。 这三种资产的余积可以被认为是拥有股票、债券或房地产投资信托基金之间的选择。 我们可以用余积的通用属性来理解这种选择对于同构是如何唯一性的。 具体来说,余积的通用属性指出,对于任何其它域 Z 和从三个资产到 Z 的态射,存在从余积到 Z 的唯一态射,如此令某些示意图可来回互换。

使用通用属性,我们可按更精确和有效的方式推理余积的行为。 例如,假设我们要计算与持有股票、债券和房地产投资信托基金相关的联合风险。 我们可以使用余积的通用属性来示意,任何满足通用属性所需示意图的估值也必须满足某些属性,例如风险的叠加性。例如,假设股票的价值为 50 美元,债券的价值为 100 美元,房地产投资信托基金的价值为 150 美元。 使用余积,我们可以将投资组合建模为这三种资产之间的选择,并计算与持有它们相关的联合风险。

具体而言,联合风险可以计算为与每种资产相关的单个风险的最大值。 假设与股票相关的风险为 10%,与债券相关的风险为 5%,与 REIT 相关的风险为 8%。 利用余积,我们可以将联合风险计算为这三种风险中的最大值,即 10%。 这是假设下的投资组合的相关风险,即每种资产相关的风险是独立的。 利用余积的通用属性,我们可以依据每种资产相关风险之间的相关性,在不同假设下推理投资组合的行为。 例如,我们可以使用通用属性来示意,如果与股票和房地产投资信托基金相关的风险呈正相关,那么与持有它们相关的联合风险将高于其个人风险的最大值。

总结说,将通用属性与余积结合运用可以提供一种更精确和有效的投资组合推理方法。 它令我们能够了解余积的独特属性,直至同构,并推理投资组合在有关相关性和风险的不同假设下的行为。


结束语

结论就是,范畴论为推理复杂系统提供了一套强大的工具,其乘积、余积和通用属性的概念在金融领域具有重要的应用,特别是在算法交易领域。 通过在 MQL5 中实现这些概念,交易者可以更深入地了解金融市场的行为,并制定更有效的交易策略。运用乘积和余积令交易者能够推理金融工具的联合或发散行为,并构建更复杂的投资组合,考虑到资产之间的相互依存关系。

通用属性确保这些结构是唯一的,并且它们满足某些理想的特性。 极限和共限提供了一种更抽象和更广泛的方式来推理域序列的行为,它们允许交易者制定更复杂的风险管理策略。 总体而言,范畴论在金融中的应用有可能彻底改变我们对金融市场的思考方式,并令交易者能够做出更明智的决策。 通过将这些概念集成到 MQL5 之中,交易者可以利用范畴论的全部力量,并基于对金融市场底层结构的更深入理解,制定更有效的交易策略。

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/12085

附加的文件 |
SignalCT3.mqh (10.76 KB)
ct_3_1.mq5 (96.41 KB)
将 ML 模型与策略测试器集成(第 3 部分):CSV(II)文件管理 将 ML 模型与策略测试器集成(第 3 部分):CSV(II)文件管理
这篇资料提供了以 MQL5 创建类,从而高效管理 CSV 文件的完整指南。 我们将看到打开、写入、读取、和转换数据等方法的实现。 我们还将研究如何使用它们来存储和访问信息。 此外,我们将讨论使用该类的限制和最重要的方面。 本文对于那些想要学习如何在 MQL5 中处理 CSV 文件的人来说是一个宝贵的资源。
数据科学与机器学习(第 11 部分):朴素贝叶斯(Bayes),交易中的概率论 数据科学与机器学习(第 11 部分):朴素贝叶斯(Bayes),交易中的概率论
概率交易就像走钢丝一样 — 它需要精确、平衡和对风险的敏锐理解。 在交易世界中,概率就是一切。 这是成功与失败、盈利与亏损的区别。 通过利用概率的力量,交易者可以做出明智的决策,有效地管理风险,并实现他们的财务目标。 故此,无论您是经验丰富的投资者还是交易新手,了解概率都是解锁您的交易潜能的关键。 在本文中,我们将探索令人兴奋的概率交易世界,并向您展示如何将您的交易博弈提升到一个新的水平。
MQL5 — 您也可以成为该语言的大师 MQL5 — 您也可以成为该语言的大师
本文将是一次自我访谈,我将告诉您我是如何迈出 MQL5 语言的第一步的。 我将向您展示如何成为一名出色的 MQL5 程序员。 我将为您解释实现这一壮举的必要基础。 唯一的先决条件是愿意学习。
利用 MQL5 矩阵的反向传播神经网络 利用 MQL5 矩阵的反向传播神经网络
本文讲述在 MQL5 中利用矩阵来应用反向传播算法的理论和实践。 它还提供了现成的类,以及脚本、指标和智能交易系统的示例。