Guest User

Untitled

a guest
May 10th, 2021
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.47 KB | None | 0 0
  1. /// <summary>
  2. /// Пример тактики, использующей специфичные для конкретной биржи функциональные
  3. /// возможности.
  4. /// </summary>
  5. public class SimpleTradingTactic : TradingTacticBase<SimpleTradingTacticContext>,
  6. ISimpleTradingTactic
  7. {
  8. private readonly IAdviserProvider _adviserProvider;
  9. private readonly IIndicatorProvider _indicatorProvider;
  10. private IOpenedOrderCrudAppService _openedOrderCrudService;
  11. private IOrderCrudAppService _orderCrudService;
  12. private IExchangeProvider _exchangeProvider;
  13. private readonly ITimer _timer;
  14. private readonly IPairCrudAppService _pairCrudAppService;
  15. private IIndicatorRemoteEventHandler _indicatorRemoteEventHandler;
  16. public override float LogicRiskDegree { get; set; } = 12;
  17.  
  18. public SimpleTradingTactic(
  19. IOpenedOrderCrudAppService openedOrderCrudService,
  20. [NotNull] IAdviserProvider adviserProvider,
  21. [NotNull] IExchangeProvider exchangeProvider,
  22. [NotNull] IRemoteEventBus remoteEventBus,
  23. [NotNull] IIndicatorProvider indicatorProvider,
  24. [NotNull] IIndicatorRemoteEventHandler indicatorRemoteEventHandler,
  25. [NotNull] ITimer timer,
  26. [NotNull] IOrderCrudAppService orderCrudService,
  27. [NotNull] ITradingStrategyContextProvider tradingStrategyContextProvider,
  28. [NotNull] IRiskManagerClient riskManagerClient,
  29. [NotNull] IPairCrudAppService pairCrudAppService,
  30. IAccountManagerClient accountManagerClient) :
  31. base(tradingStrategyContextProvider, timer, openedOrderCrudService, orderCrudService, remoteEventBus,
  32. pairCrudAppService, riskManagerClient, accountManagerClient)
  33. {
  34. if (riskManagerClient == null) throw new ArgumentNullException(nameof(riskManagerClient));
  35. _adviserProvider = adviserProvider ?? throw new ArgumentNullException(nameof(adviserProvider));
  36. this._exchangeProvider = exchangeProvider ?? throw new ArgumentNullException(nameof(exchangeProvider));
  37. this._indicatorProvider = indicatorProvider ?? throw new ArgumentNullException(nameof(indicatorProvider));
  38. _indicatorRemoteEventHandler = indicatorRemoteEventHandler;
  39. _timer = timer ?? throw new ArgumentNullException(nameof(timer));
  40. _orderCrudService = orderCrudService ?? throw new ArgumentNullException(nameof(orderCrudService));
  41. _pairCrudAppService = pairCrudAppService ?? throw new ArgumentNullException(nameof(pairCrudAppService));
  42. _openedOrderCrudService = openedOrderCrudService ?? throw new ArgumentNullException(nameof(openedOrderCrudService));
  43.  
  44. indicatorRemoteEventHandler.IndicatorHandler += HandleEvent;
  45. }
  46. public override string Name => "Тактика торговли с простейшим алгоритмом";
  47.  
  48. public override Action Execute => Trading;
  49.  
  50. /// <summary>
  51. /// Корректирует экстримальные значения в контексте тактики в процессе работы бота
  52. /// </summary>
  53. /// <param name="upperLevel"></param>
  54. /// <param name="lowerLevel"></param>
  55. public void CorrectExtpemeValues(decimal upperLevel, decimal lowerLevel)
  56. { }
  57.  
  58. private async void Trading()
  59. {
  60. //Для тестирования
  61. var timeFrames = new TimeSpan[] { TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(30) };
  62. var rnd = new Random(0);
  63.  
  64. //Подписаться на индикаторы, публикующие сигналы в Кафку
  65. await _remoteEventBus.SubscribeAsync(KafkaTopics.GetEventBusTopicForTradingTactic());
  66.  
  67. //Для теста
  68. await _remoteEventBus.SubscribeAsync(KafkaTopics.GetEventBusTopicForHeartBeat());
  69.  
  70. while (true)
  71. {
  72.  
  73.  
  74. var exchange = _exchangeProvider.Get(Context.ExchangeId);
  75.  
  76. // var opendOrderList = await exchange.ExchangeDriver.OpenOrdersAsync();
  77.  
  78.  
  79. var processingSignalResult = SignalsProsessing(Context.Signals.Count);
  80.  
  81. var parametrs = new Dictionary<string, object>();
  82. //TODO Этот параметр определять на основе приятой стратегии
  83. parametrs.Add("TradingType", TradingTypes.ShortTime);
  84.  
  85. var advisers = _adviserProvider.GetAdvisers(parametrs);
  86.  
  87. if (false) //advisers.Any()
  88. {
  89.  
  90. IList<TradeExpertAdvice> advices = new List<TradeExpertAdvice>();
  91.  
  92. //Опрашивется каждый советник и от него получаем совет
  93. foreach (var adviser in advisers)
  94. {
  95. var advice = await adviser.GetAdviceAsync(new AdviserContext
  96. {
  97. ExchangeId = Context.ExchangeId,
  98. PairId = Context.PairId,
  99. TimeFrame = TimeSpan.FromMinutes(1)
  100. });
  101.  
  102. advices.Add(advice);
  103. }
  104.  
  105. IDictionary<Advices, int> groupedAdvices = new Dictionary<Advices, int>();
  106.  
  107. groupedAdvices.Add(Advices.Growin, advices.Count(a => a.Advice == Advices.Growin));
  108. groupedAdvices.Add(Advices.Falls, advices.Count(a => a.Advice == Advices.Falls));
  109. groupedAdvices.Add(Advices.Stable, advices.Count(a => a.Advice == Advices.Stable));
  110.  
  111. //Выявляем наибольшее количество советов по трендам
  112. var bestAdvice = groupedAdvices.OrderByDescending(p => p.Value).First();
  113.  
  114. if (bestAdvice.Key == Advices.Stable)
  115. {
  116. //TODO Обращаемся к рискменеджеру за характеристик ордера
  117. //Пока ничего не делаем
  118. }
  119. else if (bestAdvice.Key == Advices.Falls)
  120. {
  121. //TODO Обращаемся к рискменеджеру за характеристик ордера
  122. //Что делаем здесь?
  123. }
  124. else if (bestAdvice.Key == Advices.Growin)
  125. {
  126. //TODO Обращаемся к рискменеджеру за характеристик ордера
  127. //Что делаем здесь?
  128. }
  129. }
  130. //TODO прежде чем отдавать ордер на рассчет, нужно уточнить количество уже
  131. //выставленных оредров, которое не должно превышать лимитного значения
  132. //Это можно сделать и внутри метода SetOrderAsync()
  133. await SetOrderAsync(processingSignalResult);
  134.  
  135. Thread.Sleep(_timer.SpeedUpInSeconds(60));
  136.  
  137. //Ведется контроль за статусом бота и в случае необходимости
  138. //прекращает работу
  139. if (Context.CancellationTokenSource.Token.IsCancellationRequested)
  140. {
  141. //TODO Организовать корректную остановку работы торговой тактики
  142. //Context.CancellationTokenSource.Token.ThrowIfCancellationRequested();
  143. }
  144. };
  145. }
  146.  
  147.  
  148. /// <summary>
  149. /// Обрабатываются все полученные сигналы от индикаторов, на онове чего выявлвяется тренд и таймфрейм
  150. /// для последующей постановки ордера
  151. /// </summary>
  152. /// <param name="signalsCount"></param>
  153. /// <returns></returns>
  154. private ProcessingSignalsResult SignalsProsessing(int signalsCount)
  155. {
  156. //TODO логика обработки сигналов
  157.  
  158. return new ProcessingSignalsResult
  159. {
  160. TimeFrame = new TimeSpan(0, 1, 0),
  161. TradeType = TradeTypes.Sell,
  162. Price = 23,
  163. StopLoss = 25,
  164. TakeProfit = 17
  165. };
  166. }
  167.  
  168. /// <summary>
  169. /// Обрабатывает сигналы поступающие от индикаторов
  170. /// </summary>
  171. /// <param name="eventArgs"></param>
  172. private void HandleEvent(object sendet, IRemoteEventData eventData)
  173. {
  174. //Debug.WriteLine($"Обрабатывает сигнал торговая тактика Id: {Context.Id}");
  175.  
  176. if (eventData.Type == "not_signal")
  177. {
  178. foreach (var data in eventData.Data)
  179. {
  180. Console.WriteLine($"{data.Key} : {data.Value}");
  181. }
  182. }
  183. else if (eventData.Type == "signal")
  184. {
  185. if (Context.ExchangeId.Equals((string)eventData.Data["exchange"])
  186. && Context.PairId.ToString().Equals((string)eventData.Data["pair"]))
  187. // TODO && (int)eventArgs.EventData.Data["timeframe"] == Context.
  188. {
  189. SignalCounterForTest.CountSignals++;
  190.  
  191. JObject jSignal = (JObject)eventData.Data["signal"];
  192.  
  193. SignalDto signal = jSignal.ToObject<SignalDto>();
  194.  
  195. Context.Signals.Enqueue(signal);
  196. }
  197. }
  198. }
  199.  
  200. public override void ChangeCurrencyValue(Currency currency, decimal value, string purpose)
  201. {
  202. throw new NotImplementedException();
  203. }
  204.  
  205. public override void Dispose()
  206. {
  207. _indicatorRemoteEventHandler.IndicatorHandler -= HandleEvent;
  208. }
  209. }
Advertisement
Add Comment
Please, Sign In to add comment