这是一个几乎与语言无关的问题,而不是作业。理想情况下,我会使用C#和/或SQL服务器来解决问题。
假设我有一个函数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尝试此操作会是疯狂/低效/太多工作吗?
编辑: 交易支付的费用都包含在价格(汇率)中。没有固定的固定费用或类似的东西。
答案 0 :(得分:1)
一种可能的技术是minimum-cost flows。
确定每种货币的买卖价格。
制作一个有向图,其中节点是货币,弧线是货币之间可能的转换,弧线成本捕获点差的影响(我假设列出的汇率是完全有效的,因此任何周期转换次数乘以1)。
使用所描述的多项式时间算法之一来计算最低成本流量。
答案 1 :(得分:1)
您需要实施多边支付网。 “技巧”是创建一个名为净额结算中心的新实体,并通过它重新路由所有付款。请参阅我对类似问题here的回答,了解此方法的好处。
目标是摆脱这种情况(扣网前):
到此(净额结算后):
每个子公司最终都应以其本国货币从净结算中心获得单一金额(支付或接收),这是他们欠集团中任何其他实体的所有单个发票的对价总额。
基本算法是:
舍入错误将被最小化,因为您只会转换总数。舍入错误的任何结果将最终出现在净结算中心账户中。净额结算中心账户将包含应与外汇银行交易的货币小计,以将其转换为基础货币,例如美元。处理的费率应该是净额结算计算中使用的费率,因此一旦与外汇银行达成协议,计算应该重做(总数将略有变化)。
(使用多边而不是双边净额结算的优点之一是,任何此类外汇要求都是由同一个实体'所需',即,净额结算中心。此外,如果您选择收取差价,即,买入和卖出价格不同,那么任何由此产生的“利润”也将最终出现在净额结算中心帐户)。
关于执行实际计算 - 直接在SQL中执行很简单,但您可能会发现有足够的法律和/或配置选项来保证更抽象的方法。
(例如法律问题:一些政府不允许在跨境交易中转换外币;其他政府不允许您抵消付款和收据;有些政府需要得到中央银行的许可。一些有特殊要求的国家包括巴西,中国,马来西亚,俄罗斯等)。
答案 2 :(得分:0)
听起来像是在考虑一组交易,因为图表过于复杂。只需在您的集合中进行每笔交易并添加货币(即添加所有英镑买入/卖出,所有美元买入/卖出,欧元买入/卖出)。
您最终会获得每种货币所需的净买/卖价。然后开始根据最低点差选择交易(即如果您的欧元差价最小,那么选择一笔欧元交易 - 可能会达到欧元或一些美元的水平),继续......