EUR/GBP: Перейдет ли инициатива к покупателям?
Кросс-курс EUR/GBP протестировал нижнюю границу многомесячного пологого треугольника, а также расположенный чуть ниже уровень поддержки 0.8610. Ключевой особенностью стало закрытие сегодняшнего...
Мы запустили PT Naira — своего первого ИИ-помощника
Не секрет, что сегодня злоумышленники уже активно используют ИИ. При этом, в отличие от защитников, они не ограничены ни правилами, ни регулированием, ни вопросами морали. Наша задача — дать...
📍 Как зарабатывают фармацевтические компании и стоит ли покупать их акции
Самые крупные в российском фармсекторе «Промомед» и «Озон Фармацевтика». Обе компании показывают высокие темпы роста. При этом их безнес-модели весьма отличаются. На карточках рассмотрели...
Мой Рюкзак #66: Потрепанная шкура в игре, но есть ли смысл выходить по текущим? Только если ребаланс
Последний раз писал про портфель 3 месяца назад, делал ставку на энергетический и продовольственный кризис из-за перекрытия проливов
Ссылка на прошлый пост smart-lab.ru/mobile/topic/1278612/...
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; }
}
}