using System.Collections.Generic; using System; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.DataSource; using TSLab.Script.Helpers; namespace Volume_In_Bar { public class Max_Trade_Price_In_Bar : IBar2DoubleHandler, IContextUses { public IList Execute(ISecurity source) { var high = source.HighPrices; var low = source.LowPrices; var close = source.ClosePrices; var open = source.OpenPrices; var count = source.Bars.Count; IList list = new List(count); for (int i = 0; i < count; i++) { //Вычисляем размер бара int size = Convert.ToInt32(high[i]-low[i])+1; //Массив с объемами по ценам в баре double[] volume_in_bar = new double[size]; //Все сделки в баре var trades = source.GetTrades(i); if (trades.Count == 0) { list.Add(0); continue; } //Проходим каждую сделку в баре foreach (var trade in trades) { try { //Номер позиции цены в баре int n_in_bar = Convert.ToInt32(trade.Price-low[i]); //Увеличиваем объем сделок по конкретной цене volume_in_bar[n_in_bar] += 1; } catch (IndexOutOfRangeException e) { Context.Log("Ошибка в цикле прохождения сделок в баре. Сделок в баре: " + trades.Count + "; Номер позиции в баре: " + Convert.ToString(trade.Price - low[i]) + "; Лоу бара: " + low[i] + "; Цена сделки: " + trade.Price +"; Время: "+trade.Date, 0); } } //Поиск максимального double max_volume_value = 0; int max_n_volume = -1; try { for (int j = 0; j < size; j++) if (volume_in_bar[j] > max_volume_value) { max_volume_value = volume_in_bar[j]; max_n_volume = j; } } catch (IndexOutOfRangeException e) { Context.Log("Ошибка в цикле поиска максимального", 0); } //Цена с максимальным объемом double max_volume_price = low[i] + max_n_volume; if (max_volume_price == 0) { list.Add(low[i]); } else { list.Add(max_volume_price); } } return list; } public IContext Context { get; set; } } public class Max_Volume_Price_In_Bar : IBar2DoubleHandler, IContextUses { public IList Execute(ISecurity source) { var high = source.HighPrices; var low = source.LowPrices; var close = source.ClosePrices; var open = source.OpenPrices; var count = source.Bars.Count; IList list = new List(count); for (int i = 0; i < count; i++) { //Вычисляем размер бара int size = Convert.ToInt32(high[i]-low[i])+1; //Массив с объемами по ценам в баре double[] volume_in_bar = new double[size]; //Все сделки в баре var trades = source.GetTrades(i); if (trades.Count == 0) { list.Add(0); continue; } //Проходим каждую сделку в баре foreach (var trade in trades) { try { //Номер позиции цены в баре int n_in_bar = Convert.ToInt32(trade.Price-low[i]); //Увеличиваем объем по конкретной цене volume_in_bar[n_in_bar] += trade.QuantityInLots; } catch (IndexOutOfRangeException e) { Context.Log("Ошибка в цикле прохождения сделок в баре. Сделок в баре: " + trades.Count + "; Номер позиции в баре: " + Convert.ToString(trade.Price - low[i]) + "; Лоу бара: " + low[i] + "; Цена сделки: " + trade.Price +"; Время: "+trade.Date, 0); } } //Поиск максимального double max_volume_value = 0; int max_n_volume = -1; try { for (int j = 0; j < size; j++) if (volume_in_bar[j] > max_volume_value) { max_volume_value = volume_in_bar[j]; max_n_volume = j; } } catch (IndexOutOfRangeException e) { Context.Log("Ошибка в цикле поиска максимального", 0); } //Цена с максимальным объемом double max_volume_price = low[i] + max_n_volume; if (max_volume_price == 0) { list.Add(low[i]); } else { list.Add(max_volume_price); } } return list; } public IContext Context { get; set; } } public class VWAP : IBar2DoubleHandler, IContextUses { //Подсчет Объема с накоплением public IList Volume_Summ(ISecurity source) { var count = source.Bars.Count; IList list_summ_volume = new List(count); for (int i = 0; i < count; i++) { if (i==0) { list_summ_volume.Add(source.Bars[i].Volume); } else { bool newDay = source.Bars[i - 1].Date.Date < source.Bars[i].Date.Date; if (newDay) { list_summ_volume.Add(source.Bars[i].Volume); } else { list_summ_volume.Add(list_summ_volume[i-1] + source.Bars[i].Volume); } } } return list_summ_volume; } //Подсчет Цена*Объем с накоплением public IList PQ_Summ(ISecurity source) { var count = source.Bars.Count; var close = source.ClosePrices; IList list_summ_PQ = new List(count); for (int i = 0; i < count; i++) { if (i==0) { list_summ_PQ.Add(source.Bars[i].Volume*close[i]); } else { bool newDay = source.Bars[i - 1].Date.Date < source.Bars[i].Date.Date; if (newDay) { list_summ_PQ.Add(source.Bars[i].Volume*close[i]); } else { list_summ_PQ.Add(list_summ_PQ[i-1] + source.Bars[i].Volume*close[i]); } } } return list_summ_PQ; } public IList Execute(ISecurity source) { var close = source.ClosePrices; var count = source.Bars.Count; var summ_volume_bar = this.Volume_Summ(source); var sum_pq_bar = this.PQ_Summ(source); IList vwap_value = new List(count); for (int i = 0; i < count; i++) { vwap_value.Add(sum_pq_bar[i]/summ_volume_bar[i]); } return vwap_value; } public IContext Context { get; set; } } }