Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Threading;
- using System.Linq;
- using System.Linq.Expressions;
- using System.Threading.Tasks;
- using Akka.Actor;
- using Akka.Util.Internal;
- using CoinMM.Messages;
- using Newtonsoft.Json.Schema;
- namespace CoinMM
- {
- public class FxConverter : ReceiveActor
- {
- private readonly IActorRef fxBroker;
- private readonly IActorRef MySelf;
- private readonly Dictionary<string, FxItem> fxRates = new Dictionary<string, FxItem>()
- {
- // /USD
- {"EUR", new FxItem() {symbol = "EURUSD", isInverse = false}},
- {"GBP", new FxItem() {symbol = "GBPUSD", isInverse = false}},
- {"AUD", new FxItem() {symbol = "AUDUSD", isInverse = false}},
- {"NZD", new FxItem() {symbol = "NZDUSD", isInverse = false}},
- // USD/
- {"JPY", new FxItem() {symbol = "USDJPY", isInverse = true}},
- {"CNY", new FxItem() {symbol = "USDCNY", isInverse = true}},
- {"HKD", new FxItem() {symbol = "USDHKD", isInverse = true}},
- {"SGD", new FxItem() {symbol = "USDSGD", isInverse = true}},
- {"ZAR", new FxItem() {symbol = "USDZAR", isInverse = true}}
- };
- class FxItem
- {
- public string symbol;
- public bool isInverse;
- public double Price = double.NaN;
- }
- public FxConverter( IActorRef fxBroker)
- {
- this.fxBroker = fxBroker;
- MySelf = this.Self;
- Receive<FxConverterStart>(OnStart);
- Receive<List<MarketData>>(OnMarketData);
- Receive<ConvertFxRequest>(OnConvertRequest);
- }
- public bool OnStart(FxConverterStart start)
- {
- try
- {
- Console.WriteLine( $"FxConverter is subscribing quotes with {fxRates.Count} symbols. MyName:{MySelf}");
- fxRates.ForEach( async fx =>
- {
- var subscriptionResult = await fxBroker.Ask<MarketDataSubscriptionResult>( new MarketDataSubscription() {symbol = fx.Value.symbol , subscriber = MySelf});
- if (subscriptionResult.ok)
- {
- Console.WriteLine($"FxConverter added symbol: {fx.Value.symbol}");
- }
- else
- {
- Console.WriteLine($"FxConverter error adding symbol: {fx.Value.symbol} - symbol is not supported.");
- }
- });
- MySelf.Tell(new List<MarketData>());
- }
- catch (Exception ex)
- {
- Console.WriteLine($"FxConverter Subscribe exception: " + ex.Message);
- }
- return true;
- }
- public bool OnMarketData( List<MarketData> marketDataList)
- {
- Console.WriteLine($"fxConverter.OnMarketData..");
- if (marketDataList != null)
- {
- try
- {
- marketDataList.ForEach(marketData =>
- {
- if (marketData != null)
- {
- var foundItem = fxRates.FirstOrDefault(item => item.Value.symbol == marketData.symbol);
- if (foundItem.Key != null)
- {
- foundItem.Value.Price = (double) marketData.last;
- }
- else
- {
- Console.WriteLine(
- $"fxConverter has received symbol, but is not keeping this in it symbol list: {marketData.symbol}");
- }
- }
- });
- }
- catch (Exception ex)
- {
- Console.WriteLine($"FXConverter OnMarketDataReceived Exception {ex.Message}.");
- }
- }
- return true;
- }
- public bool OnConvertRequest(ConvertFxRequest convertRequest)
- {
- Console.WriteLine($"fxConverter is converting {convertRequest.Price} from {convertRequest.Currency}..");
- if (convertRequest.Currency == "USD")
- {
- Sender.Tell(new ConvertFxResult {Price = convertRequest.Price});
- return true;
- }
- if (fxRates.ContainsKey(convertRequest.Currency))
- {
- var fx = fxRates[convertRequest.Currency];
- if (fx.isInverse)
- {
- var convPrice = convertRequest.Price * fx.Price;
- Console.WriteLine($"fxConverter converted {convertRequest.Price} from {convertRequest.Currency} to {convPrice}.");
- Sender.Tell(new ConvertFxResult {Price = convPrice});
- }
- else
- {
- var convPrice = convertRequest.Price / fx.Price;
- Console.WriteLine($"fxConverter converted {convertRequest.Price} from {convertRequest.Currency} to {convPrice}.");
- Sender.Tell(new ConvertFxResult {Price = convPrice});
- }
- return true;
- }
- Console.WriteLine($"fxConverter could not convert unknown currency: {convertRequest.Currency}.");
- Sender.Tell(new ConvertFxResult {Price= double.NaN});
- return true;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement