1

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

假设我有一个函数GetExchangeRate(buyCurrency, sellCurrency)。所以,如果 1 GBP 值 1.6 USD,那么GetExchangeRate('GBP', 'USD') = 1.6GetExchangeRate('USD', 'GBP') = 0.625

系统中的订单将表示为以下三元组:(buyCurrency, SellCurrency, buyCurrencyAmount)。因此,('GBP', 'USD', 125.00) 表示用多少美元买入 125 GBP。

我的目标是节省交易成本并取消订单,包括传递性。对同一对货币之间的买入和卖出进行净额计算很容易,也很容易证明是合理的。假设我可能有商业原因来简化订单,我用美元购买英镑,并用英镑购买欧元,等等......

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

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

我应该为此使用什么正确的数据结构/算法?我应该担心由此产生的精度吗?有没有一些好的方法可以让我不损失美分?你能推荐一个可以处理这个问题的好 C# 库吗?仅使用 SQL Server 2008 尝试此操作会是疯狂/低效/太多工作吗?

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

4

3 回答 3

1

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

目标是摆脱这种情况(在净额之前):

入网前

对此(净额后):

结网后

每个子公司最终应以本国货币从净额结算中心获得单一金额(支付或接收),这是他们欠集团中任何其他实体的所有单独发票的对价的总和。

基本算法是:

  • 从带有PayerPayeeCurrencyAmount列的发票表开始。这些对应于“净额结算之前”场景中的流量
  • 创建一个包含EntityCurrencyAmount列的子付款临时表
  • 遍历每张发票,为发票表中的每个付款人、货币、金额在临时表中添加一行。
  • 然后对收据做同样的事情,添加收款人、货币和金额。
  • 将子付款汇总为每个实体的货币小计。
  • 转换子付款总额(必要时应用差价)
  • 临时表现在对应于 'after netting' 场景中的情况

舍入误差将被最小化,因为您只会转换总数。舍入误差的任何结果都将最终出现在净额结算中心账户中。净额结算中心账户将包含应与外汇银行交易以将其转换为基础货币(例如美元)的货币小计。所处理的汇率应该是净额计算中使用的汇率,因此一旦与外汇银行达成一致,就应该重新计算(总数会略有变化)。

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

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

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

于 2012-01-10T12:04:59.290 回答
1

一种可能的技术是最低成本流

  1. 确定每种货币的买卖数量。

  2. 制作一个有向图,其中节点是货币,弧线是货币之间可能的转换,弧线成本反映了价差的影响(我假设列出的汇率非常有效,因此任何转换周期都会乘以 1) .

  3. 使用所描述的多项式时间算法之一来计算最小成本流。

于 2011-07-25T20:34:29.397 回答
0

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

您最终得到每种货币的净买入/卖出。然后开始根据最低点差挑选交易(即,如果您的 EUR$ 点差最低,然后挑选 EUR$ 交易 - 这可能会拉平一些欧元或一些美元),继续...

于 2011-07-25T20:14:18.367 回答