using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Helpers;
namespace TSLab.Community.Ichimoku {
public abstract class BaseSen {
public virtual int Period { get; set; }
public IContext Context { get; set; }
static double CalcMiddle(IListvalues, int start, int finish) {
double min = float.MaxValue, max = -float.MaxValue;
for (int i = start; i <= finish; i++) {
var v = values[ i ];
if (v.High > max)
max = v.High;
if (v.Low < min)
min = v.Low;
}
return 0.5 * (max + min);
}
static double CalcSmoothMiddle(IListvalues, int start, int finish) {
double m = 0;
for (int i = start; i <= finish; i++) {
var v = values[ i ];
m += v.High + v.Low + v.Close + v.Open;
}
m /= 4 * (finish — start + 1);
return m;
}
public IListExecute(ISecurity source) {
// Исходный вариант
var high = Context.GetData(«Highest», new[] { Period.ToString() },
() => Series.Highest(source.HighPrices, Period));
var low = Context.GetData(«Lowest», new[] { Period.ToString() },
() => Series.Lowest(source.LowPrices, Period));
var list = new double[ high.Count ];
for (int i = 0; i < high.Count; i++)
list[ i ] = 0.5 * (high[ i ] + low[ i ]);
return list;
/*// Другие варианты
int c = source.Bars.Count;
var list = new double[ c ];
for (int i = Period; i < c; i++)
//list[i] = CalcMiddle(source.Bars, i — Period, i — 1);
list[ i ] = CalcSmoothMiddle(source.Bars, i — Period, i — 1);
return list;*/
}
}
/// /// Tenkan-sen — короткая линия тренда (дословный перевод — линия переворота).
/// Линия трактуется как указатель направления тренда: чем больше крутизна этой линии,
/// тем более ярко выражен тренд. Если линия горизонтальна — рынок вошел в канал.
/// Кроме того, как и любая средняя, эта линия может
/// рассматриваться как поддержка или сопротивление.
///
[HandlerCategory(«Ichimoku»)]
public class TenkanSen: BaseSen, IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «9», Min = «3», Max = «25», Step = «1»)]
public override int Period { get; set; }
}
/// /// Kijun (Kijun-sen), «линия стандарта» — среднее значение цены за второй,
/// более продолжительный промежуток времени.
/// Используется как показатель движения рынка. Если цена выше нее, цены,
/// вероятно, будут продолжать расти. Когда цена пересекает эту линию,
/// вероятно дальнейшее изменение тренда.
/// Другим вариантом использования Kijun является подача сигналов. Сигнал к покупке
/// генерируется когда линия Tenkan пересекает Kijun снизу вверх.
/// Если сверху-вниз — сгнал к продаже.
///
///
[HandlerCategory(«Ichimoku»)]
public class KijunSen: BaseSen, IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public override int Period { get; set; }
}
/// /// SenkouA (Senkou Span A) — среднее от /> и />,
/// сдвинутое вперед на величину периода KijunSen (26).
///
[HandlerCategory(«Ichimoku»)]
public class SenkouA: IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «9», Min = «3», Max = «25», Step = «1»)]
public int TenkanPeriod { get; set; }
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public int KijunPeriod { get; set; }
public IListExecute(ISecurity source) {
var tenkan = new TenkanSen { Period = TenkanPeriod, Context = Context }.Execute(source);
var kijun = new KijunSen { Period = KijunPeriod, Context = Context }.Execute(source);
var count = source.HighPrices.Count;
var result = new double[ count ];
for (int i = KijunPeriod + KijunPeriod; i < count; i++)
result[ i ] = 0.5 * (tenkan[ i — KijunPeriod ] + kijun[ i — KijunPeriod ]);
return result;
}
public IContext Context { get; set; }
}
/// /// SenkouB (Senkou Span B) — среднее значение цены за третий временной интервал (52),
/// сдвинутое вперед на величину второго интервала (26).
/// Расстояние между линиями /> и /> штрихуется и
/// называется «облаком». Если цена находится между этими линиями, рынок считается нетрендовым,
/// а края облака в таком случае образуют поддержку и сопротивление.
/// Если цена находится над облаком, то обе линии — поддержки. Если под, то сопротивления.
///
[HandlerCategory(«Ichimoku»)]
public class SenkouB: IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «52», Min = «25», Max = «255», Step = «1»)]
public int Period { get; set; }
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public int KijunPeriod { get; set; }
public IListExecute(ISecurity source) {
var avg = new TenkanSen { Period = Period, Context = Context }.Execute(source);
var count = source.HighPrices.Count;
var result = new double[ count ];
for (int i = Period + KijunPeriod; i < count; i++)
result[ i ] = avg[ i — KijunPeriod ];
return result;
}
public IContext Context { get; set; }
}
/// /// Chinkou Span (Chinkou) — показывает цену закрытия текущей свечи,
/// сдвинутую назад на величину второго временного интервала (26).
/// Не рекомендуется использовать при тестировании на исторических данных,
/// поскольку индикатор «смотрит в будущее».
/// Если линия пересекает график цены снизу-вверх, это является сигналом к покупке.
/// Если сверху-вниз — сигналом к продаже.
///
[HandlerCategory(«Ichimoku»)]
public class Chinkou: IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public int KijunPeriod { get; set; }
public IListExecute(ISecurity source) {
var close = source.ClosePrices;
var result = new double[ close.Count ];
for (int i = 0; i < result.Length — KijunPeriod; i++)
result[ i ] = close[ i + KijunPeriod ];
return result;
}
Iena, голову посыпать пеплом рано еще.
Сегодня только первый день тех дефолта.И цена ИМХО неоправданно низкая сейчас на эту бумагу.
Полноценный только 10 марта выходит по расчетам.Времени вагон...
Витя, опять не угадалГенассамблея ООН приняла подготовленную Киевом и странами Европы резолюцию с осуждением действий России на Украине. За документ проголосовали 93 страны, 18 были против, 65 возд...
Киев будет направлять 50% доходов от природных ресурсов в фонд восстановления, в котором Вашингтон будут единственным бенефициаром — РИА Новости ✅ Киев будет направлять 50% доходов от природных ресурс...
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Helpers;
namespace TSLab.Community.Ichimoku {
public abstract class BaseSen {
public virtual int Period { get; set; }
public IContext Context { get; set; }
static double CalcMiddle(IListvalues, int start, int finish) {
double min = float.MaxValue, max = -float.MaxValue;
for (int i = start; i <= finish; i++) {
var v = values[ i ];
if (v.High > max)
max = v.High;
if (v.Low < min)
min = v.Low;
}
return 0.5 * (max + min);
}
static double CalcSmoothMiddle(IListvalues, int start, int finish) {
double m = 0;
for (int i = start; i <= finish; i++) {
var v = values[ i ];
m += v.High + v.Low + v.Close + v.Open;
}
m /= 4 * (finish — start + 1);
return m;
}
public IListExecute(ISecurity source) {
// Исходный вариант
var high = Context.GetData(«Highest», new[] { Period.ToString() },
() => Series.Highest(source.HighPrices, Period));
var low = Context.GetData(«Lowest», new[] { Period.ToString() },
() => Series.Lowest(source.LowPrices, Period));
var list = new double[ high.Count ];
for (int i = 0; i < high.Count; i++)
list[ i ] = 0.5 * (high[ i ] + low[ i ]);
return list;
/*// Другие варианты
int c = source.Bars.Count;
var list = new double[ c ];
for (int i = Period; i < c; i++)
//list[i] = CalcMiddle(source.Bars, i — Period, i — 1);
list[ i ] = CalcSmoothMiddle(source.Bars, i — Period, i — 1);
return list;*/
}
}
/// /// Tenkan-sen — короткая линия тренда (дословный перевод — линия переворота).
/// Линия трактуется как указатель направления тренда: чем больше крутизна этой линии,
/// тем более ярко выражен тренд. Если линия горизонтальна — рынок вошел в канал.
/// Кроме того, как и любая средняя, эта линия может
/// рассматриваться как поддержка или сопротивление.
///
[HandlerCategory(«Ichimoku»)]
public class TenkanSen: BaseSen, IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «9», Min = «3», Max = «25», Step = «1»)]
public override int Period { get; set; }
}
/// /// Kijun (Kijun-sen), «линия стандарта» — среднее значение цены за второй,
/// более продолжительный промежуток времени.
/// Используется как показатель движения рынка. Если цена выше нее, цены,
/// вероятно, будут продолжать расти. Когда цена пересекает эту линию,
/// вероятно дальнейшее изменение тренда.
/// Другим вариантом использования Kijun является подача сигналов. Сигнал к покупке
/// генерируется когда линия Tenkan пересекает Kijun снизу вверх.
/// Если сверху-вниз — сгнал к продаже.
///
///
[HandlerCategory(«Ichimoku»)]
public class KijunSen: BaseSen, IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public override int Period { get; set; }
}
/// /// SenkouA (Senkou Span A) — среднее от /> и />,
/// сдвинутое вперед на величину периода KijunSen (26).
///
[HandlerCategory(«Ichimoku»)]
public class SenkouA: IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «9», Min = «3», Max = «25», Step = «1»)]
public int TenkanPeriod { get; set; }
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public int KijunPeriod { get; set; }
public IListExecute(ISecurity source) {
var tenkan = new TenkanSen { Period = TenkanPeriod, Context = Context }.Execute(source);
var kijun = new KijunSen { Period = KijunPeriod, Context = Context }.Execute(source);
var count = source.HighPrices.Count;
var result = new double[ count ];
for (int i = KijunPeriod + KijunPeriod; i < count; i++)
result[ i ] = 0.5 * (tenkan[ i — KijunPeriod ] + kijun[ i — KijunPeriod ]);
return result;
}
public IContext Context { get; set; }
}
/// /// SenkouB (Senkou Span B) — среднее значение цены за третий временной интервал (52),
/// сдвинутое вперед на величину второго интервала (26).
/// Расстояние между линиями /> и /> штрихуется и
/// называется «облаком». Если цена находится между этими линиями, рынок считается нетрендовым,
/// а края облака в таком случае образуют поддержку и сопротивление.
/// Если цена находится над облаком, то обе линии — поддержки. Если под, то сопротивления.
///
[HandlerCategory(«Ichimoku»)]
public class SenkouB: IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «52», Min = «25», Max = «255», Step = «1»)]
public int Period { get; set; }
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public int KijunPeriod { get; set; }
public IListExecute(ISecurity source) {
var avg = new TenkanSen { Period = Period, Context = Context }.Execute(source);
var count = source.HighPrices.Count;
var result = new double[ count ];
for (int i = Period + KijunPeriod; i < count; i++)
result[ i ] = avg[ i — KijunPeriod ];
return result;
}
public IContext Context { get; set; }
}
/// /// Chinkou Span (Chinkou) — показывает цену закрытия текущей свечи,
/// сдвинутую назад на величину второго временного интервала (26).
/// Не рекомендуется использовать при тестировании на исторических данных,
/// поскольку индикатор «смотрит в будущее».
/// Если линия пересекает график цены снизу-вверх, это является сигналом к покупке.
/// Если сверху-вниз — сигналом к продаже.
///
[HandlerCategory(«Ichimoku»)]
public class Chinkou: IBar2DoubleHandler, IContextUses {
[HandlerParameter(true, «26», Min = «5», Max = «52», Step = «1»)]
public int KijunPeriod { get; set; }
public IListExecute(ISecurity source) {
var close = source.ClosePrices;
var result = new double[ close.Count ];
for (int i = 0; i < result.Length — KijunPeriod; i++)
result[ i ] = close[ i + KijunPeriod ];
return result;
}
public IContext Context { get; set; }
}
}