Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature currently requires accessing the site using the built-in Safari browser.
Развеселил. Код очень большой,там 4, или 5 страниц, в файле все компактно, перекрасить цвет - секундное дело, копирнуть в редактор тоже. Это при желании. Понятно, что можно прописать любой ТФ, первокласснику с алфавитом бы разобраться, а идеи и логика понятны. Вроде нашел вариант, попробую по аналогии.За код в ворде двойной котёл))
//
// Copyright (C) 2019, NinjaTrader LLC <www.ninjatrader.com>.
// NinjaTrader reserves the right to modify or overwrite this NinjaScript component with each release.
//
#region Using declarations
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Xml.Serialization;
using NinjaTrader.Cbi;
using NinjaTrader.Gui;
using NinjaTrader.Gui.Chart;
using NinjaTrader.Gui.SuperDom;
using NinjaTrader.Data;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion
// This namespace holds indicators in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.Indicators
{
/// <summary>
/// Calculates the range of a bar.
/// </summary>
public class Volatility : Indicator
{
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = NinjaTrader.Custom.Resource.NinjaScriptIndicatorDescriptionRange;
Name = "Volatility";
BarsRequiredToPlot = 0;
IsSuspendedWhileInactive = true;
AddPlot(new Stroke(Brushes.Goldenrod, 2), PlotStyle.Bar, NinjaTrader.Custom.Resource.RangeValue);
}
}
protected override void OnBarUpdate()
{
// Add a 15 minute Bars object to the strategy
//AddDataSeries(Data.BarsPeriodType.Minute, 15);
//(Data.BarsPeriodType.Minute, 1440)
Value[0] = High[0] - Low[0];
//string str="Абракадарба";
//string str="ATR=" + ATR(14)[0].ToString()+ " Range=" + SMA(Range(),14)[0];
string str=string.Format("ATR={0:0.##} SMA(Range)={1:0.##} Цена прошла в %={2:00.##}%", ATR(90)[0], SMA(Range(),90)[0], 100*(High[0] - Low[0])/SMA(Range(),90)[0]);
Draw.TextFixed(this, "tag1", str, TextPosition.TopLeft);
}
}
}
#region NinjaScript generated code. Neither change nor remove.
namespace NinjaTrader.NinjaScript.Indicators
{
public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
{
private Volatility[] cacheVolatility;
public Volatility Volatility()
{
return Volatility(Input);
}
public Volatility Volatility(ISeries<double> input)
{
if (cacheVolatility != null)
for (int idx = 0; idx < cacheVolatility.Length; idx++)
if (cacheVolatility[idx] != null && cacheVolatility[idx].EqualsInput(input))
return cacheVolatility[idx];
return CacheIndicator<Volatility>(new Volatility(), input, ref cacheVolatility);
}
}
}
namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
{
public Indicators.Volatility Volatility()
{
return indicator.Volatility(Input);
}
public Indicators.Volatility Volatility(ISeries<double> input )
{
return indicator.Volatility(input);
}
}
}
namespace NinjaTrader.NinjaScript.Strategies
{
public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
{
public Indicators.Volatility Volatility()
{
return indicator.Volatility(Input);
}
public Indicators.Volatility Volatility(ISeries<double> input )
{
return indicator.Volatility(input);
}
}
}
#endregion
Подскажите плиз, какой код добавить, что бы ATR по 1440 мин строился в не зависимости от расположенного ТФ.Yes, получилось. Пустовать котлам.
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = NinjaTrader.Custom.Resource.NinjaScriptIndicatorDescriptionRange;
Name = "Volatility";
BarsRequiredToPlot = 0;
IsSuspendedWhileInactive = true;
DrawOnPricePanel = true;
IsOverlay = true;
//AddPlot(new Stroke(Brushes.Goldenrod, 2), PlotStyle.Bar, NinjaTrader.Custom.Resource.RangeValue);
}
else if (State == State.Configure)
{
AddDataSeries(BarsPeriodType.Minute, 1440);
}
}
protected override void OnBarUpdate()
{
if(CurrentBars[1] < 0)
return;
//Value[0] = High[0] - Low[0];
string str = string.Format("ATR={0:0.##} SMA(Range)={1:0.##} Price passed in %={2:00.##}%", ATR(Inputs[1], 90)[0], SMA(Range(Inputs[1]), 90)[0], 100 * (Range(Inputs[1])[0]) / SMA(Range(Inputs[1]), 90)[0]);
Draw.TextFixed(this, "tag1", str, TextPosition.TopLeft);
}
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = NinjaTrader.Custom.Resource.NinjaScriptIndicatorDescriptionRange;
Name = "Volatility";
BarsRequiredToPlot = 0;
IsSuspendedWhileInactive = true;
DrawOnPricePanel = true;
IsOverlay = true;
//AddPlot(new Stroke(Brushes.Goldenrod, 2), PlotStyle.Bar, NinjaTrader.Custom.Resource.RangeValue);
}
else if (State == State.Configure)
{
AddDataSeries(BarsPeriodType.Minute, 1440);
}
}
protected override void OnBarUpdate()
{
if(CurrentBars[1] < 0)
return;
if(BarsInProgress == 1) //Получаем данные с AddDataSeries 1 так как DataSeries 0 это текущий ТФ графика.
{
//Value[0] = High[0] - Low[0];
string str = string.Format("ATR={0:0.##} SMA(Range)={1:0.##} Price passed in %={2:00.##}%", ATR(Inputs[1], 90)[0], SMA(Range(Inputs[1]), 90)[0], 100 * (Range(Inputs[1])[0]) / SMA(Range(Inputs[1]), 90)[0]);
Draw.TextFixed(this, "tag1", str, TextPosition.TopLeft);
}
}
вот тут и проверяю есть ли данные во второй датасерииПросто добавить мало, еще нужно с этой Серии получать данные. ))
Код:protected override void OnStateChange() { if (State == State.SetDefaults) { Description = NinjaTrader.Custom.Resource.NinjaScriptIndicatorDescriptionRange; Name = "Volatility"; BarsRequiredToPlot = 0; IsSuspendedWhileInactive = true; DrawOnPricePanel = true; IsOverlay = true; //AddPlot(new Stroke(Brushes.Goldenrod, 2), PlotStyle.Bar, NinjaTrader.Custom.Resource.RangeValue); } else if (State == State.Configure) { AddDataSeries(BarsPeriodType.Minute, 1440); } } protected override void OnBarUpdate() { if(CurrentBars[1] < 0) return; if(BarsInProgress == 1) //Получаем данные с AddDataSeries 1 так как DataSeries 0 это текущий ТФ графика. { //Value[0] = High[0] - Low[0]; string str = string.Format("ATR={0:0.##} SMA(Range)={1:0.##} Price passed in %={2:00.##}%", ATR(Inputs[1], 90)[0], SMA(Range(Inputs[1]), 90)[0], 100 * (Range(Inputs[1])[0]) / SMA(Range(Inputs[1]), 90)[0]); Draw.TextFixed(this, "tag1", str, TextPosition.TopLeft); } }
if(CurrentBars[1] < 0)
return;
Хочу вбросить свои 5 копеек.
Тут говорится о входе в рынок когда % меньше 30-40%, но это в корне не верно т.к. при таком раскладе не известно в какую сторону входить и можно попасть во флет с 80% вероятностью, а почему бы в разворот не заходить при АТР приближающийся к 90-100% и тем более привыкающий 100%. Кто-то скажет, что это ловля ножей, но я скажу, что это самый смак, заходить на разворотах т.к. его проще выловить и понятно в какую сторону входить.
Dengaz, только за одни эти Ваши откровения - Огромная Благодарность!Продолжу свои мыли по поводу его использования.
Пример на CL имеем 11.07.19 на окончание дня (тк вола дневная) вола была 123% ,имеем разворот в этот день. Конечно с запозданием, но на за 10.07 вола была 107%. Плюс использование определенных уровней и еще кое чего мы получаем 12.07 отличный вход на шорт!
Присоединяюсь к пожеланию.было бы неплохо скрины посмотреть