private TradeCirculaire CalculTradeCirculaireEnPartantDe(Monnaie m, ValeurEchange veInitiale, ValeurEchange ve12, ValeurEchange ve23, ValeurEchange ve31, Func <Richesse, ValeurEchange, ValeurEchange, ValeurEchange, TradeCirculaire> constructeurDepuisEtape) { TradeCirculaire tmp = null; TradeCirculaire bestTrade = constructeurDepuisEtape(new Richesse(0, m), ve12, ve23, ve31); int i = 0; while (tmp == null || tmp.Gain > bestTrade.Gain) { if (tmp != null) { bestTrade = tmp; } Richesse etape = veInitiale.GetRichesseToTrade(m, i++); tmp = constructeurDepuisEtape(etape, ve12, ve23, ve31); } return(bestTrade); }
private TradeCirculaire CalculTradeCirculaire(Monnaie m1, Monnaie m2, Monnaie m3) { if (!BaseEtQuoteToVe.TryGetValue(m1, m2, out ValeurEchange ve12) || !BaseEtQuoteToVe.TryGetValue(m2, m3, out ValeurEchange ve23) || !BaseEtQuoteToVe.TryGetValue(m3, m1, out ValeurEchange ve31)) { return(null); } TradeCirculaire partantDeM1 = CalculTradeCirculaireEnPartantDe(m1, ve12, ve12, ve23, ve31, TradeCirculaire.constructeurFromM1); TradeCirculaire partantDeM2 = CalculTradeCirculaireEnPartantDe(m2, ve23, ve12, ve23, ve31, TradeCirculaire.constructeurFromM2); TradeCirculaire partantDeM3 = CalculTradeCirculaireEnPartantDe(m3, ve31, ve12, ve23, ve31, TradeCirculaire.constructeurFromM3); TradeCirculaire best = partantDeM1; if (best.Gain < partantDeM2.Gain) { best = partantDeM2; } if (best.Gain < partantDeM3.Gain) { best = partantDeM3; } return(best); }