Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 外汇订单简化算法_C#_Algorithm_Sql Server 2008 R2_Currency_Graph Algorithm - Fatal编程技术网

C# 外汇订单简化算法

C# 外汇订单简化算法,c#,algorithm,sql-server-2008-r2,currency,graph-algorithm,C#,Algorithm,Sql Server 2008 R2,Currency,Graph Algorithm,这是一个几乎与语言无关的问题,而不是一个家庭作业。理想情况下,我会使用C#和/或SQL server作为解决方案 假设我有一个函数GetExchangeRate(buyCurrency,sellCurrency)。因此,如果1英镑相当于1.6美元,那么GetExchangeRate('GBP','USD')=1.6和GetExchangeRate('USD','GBP')=0.625 系统中的订单将表示为以下三元组:(buyCurrency、SellCurrency、buyCurrencyAmo

这是一个几乎与语言无关的问题,而不是一个家庭作业。理想情况下,我会使用C#和/或SQL server作为解决方案

假设我有一个函数
GetExchangeRate(buyCurrency,sellCurrency)
。因此,如果1英镑相当于1.6美元,那么
GetExchangeRate('GBP','USD')=1.6
GetExchangeRate('USD','GBP')=0.625

系统中的订单将表示为以下三元组:
(buyCurrency、SellCurrency、buyCurrencyAmount)
。所以,('GBP','USD',125.00)意味着用多少美元购买125英镑

我的目标是节省交易成本,取消订单,包括传递性。将同一对货币之间的买卖净额结算是很容易做到的,也很容易证明这一点。让我们说,我可能有一个商业理由来简化订单,我用美元购买英镑,也用英镑购买欧元,等等

我想以传递的方式简化这组命令。我正在考虑构建一个图形数据结构(节点是货币,边是buyCurrencyAmounts),即使数据将存储在SQL表中,并对其应用正确的算法。我想先做一个简单的网格,然后在DAG上进行拓扑排序,然后从顶部开始,然后按照拓扑顺序进行遍历,并“压缩”顺序,例如简化它们

问题是我不一定会有一个DAG。但是,当我执行算法时,我可能会简化图形结构,无论哪一个

我应该为此使用什么样的数据结构/算法?我应该担心结果的准确性吗?有没有一些好的方法可以让我不损失分钱?你能推荐一个好的C#库来处理这个问题吗?仅使用SQL Server 2008进行此操作是否疯狂/效率低下/工作量过大


编辑:为交易支付的费用都包含在价格(汇率)中。没有固定的固定费用或类似的东西。

在我看来,将交易集看作一个图形似乎过于复杂。只需在您的交易集中进行每笔交易并添加货币(即添加所有英镑买入/卖出、所有美元买入/卖出、欧元买入/卖出)

你最终得到了你想要的每种货币的净买入/卖出。然后根据最低价差开始挑选交易(即,如果您对欧元的价差最低,那么挑选一笔欧元交易-可能会使一些欧元或一些美元处于水平),继续…

一种可能的技术是

  • 确定每种货币的买卖金额

  • 制作一个有向图,其中节点是货币,弧是货币之间可能的转换,弧成本捕获利差的影响(我假设列出的利率是完全有效的,因此任何转换周期都乘以1)

  • 使用描述的多项式时间算法之一计算最小成本流

  • 您需要实施多边付款净额结算。“诀窍”是创建一个称为净额结算中心的新实体,并通过它重新安排所有付款。有关此方法的好处,请参见我对类似问题的回答

    我们的目标是摆脱这种情况(在净额结算之前)

    为此(在净额结算后):

    各子公司最终应从净额结算中心以其本国货币获得一笔金额(支付或接收),该金额为其欠集团内任何其他实体的所有单独发票的抵销价值之和

    基本算法是:

    • 从带有付款人、收款人、货币和金额列的发票表开始。这些对应于“净额结算前”情景中的流量
    • 创建包含实体、货币和金额列的子付款临时表
    • 遍历每个发票,为发票表中的每个付款人、货币、金额向临时表中添加一行
    • 然后对收据执行相同操作,添加收款人、货币和负数
    • 将子付款汇总为每个实体的货币小计
    • 转换子付款总额(如有必要,应用差价)
    • 临时表现在对应于“净额结算后”场景中的情况
    舍入误差将最小化,因为您将只转换总数。四舍五入误差的任何结果都将最终记入净额结算中心账户。净额结算中心账户将包含货币小计,该小计应与外汇银行进行交易,以将其转换为基础货币,如美元。所处理的利率应为净额计算中使用的利率,因此,一旦与外汇银行达成一致,应重新进行计算(总额将发生微小变化)

    (使用多边净额结算而非双边净额结算的优点之一是,任何此类外汇要求都是由同一个单一实体(即净额结算中心)“要求”的。此外,如果您选择收取差价,即买入和卖出利率不同,则产生的任何“利润”也将记入净额结算中心的账户)

    关于执行实际计算,直接在SQL中执行非常简单,但是您可能会发现有足够的法律和/或配置选项来保证更抽象的方法


    (例如,法律问题:一些政府不允许在跨境交易中兑换外币;其他政府不允许您抵消付款和收款;一些需要中央银行的许可。一些有特殊要求的国家包括巴西、中国、马来西亚、俄罗斯等).

    是不是总是这样的
    GetExchangeRates(A,B)*GetExchangeRates(B,A)==1
    ?@unkulunkulu,实际上有一个所谓的spre