Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Если у вас есть пользовательские ресурсы, которые необходимо настроить до того, как объект
NinjaTrader станет активным и обрабатывает данные, вместо использования метода Initialize ()
теперь вы можете настроить это, как только метод OnStateChange () достигнет состояния
State.Configure:
}
}
Когда ваш объект NinjaTrader завершает работу и вам нужно очистить все пользовательские
ресурсы устройства, вместо использования OnTermination () теперь вы должны очистить эти
ресурсы, как только метод OnStateChange () достигнет состояния State.Terminated:
NinjaTrader ранее использовал свойство Historical bool для уведомления, когда индикатор или
панель стратегии обрабатывались в историческом или реальном времени. Подход NinjaTrader 8
OnStateChange () теперь представил переменную State уровня класса, в которой вы можете
проверить State.Historical или State.Realtime в любом из других методов событий, которые
позволят вам действовать в зависимости от желаемого состояния:
if (myOrder != null)
{
Print(myOrder.OrderState);
Раньше существовали реализации Data Series для конкретных типов (например, IntSeries,
TimeSeries, BoolSeries и т. Д.). Теперь есть только шаблонный класс Series <T>, который можно
использовать в общих чертах и даже позволяет поддерживать дополнительные типы:
Метод DataSeries.Set (), используемый для присвоения значений Data Series или Plot, был
удален, и теперь значения можно сохранять с помощью одного оператора присваивания:
Рисунок
DrawObjects, используемые в NinjaTrader, претерпели ряд изменений:
• Все объекты DrawObject перемещены в отдельное пространство имен NinjaScript.DrawingTools
и правильно известны как DrawingTools.
• Методы рисования, вызываемые из индикаторов или стратегий, были перемещены в новый
статический частичный класс рисования.
• Все методы рисования получили изменение подписи, которое требует, чтобы вы указали
владельца (объект), который нарисовал объект DrawingTool.
• Методы рисования больше не возвращают интерфейс, а скорее экземпляр самого объекта
DrawingTool.
• В методах рисования теперь используется класс System.Windows.Media.Brushes вместо
структуры System.Drawing.Color.
Совет: DrawingTools теперь полностью незащищены, и вы можете просмотреть их исходный
код из папки DrawingTools меню проводника редактора NinjaScript.
// example syntax
Draw.Line(NinjaScriptBase owner, string tag, int startBarsAgo, double startY, int endBarsAgo, double
endY, Brush brush)
// example usage
Draw.Line(this, "tag1", true, 10, Low[0], 0, Brushes.Red);
Поля привязки DrawingTools, такие как «Время» или «Цена» и т. Д., Были перемещены в объект
ChartAnchor, принадлежащий инструменту рисования, а не в прямое поле в интерфейсе
графического объекта. Пожалуйста, обратитесь к документации NinjaTrader 8 за конкретными
изменениями для каждого инструмента рисования:
BackBrush = Brushes.Blue;
Примечание. Для пользовательских объектов Brush важно .Freeze () Brush из-за многопоточной
архитектуры NinjaTrader 8. Обязательно ознакомьтесь с новой информацией об использовании
кистей.
Пространства имен NinjaTrader 7 NinjaTrader.Indicator и NinjaTrader.Strategy были
переименованы и перемещены в единое пространство имен NinjaTrader.NinjaScript.
//This namespace holds indicators in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.Indicators
{
public class MyCustomIndicator : Indicator
{
}
}
//This namespace holds Strategies in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.Strategies
{
public class MyCustomStrategy : Strategy
{
}
}
Вы можете использовать приведенный ниже шаблон в качестве отправной точки для создания
вашего частичного класса. Если вашему частичному классу необходимо наследовать от
родительского класса, вы можете добавить имя желаемого родительского класса после «:»,
чтобы изменить наследование.
namespace NinjaTrader.NinjaScript.Indicators
{
public partial class MyMethods // : parent class to inherit from
{
//Sample method which calculates the delta of two prices
public double calculateDelta(double firstPrice, double secondPrice)
{
return Math.Abs(firstPrice - secondPrice);
}
//Sample method which prints Position information
public void printPositionInfo(Position position)
{
Print(String.Format("{0}: {1} {2} at {3}", position.Instrument, position.Quantity,
position.MarketPosition, position.AveragePrice));
}
}
}
// Use the static calculateDelta method to calculate the difference between the close of each bar
double delta = MyMethods.calculateDelta(Close[0], Close[1]);
Print(delta);
}
Бары с 0 объемом
В предыдущих версиях ядро NinjaTrader было разработано для замены тика с объемом 0 на
объем 1. В результате все тики имели значение объема не менее 1. NinjaTrader 8 удалил эту
политику проектирования и теперь разрешает тики с объемом 0 для обработки. Это изменение
политики может потребовать изменения логики любых настраиваемых типов столбцов,
индикаторов или стратегий, которые ранее могли предполагать, что объем всегда будет
больше 0.
Шаблоны по умолчанию для нескольких серий "Торговые часы"
Поведение по умолчанию в NinjaTrader 8 гарантирует, что серия баров, добавленная в скрипт с
помощью AddDataSeries (), будет использовать тот же шаблон «TradingHours», что и основная
серия, настроенная пользователем. Напротив, поведение NinjaTrader 7 сильно зависело от
ряда переменных. Мы обновили это поведение, чтобы помочь с проблемами согласованности и
синхронизации между несколькими сериями; однако, если ваш скрипт использует два
временных интервала с использованием разных шаблонов торговых часов, вы можете
рассмотреть возможность использования одной из новых перегруженных строк tradingHours,
используемых в AddDataSeries ():
Разнообразный
Все эталонные образцы NinjaTrader 7, размещенные на нашем форуме поддержки, были
обновлены, чтобы продемонстрировать функциональность NinjaTrader 8. Обязательно
ознакомьтесь с разделом справочного образца, чтобы увидеть другие недокументированные
функции и концепции, которые, возможно, не были рассмотрены в справочном руководстве:
Подпись
Переименован
В процессе разработки NinjaTrader 8 одна из наших целей - убедиться, что наша основная
структура соответствует различным стандартам кодирования, установленным в отрасли. В
результате соответствия этим стандартам кодирования многие методы и свойства NinjaTrader
пришлось переименовать. Хотя функциональные возможности этих методов и свойств
остались прежними, мы решили переименовать эти переменные, чтобы следовать соглашению
об именах, зависящему от семантического контекста, которое, как правило, согласовано для
удобства чтения. Мы считаем, что переименование этих свойств и методов более подробно
описывает предполагаемую функцию для разработчика, который может проверять код.
Наибольшее количество изменений произошло в ответ на соглашение об именах для bools, где
теперь они следуют более строгой структуре глагол-прилагательное или глагол-
существительное.
Например:
• Свойство FirstTickOfBar могло быть трудным для точного определения того, что оно
представляет, без необходимости искать документацию. В NinjaTrader 8 это свойство было
переименовано в IsFirstTickOfBar, которое теперь дает этому свойству более удобочитаемое
имя идентификатора, когда вы читаете эту строку кода, как «истинен ли первый тик бара?»
• Другим примером является случай BarsSinceEntry (), который был переименован в
BarsSinceEntryExecution (), который теперь указывает, что этот метод ищет выполнение записи.
• В NinjaTrader 7 иногда были методы или свойства, которые имели общие имена, но ссылались
на разные данные или действия. Например, Add () можно было использовать для ссылки на
добавление DataSeries в сценарий, добавление графика или добавление линии. Чтобы быть
более конкретным, NinjaTrader 8 переименовал их в AddDataSeries (), AddPlot () и AddLine ()
соответственно.
• Могут быть случаи, когда имя свойства или метода изменилось просто потому, что изменился
тип данных, с которыми он взаимодействовал. (например, BarColor против BarBrush)
• Бывают и другие случаи, когда свойства могли использовать излишнюю краткость и были
переименованы для удобства чтения (например, AvgPrice vs AveragePrice).
Это всего лишь несколько примеров многих изменений названий, обнаруженных в NinjaTrader
8, и некоторые из рациональных причин количества этих изменений. Для простоты вы найдете
список всех переименованных свойств в таблице внизу этого документа путем фильтрации по
ключевому слову «Renamed».
Рекомендации по NinjaScript
Best practice
protected override void OnStateChange()
{
// these are the values that show up as default on the UI
if (State == State.SetDefaults)
{
Calculate = Calculate.OnPriceChange;
IsOverlay = false;
Period = 50;
Best practice
[Browsable(false)] // prevents from showing up on the UI property grid
public int Communicator { get; set; }
Best practice
[NinjaScriptProperty] // can now call MyIndicator(20) from another object
public int Period { get; set; }
Best practice
[XmlIgnore] // removes from serialization
public Brush DownBrush
{ get; set; }
Practice to avoid
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
// logic could take longer than desired as the list of indicator names is populated
for (int i = 0; i <= array.length; i ++)
DoWork(i);
Best practice
protected override void OnStateChange()
{
// Complex operations should be delayed to >= State.Configure
if (State == State.Configure)
{
for (int i = 0; i < = array.length; i ++)
DoWork(i);
}
Best practice
// value is always 5, it can be made constant and declared at the class level
private const int multiplier = 5;
// these values can change, may be better to delay setting until State.Configure
private int counter;
private List<int> myList;
Почему: при оптимизации стратегии экземпляры могут или не могут быть переработаны в
зависимости от параметра IsInstantiatedOnEachOptimizationIteration стратегии.
Best practice
// examples of fields which need to be reset
private double myDouble;
private bool myBool;
private DateTime myDateTime;
private Order myOrderObject;
private Brush myBrushObject;
private Array myIntArray;
private List<object> myList;
private SMA mySMAIndicator;
private Series<double> mySeries;
if (myIntArray != null)
Array.Clear(myIntArray, 0, myIntArray.Length);
else
myIntArray = new int[20];
if (myList != null)
myList.Clear();
else
myList = new List<object>();
}
Зачем: Ожидание доступа к объектам, зависящим от рыночных данных, до тех пор, пока
DataLoaded не предотвратит ошибки доступа во всех сценариях
Best practice
protected override void OnStateChange()
{
if (State == State.DataLoaded)
{
// these objects and their related members are not available until State.DataLoaded
Print(Bars.Count);
Print(Instrument.FullName);
Print(BarsPeriod.BarsPeriodType);
Print(TradingHours.TimeZone);
Print(Input);
}
}
Best practice
// these resources depend on bars, wait until State.DataLoaded to instantiated
private EMA myEMA;
private Series<double> mySeries;
private SessionIterator mySessionIterator;
Best practice
protected override void OnStateChange()
{
// wait until at least State.Historical
if (State == State.Historical)
{
// and double check UI object is not null before accessing
if (ChartControl != null)
{
Print(ChartControl.Properties.ChartBackground);
}
}
}
Зачем? По мере обновления основного объекта ордера у NinjaTrader нет специального способа
обновить ваши локально сохраненные ссылки на ордера. Вы можете узнать больше об этом в
теме Advanced Order Handling: переход от исторических ссылок к текущим.
Best practice
protected override void OnStateChange()
{
// one time only, as we transition from historical to real-time
if (State == State.Realtime)
{
// convert any old historical order object references
// to the new live order submitted to the real-time account
if (myOrder != null)
myOrder = GetRealtimeOrder(myOrder);
}
}
Best practice
protected override void OnStateChange()
{
if (State == State.Configure)
{
myObject = new object();
// set a flag to indicator object has been configured
configured = true;
}
Best practice
// checking to ensure chart control is available in all situations
// will help to ensure this logic below does not generate errors at a later time
if(ChartControl != null)
{
myBackgroundBrush = ChartControl.Properties.ChartBackground;
}
Best practice
protected override void OnStateChange()
{
// this logic runs asynchronously to other events
if (State == State.Terminated)
{
myObject = null;
}
}
protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
{
if (myObject == null)
return;
// for safety, always check for null references before attempting to access an object
// even if you have once checked for null references earlier run-time
if (myObject != null)
myObject.DoSomething();
}
Best practice
if (State == State.Historical)
{
if (ChartControl.Properties.EquidistantBarSpacing == true)
{
Draw.TextFixed(this, "error", "This indicator works best with Equidistant BarSpacing set to
false.", TextPosition.BottomRight);
}
}
Best practice
// using a Dispatcher will ensure that the corresponding action executes on the associated thread
this.Dispatcher.InvokeAsync(() =>
{
UserControlCollection.Add(new System.Windows.Controls.TextBlock
{
Text = "\nAdded by the ChartControl Dispatcher."
});
});
Почему: блоки try-catch большего размера могут не только усложнять отладку, но и могут
вызывать проблемы с производительностью во время выполнения.
Practice to avoid
protected override void OnBarUpdate()
{
try
{
// encapsulates entire OnBarUpdate logic
}
catch (Exception ex)
{
// attempt to handle all errors in one catch
}
}
Использование кистей WPF
Если возможно, попробуйте использовать заранее заданную статическую кисть. Если вам
нужно настроить новый объект кисти, обязательно .Freeze () кисть перед ее использованием.
Лучшая практика
// предопределенная кисть
BackBrush = Кисти. Синий;
Best practice
// OnRender is not a market data event; barsAgo pointers are not guaranteed to be in sync
protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
{
Print(mySMA.GetValueAt(CurrentBar));
}
Practice to avoid
// This would run without errors if there were _ONLY_ type HoriztonalLine on the chart
// But you risk a likely 'System.InvalidCastException' when other draw types are in that collection
foreach (HorizontalLine hLine in DrawObjects)
{
Best practice
// Use the base IDrawingTool type and then cast to the desired type within the for loop
foreach (IDrawingTool hLine in DrawObjects)
{
// Note: to prevent further errors, your type casting should be done using the "as" keyword
// Opposed to a direct cast:
// HorizontalLine myLine = (HorizontalLine) hLine;
Best practice
// checking to ensure chart control is available in all situations
// will help to ensure this logic below does not generate errors at a later time
if(ChartControl != null)
{
myBackgroundBrush = ChartControl.Properties.ChartBackground;
}
Best practice
protected override void OnStateChange()
{
// this logic runs asynchronously to other events
if (State == State.Terminated)
{
myObject = null;
}
}
protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
{
if (myObject == null)
return;
// for safety, always check for null references before attempting to access an object
// even if you have once checked for null references earlier run-time
if (myObject != null)
myObject.DoSomething();
}
Инструкции по доказыванию свойств, отличных от ninjascript
Не пытайтесь изменить существующие «Свойства» пользовательского интерфейса в
соответствии с вашими конкретными потребностями. Эти функции доступны для того, чтобы вы
могли читать состояние среды и принимать решения по изменению того, как выполняется ваш
код, но не следует полагаться на изменение настроек от имени пользователя. Хотя эти объекты
из этих классов имеют сеттеры по техническим причинам, вам не следует пытаться изменять
значения с помощью кода. Вместо этого вы должны выдавать предупреждения или
регистрировать ошибки, предлагая пользователям изменить настройки, когда это необходимо:
Почему: NinjaTrader не гарантирует, что запрошенные изменения вступят в силу, а
пользовательские настройки всегда имеют приоритет. Сюда входят определенные
пользователем ChartControl.Properties, ChartBars.Properties и ChartPanel.Properties. Кроме того,
могут быть установлены два разных пользовательских скрипта, которые также пытаются
изменить свойства, на которые вы полагаетесь, что может вызвать конфликты.
Best practice
if (State == State.Historical)
{
if (ChartControl.Properties.EquidistantBarSpacing == true)
{
Draw.TextFixed(this, "error", "This indicator works best with Equidistant BarSpacing set to
false.", TextPosition.BottomRight);
}
}
Best practice
// using a Dispatcher will ensure that the corresponding action executes on the associated thread
this.Dispatcher.InvokeAsync(() =>
{
UserControlCollection.Add(new System.Windows.Controls.TextBlock
{
Text = "\nAdded by the ChartControl Dispatcher."
});
});
Правильная реализация блоков try / catch
Если вы специально не отлаживаете метод, использование блока try-catch должно быть
ограничено определенной областью логики. НЕ пытайтесь обрабатывать всю свою логику
выполнения в одном гигантском блоке try-catch.
Почему: блоки try-catch большего размера могут не только усложнять отладку, но и могут
вызывать проблемы с производительностью во время выполнения.
Practice to avoid
protected override void OnBarUpdate()
{
try
{
// encapsulates entire OnBarUpdate logic
}
catch (Exception ex)
{
// attempt to handle all errors in one catch
}
}
Best practice
// predefined brush
BackBrush = Brushes.Blue;
Best practice
// OnRender is not a market data event; barsAgo pointers are not guaranteed to be in sync
protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
{
Print(mySMA.GetValueAt(CurrentBar));
}
Кастинг безопасно
По возможности избегайте приведения типов и преобразования типов. Приведение из
смешанной коллекции типов также подвержено исключениям, особенно в ситуациях, которые
могут не возникнуть при первоначальном тестировании кода.
Best practice
// Use the base IDrawingTool type and then cast to the desired type within the for loop
foreach (IDrawingTool hLine in DrawObjects)
{
// Note: to prevent further errors, your type casting should be done using the "as" keyword
// Opposed to a direct cast:
// HorizontalLine myLine = (HorizontalLine) hLine;
Practice to avoid
// each time you call the SMA() return method there is a small performance cost
// implied from the time it takes to look up the cached instance
if (Close[0] > SMA(20)[0])
{
Print(SMA(20)[0]);
EnterLongLimit(SMA(20)[0]);
Draw.Dot(this, Time[0].ToString(), false, 0, SMA(20)[0], Brushes.DarkGreen);
}
Best practice
private SMA mySma;
Best practice
protected override void OnBarUpdate()
{
// saving "myDot" creates an additional reference in memory
Dot myDot = Draw.Dot(this, "myDot" + CurrentBar, false, Time[0], Close[0], Brushes.Blue);
if (conditionToRemove)
{
// remove draw object will remove the object from the chart
RemoveDrawObject("myDot");
Best practice
// example of object instantiated which need to be disposed
StreamWriter writer = new StreamWriter("some_file.txt");
Совет: это обычно применимо при использовании ресурсов SharpDX для настраиваемого
рендеринга. Обязательно ознакомьтесь с информацией о лучших методах работы с ресурсами
SharpDX.
Best practice
// get GetPreviousTradingDayEnd() is expensive to look up
// but value only needs to be looked up once a day -> only calcualte on first bar of session
if (Bars.IsFirstBarOfSession)
{
TradingHours.GetPreviousTradingDayEnd(Time[0]);
}
Best practice
// dedicated logic to cache the prior sum on each tick of bar
// While it is a good practice, this can cause problems for bar types which may remove last bar
(see below)
if (IsFirstTickOfBar)
priorSum = sum;
Best practice
// logic below disables first tick of bar caching only on bar types which remove last bar
if (BarsArray[0].BarsType.IsRemoveLastBarSupported)
{
if (CurrentBar == 0)
Value[0] = Input[0];
else
{
double last = Value[1] * Math.Min(CurrentBar, Period);
// render myValue
}
Best practice
private double myValue;
Зачем? Рендеринг следует зарезервировать для визуализации того, что видно на диаграмме.
Выполнение расчетов с индексом бара, который не отображается, может вызвать случайные
всплески потребления ЦП.
Best practice
protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
{
// restricting this loop to only the ChartBars.From/ToIndex limits the loop to only what is visible on
the chart
for (int barIndex = ChartBars.FromIndex; barIndex <= ChartBars.ToIndex; barIndex++)
{
Print(ChartControl.GetSlotIndexByX(barIndex));
}
}
Почему: каждый экземпляр рисованного объекта будет видеть свой собственный OnRender (),
вызываемый для визуализации значений. Если вместо этого вы реализуете пользовательский
рендеринг в своем объекте, вы увидите только один вызов OnRender () для созданной вами
специально созданной графики.
Practice to avoid
protected override void OnBarUpdate()
{
// this would draw a dot on every bar on the chart
// each instance would need to call its own OnRender() method
// not a very efficient use a draw method
Draw.Dot(this, "everyDot" + CurrentBar, false, 0, Close[0], Brushes.Blue);
Best practice
protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
{
// achieves the same effect of drawing a dot on every bar
// but only needs to call your object's OnRender()
for (int index = ChartBars.FromIndex; index <= ChartBars.ToIndex; index++)
{
float price = chartScale.GetYByValue(Close.GetValueAt(index));
float bar = chartControl.GetXByBarIndex(ChartBars, index);
float radius = (float) chartControl.BarWidth;
Почему: OnRender () может вызывать более или менее часто, чем вы ожидали. Использование
ваших собственных обработчиков событий позволяет вам контролировать и изолировать логику
пользовательских событий, которую вы хотите зафиксировать.
Best practice
protected override void OnStateChange()
{
if (State == State.Historical)
{
// subscribe to chart panel mouse down event
if (ChartPanel != null) ChartPanel.MouseDown += DoUserClickedChartPanelEvent;
Practice to avoid
protected override void OnBarUpdate()
{
if (IsFirstTickOfBar && State == State.Realtime)
{
Print("Run some logic before:: " + DateTime.Now);
Thread.Sleep(5000); // sleeping the Instrument thread will have adverse effects on elements
outside of your script!
Print("Run some logic after: " + DateTime.Now);
}
}
Вместо этого попробуйте использовать объект Timer, если вам нужно отложить выполнение
логики.
Best practice
protected override void OnBarUpdate()
{
if (IsFirstTickOfBar && State == State.Realtime)
{
// Instead of Thread.Sleep for, create a timer that runs at the desired interval
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer {Interval = 5000};
Practice to avoid
// depending on how Value[0] was calculated, it could be off by a degree of floating points
// where this logic below would never be true
// e.g., 2050.2499999 vs 2050.50
if (Value[0] == Close[0])
{
// do something
}
Best practice
// you can avoid these precision issues by rewriting the comparison to evaluate within a certain
tolerance.
if (Math.Abs(Value[0] - Close[0]) < TickSize)
{
// do something
}
// You will also see NinjaTrader developed objects use a custom Extension Method
// double.ApproxCompare() which Returns an int based on a Epsilon value:
if (Close[0].ApproxCompare(Value[0]) == 0)
{
// do something
}
Эффективная отладка
Чрезвычайно широкое использование методов Log () и Print () может снизить
производительность вашего ПК, поскольку для обработки каждого из этих вызовов методов
требуется память и время. При запуске пользовательского NinjaScript, особенно при
использовании Calculate = Calculate.OnEachTick, помните, как часто обрабатываются методы
Log () и Print (), поскольку они могут быстро потреблять ресурсы ПК.
• Метод Log () не следует использовать, за исключением критических сообщений, поскольку
каждая запись журнала попадает в журнал Центра управления, который остается активным до
конца дня. Чрезмерное ведение журнала может привести к тому, что огромное количество
памяти будет выделено только для отображения всех сообщений журнала, что означает
меньше памяти для NinjaTrader для выполнения других задач.
• Метод Print () можно использовать более широко, чем метод Log (), но он все же может
снизить производительность, если используется с очень высокой частотой. Рассмотрите
возможность уменьшения печати из вашего скрипта, если вы испытываете замедление при
запуске скрипта.
Режим отладки
Режим отладки следует использовать только в том случае, если вы активно отлаживаете
сценарий и подключены к отладчику.
Зачем? В режиме отладки все файлы в пользовательском проекте будут компилироваться как
«отладочная» сборка, в которой отсутствуют некоторые оптимизации, которые происходят в
процессе компиляции C #. Более эффективно использовать ваши настраиваемые объекты в
сборке «Release» по умолчанию, если вы используете свои сценарии во время производства.
The above dynamic approach will work for primitive types. For instantiating more complex
types / classes though, such as adding a new PriceLevel programmatically to an existing
drawing tool, Reflection would need to used.
Instantiating more complex types such as the PriceLevels class inside of a compiled
assembly
foreach (dynamic dt in DrawObjects.ToList())
{
if(dt.ToString().Equals("NinjaTrader.NinjaScript.DrawingTools.FibonacciRetracements"))
{
Type type = dt.PriceLevels.GetType().GetGenericArguments()[0];
Assembly assembly = type.Assembly;
var pl = assembly.CreateInstance(type.FullName, false, BindingFlags.CreateInstance, null,
new object[] { 55.5, Brushes.Red, 2 }, new System.Globalization.CultureInfo("en-US"), new
object[] {});
dt.PriceLevels.GetType().GetMethod("Add").Invoke(dt.PriceLevels, new object[] { pl } );
this.ForceRefresh();
}
}
▪dynamic / Ошибка выполнения: «Ошибка при вызове метода OnBarUpdate на баре 0:«
NinjaTrader.NinjaScript.DrawingTools.DrawingTool.tag »недоступен из-за уровня защиты»
Дополнительные сведения о том, как сделать это с помощью Visual Studio, см. В
разделе «Среда разработки надстроек» на странице «Обзор разработки надстроек».
Хотя страница посвящена разработке надстроек, предоставленный на ней пример
проекта можно использовать также для разработки других типов NinjaScript.
Экспорт пользовательских инструментов рисования как сборок / DLL
Планируя распространять свои собственные инструменты рисования через сборки,
пожалуйста, поймите, что первостепенное значение имеет реализация собственного
Draw. , чтобы разрешить программному вызову инструмента рисования другими
объектами NinjaScript.
}
Однако, поскольку частичные классы не могут охватывать две сборки, поэтому
настраиваемый не частичный Draw. для вашего инструмента рисования NinjaScript.
}
Экспорт может быть несовместимым с предыдущими версиями.
Экспорт NinjaScript может быть несовместим с предыдущими версиями NinjaTrader.
Известно, что это происходит каждый раз, когда вводится новый тип (например, Enum),
поскольку новые введенные типы не известны предыдущим выпускам NinjaTrader.
Импортировать:
Экспорт
2. Нажимаем «добавить»
3. Используйте раскрывающийся список «Тип», чтобы отфильтровать доступные типы
NinjaScript.
• Это отличный вариант распространения, если ваши проприетарные файлы индикаторов или
стратегий не ссылаются на внешние библиотеки DLL.
• Если ваш собственный индикатор или стратегия ссылается на внешние библиотеки DLL,
рекомендуется создать свой собственный установщик.
1. В окне Центра управления выберите меню Инструменты> Экспорт> NinjaScript ..., чтобы
открыть диалоговое окно «Экспорт NinjaScript».
4. Нажимаем «добавить»
10. Откроется диалоговое окно с файлом, в котором вы можете выбрать место, в котором будет
создан файл для экспорта zip-архива. По умолчанию файл архива NinjaScript (.zip) будет
создан в папке «Мои документы \ <NinjaTrader Folder> \ bin \ Custom \ ExportNinjaScript». .
Примечание. При экспорте защищенной сборки сгенерированный файл .zip совместим как с 32-
битной, так и с 64-битной версиями NinjaTrader.
2. Выберите файл (ы), который вы хотите удалить (MultiSelect можно будет использовать,
удерживая нажатой клавишу Shift при выборе файлов для удаления).
Проблемы с экспортом
Если у вас возникают трудности с экспортом NinjaScript, это может быть связано с одной из
следующих причин:
Если вы получите указанную выше ошибку, вам нужно будет скомпилировать ваш NinjaScript
без ошибок, прежде чем вы сможете экспортировать. Чтобы проверить, не содержит ли ваш
файл NinjaScript ошибок, откройте редактор NinjaScript («Инструмент»> «Редактировать
NinjaScript») и нажмите F5 для компиляции. Если вы пытаетесь проверить стратегию
NinjaScript, созданную с помощью мастера стратегии, вы можете сделать то же самое,
завершив работу мастера и посмотрев, получите ли вы сообщение «Стратегия успешно
сгенерирована».
Если вы получите какие-либо ошибки при компиляции, вам необходимо устранить их перед
экспортом.
4. Добавьте индикатор, на который есть ссылка в ошибке, в список экспорта вместе с вашим
собственным кодом NinjaScript, нажав кнопку>.
5. Нажмите кнопку «Экспорт», чтобы создать файл архива NinjaScript. Если вы снова получите
ту же ошибку, повторяйте эту процедуру, пока вы не добавите все указанные системные
индикаторы и не сможете успешно экспортировать свой собственный NinjaScript.
Хотя файлы .NET DLL скомпилированы, что не позволяет пользователям видеть ваш частный
исходный код, они по-прежнему подвергаются попыткам декомпиляции и обратного
проектирования. Если вам нужен более высокий уровень безопасности, вы можете выбрать
опцию «Защитить скомпилированные сборки», которая добавляет дополнительный уровень
защиты. Этот дополнительный уровень защиты обеспечивается продуктом SecureTeam
Agile.NET, который был лицензирован NinjaTrader и доступен по сниженной цене для защиты
сборок NinjaTrader. Этот продукт заявляет, что полностью останавливает разборку и
декомпиляцию MSIL. Мы сами им пользуемся и очень им довольны.
Если вы хотите использовать Agile.NET для защиты ваших сборок NinjaScript, вам сначала
нужно перейти сюда, чтобы загрузить и приобрести продукт. После установки запустите
автономный продукт Agile.NET один раз, чтобы ввести лицензионную информацию, которую вы
должны были получить при его загрузке. После этого, когда вы используете утилиту NinjaTrader
Export NinjaScript и выбираете опцию «Защитить скомпилированные сборки» для экспорта, она
автоматически защищает вашу сборку NinjaScript с помощью Agile.NET.
Обратите внимание, что эта версия Agile.NET будет работать только для защиты сборок
NinjaScript в NinjaTrader. Если вы хотите защитить другие файлы вне NinjaTrader, рассмотрите
возможность приобретения полной версии Agile.NET у SecureTeam прямо здесь «Защита кода
Agile.NET 6.0». Сборки NinjaScript, защищенные полной версией Agile.NET, также будут
работать в NinjaTrader.
• Один вызов метода в вашем индикаторе NinjaScript или конструкторе стратегии включит
процесс аутентификации.
• Управляйте всеми своими отдельными продуктами или группируйте продукты вместе для
лицензирования.
Соглашения об именах
Пожалуйста, используйте согласованное соглашение об именах для ваших индикаторов и
стратегий. Предлагаем добавить префикс к названию индикатора. Если название вашей
компании - «Hyper», вы можете назвать свои индикаторы, например, «HyperTrend» или
«HyperOscillator».
Пользовательский установщик
Если вы предоставляете собственный установщик, он не должен перезаписывать какие-либо
файлы, развернутые NinjaTrader, и вы должны предоставить возможность удаления, которая
удаляет все установленные файлы.
Порядок распространения
NinjaTrader упрощает распространение полных пакетов для ваших клиентов. Вы можете не
только распространять свои индикаторы и стратегии, но также можете легко развертывать свои
собственные пользовательские сборки, собственные библиотеки DLL, шаблоны диаграмм и
шаблоны Market Analyzer для своих клиентов.
Создание дистрибутива
Чтобы создать пакет распространения, выполните шаги, показанные здесь, для создания
файла экспорта, содержащего ваши индикаторы NinjaScript и / или стратегии.
После завершения использования утилиты экспорта вы найдете дистрибутив в виде файла .zip
в папке «Мои документы \ NinjaTrader 8 \ bin \ Custom \ ExportNinjaScript». Если вы хотите только
распространять свои файлы NinjaScript, то предоставив своим клиентам этот .zip и заставив их
пройти через процесс импорта, он будет установлен на их машинах. Если вы хотите добавить
дополнительные файлы в свой дистрибутив, см. Разделы ниже.
Критично: важно сообщить вашим клиентам, что индикаторы и стратегии NinjaTrader 8 НЕ
обязательно совместимы с NinjaTrader версии 7.
2. Откройте .zip.
3. Добавьте в файл .zip свои сборки и / или файлы DLL в корневой каталог .zip. Эти файлы не
могут находиться за какими-либо дополнительными структурами каталогов и должны
находиться непосредственно в корне архива .zip.
Для пользовательских сборок вам также потребуется добавить в корень архива .zip файл .txt с
именем AdditionalReferences.txt.
3. В Блокноте введите имя вашей пользовательской сборки, а затем сохраните файл как
текстовый файл с именем «AdditionalReferences».
Примечание. Если у вас есть несколько пользовательских сборок для добавления, вы можете
добавить каждое из имен сборок в один и тот же файл AdditionalReferences.txt на новых
строках.
Добавление шаблонов
2. Откройте .zip.
2. Откройте .zip.
2. Откройте .zip.
5. Перейдите в каталог, в котором хранятся ваши файлы. Скопируйте файлы ресурсов, которые
вы хотите распространить, из этого каталога в свой собственный каталог с шага 4 в .zip
Примечание. При изменении архивов .zip, если в вашем приложении-утилите zip есть опция
для сохранения или воссоздания относительных путей, обязательно отключите это, поскольку
это вызовет проблемы при импорте архива в NinjaTrader.
Редактор
Обзор
Редактор NinjaScript - это мощный редактор сценариев, который позволяет создавать
собственные индикаторы, стратегии и любые другие настраиваемые типы NinjaScript,
используемые для улучшения платформы NinjaTrader. Редактор NinjaScript можно открыть,
выбрав меню «Создать» в Центре управления NinjaTrader. Затем щелкните левой кнопкой
мыши по пункту меню «Редактор NinjaScript».
3. Номера строк
Undo Отменить
Copy Копировать
Remove Удалять
References... Рекомендации...
Print Распечатать
Share доля
Свойства и определения
Общий
Window
Обозреватель NinjaScript
Отображение папок
NinjaScript Explorer упорядочит каждый сценарий, установленный в вашей системе, по типу
объекта NinjaScript (индикатор, стратегия, столбец SuperDOM и т. Д.). В каждой папке будут
отображаться следующие сценарии в каждой категории:
1. Дважды щелкните левой кнопкой мыши по сценарию, который вы хотите просмотреть или
отредактировать в текущем окне.
2. Щелкните сценарий правой кнопкой мыши и выберите «Открыть», чтобы просмотреть или
отредактировать сценарий в виде вкладки в текущем окне, или выберите «Открыть в редакторе
NinjaScript», чтобы открыть сценарий в виде вкладки в новом окне.
• Чтобы создать новую папку, просто щелкните правой кнопкой мыши категорию папок
NinjaScript, которую вы хотите упорядочить, выберите «Новая папка» и с помощью клавиатуры
введите определенное пользователем имя для идентификации папки.
Заметки:
Заметки:
3. Переименовать папку можно только в том случае, если все содержащиеся в ней сценарии
закрыты.
Удаление сценария полностью удалит сценарий из вашей системы. Это действие не может
быть отменено.
Заметки:
2. При удалении настраиваемой папки будут удалены все сценарии, содержащиеся в ней.
Игнорирование сценария
Могут возникнуть ситуации, когда в вашей системе установлен специальный сценарий, который
препятствует компиляции других сценариев из-за ошибок. Причина этого в том, что NinjaTrader
будет компилировать ВСЕ пользовательские файлы NinjaScript в одну DLL для повышения
производительности. Если вы обнаружите, что установили сценарий, который выдает ошибки,
которые вы не можете устранить, или вы в настоящее время находитесь в процессе разработки
сценария, который не может быть скомпилирован, вы можете легко проигнорировать эти
файлы из компилятора из редактора NinjaScript.
• Чтобы проигнорировать сценарий, щелкните правой кнопкой мыши имя сценария и выберите
«Исключить из компиляции».
Когда скрипт игнорируется, он будет скрыт в проводнике NinjaScript, чтобы указать, что он не
будет скомпилирован.
Чтобы включить этот сценарий для следующей компиляции, просто щелкните сценарий правой
кнопкой мыши в проводнике NinjaScript и снимите флажок «Исключить из компиляции».
Примечание. Вы не можете исключить заблокированный системный скрипт или папку.
Совет: вы также найдете возможность исключить скрипты из компиляции, щелкнув правой
кнопкой мыши список ошибок, сгенерированных в нижней части редактора NinjaScript.
• Выбор «Исключить из компиляции» игнорирует только выбранный файл NinjaScript.
• Выбор «Исключить все из компиляции» исключает все файлы NinjaScript, в которых в
настоящее время есть ошибки.
Мастер NinjaScript
Обзор дисплея
Фрагменты кода
Фрагменты кода могут предоставить вам полезные шаблоны кода для ускорения процесса
написания кода.
• Щелкнув правой кнопкой мыши и выбрав название меню «Вставить фрагмент кода».
Использование клавиатуры
Введите текст в левом столбце и нажмите клавишу «Tab» в редакторе NinjaScript.
cb CurrentBar
o Open[0]
h High[0]
l Low[0]
v Volume[0]
i Input[0]
c1 Close[1]
o1 Open[1]
h1 High[1]
l1 Low[1]
v1 Volume[1]
i1 Input[1]
Индикаторный график
Арифметика
abs Math.Abs(value)
}
connection(связь) protected override void
OnConnectionStatusUpdate(ConnectionStatus
orderStatus, ConnectionStatus priceStatus)
{
Контрольные отчеты
if if (expression)
{
}
else
{
break;
case value2:
break;
default:
break;
}
Рисунок
сокращенно метод
dap Draw.AndrewsPitchfork(this,
"MyAndrewsPitchfork", false, 10, Close[10], 5,
High[5], 0, Low[5], Brushes.Blue,
DashStyleHelper.Solid, 1);
dfe Draw.FibonacciExtensions(this,
"MyFibonacciExtensions", true, 15, Close[15],
10, Close[10], 5, Close[5]);
dfr Draw.FibonacciRetracements(this,
"MyFibonacciRetracements", false, 10,
Close[10], 0, Close[0]);
dft Draw.FibonacciTimeExtensions(this,
"MyFibonacciTimeExtensions", false, 10,
Close[10], 0, Close[0]);
dh Draw.HorizontalLine(this, "MyHorizontalLine",
Close[0], Brushes.Blue);
dl Draw.Line(this, "MyLine", 10, Close[10], 0,
Close[0], Brushes.Blue);
drx Draw.RegionHighlightX(this,
"MyRegionHighlightX", 10, 0, Brushes.Blue);
dry Draw.RegionHighlightY(this,
"MyRegionHighlightY", High[0], Low[0],
Brushes.Blue, Brushes.Green, 20);
dv Draw.VerticalLine(this, "MyVerticalLine", 0,
Brushes.Blue);
Ошибки компиляции
• Список ошибок компиляции для всех файлов будет отображаться в нижней части редактора
NinjaScript.
3. Описание ошибки.
Ошибка, выделенная значком (6) ниже, показывает, что выражение не закрывается точкой с
запятой. Выражение должно быть:
Intelliprompt
В редакторе NinjaScript вы можете ввести «это». , чтобы открыть список Intelliprompt. Список
содержит все доступные для использования методы (функции) и свойства. Вы можете выбрать
метод или свойство, просто выбрав их с помощью мыши или прокручивая их с помощью
клавиши со стрелкой вверх или вниз. При нажатии клавиши «Tab» или «Enter» код
автоматически вставляется в редактор NinjaScript. Находясь в поле списка, вы можете нажать
любую буквенную клавишу, чтобы быстро перейти к следующему свойству или методу, начиная
с буквы нажатой клавиши.
На изображении ниже:
1. Свойства
2. Метод
Если вы знаете, что хотите получить доступ к методу индикатора Simple Moving Average,
который называется SMA (), и думаете, что он начинается с «SM», введите «SM» и нажмите
CTRL-пробел, чтобы отобразить поле со списком Intelliprompt ниже.
Нажатие CTRL + пробел после любого текста всегда будет
• Вызовите список Intelliprompt со связанными методами и свойствами.
• Автоматически вставлять код, если текст может однозначно идентифицировать метод или
свойство
3. На изображении ниже вы увидите «1 из 3», что означает, что мы смотрим на первую из трех
доступных сигнатур методов. Вы можете просмотреть все доступные подписи, нажимая
клавиши со стрелками вверх и вниз.
Окно вывода
Вывод NinjaScript - это мощный инструмент отладки, который можно использовать для
дальнейшего анализа ценной информации, созданной вашими файлами NinjaScript. Окно
вывода будет отображать данные только в том случае, если другие методы отладки, такие как
Print () или TraceOrders (для стратегий), были настроены в настраиваемом сценарии.
Вы можете открыть окно вывода NinjaScript, перейдя в меню «Создать» и выбрав «Вывод
NinjaScript».
Чтобы включить эту функцию, щелкните правой кнопкой мыши в окне «Вывод» и выберите
пункт меню «Синхронизированная вертикальная прокрутка».
Поиск и выделение
Использование инструмента поиска
Если вы хотите найти определенное значение или текст, отображаемый в окне вывода, вы
можете использовать инструмент «Найти» для выделения и навигации по любым терминам,
которые соответствуют вашему поиску.
Чтобы вызвать меню «Найти», щелкните правой кнопкой мыши в окне «Вывод» и выберите
«Найти» (или используйте сочетание клавиш CTRL + F).
3. При желании установите флажок Учитывать регистр, чтобы искать только те термины,
которые содержат точный текстовый регистр вашего термина (т. Е. Close не будет таким же, как
close).
5. Поиск также выделит любые другие совпадения в окне вывода, которые соответствуют
поиску.
При повторном нажатии кнопки «Найти» поиск в окне «Вывод» будет продолжен, и следующее
совпадение будет выделено.
Совет: Без инструмента поиска вы также можете выделить термины, просто дважды щелкнув
текст в окне вывода. Это приведет к автоматическому поиску выделенного термина и
выделению всех результатов.
Window
The NinjaScript Utilization monitor is opened via a right click in the NinjaScript Output window and will
be mainly used as a diagnostic tool for performance issues.
It will track any NinjaScript objects total resource time from the moment the window was opened:
•NinjaScript Utilization monitor window will not be saved in any workspace file
•NinjaScript Utilization monitor window works across all workspaces using a single window instance
•NinjaScript Utilization monitor window will work even if hidden / non-visible
When using it as debugging aid, it's recommended to focus on the top resource using NinjaScript's,
while absolute total time is negligible.
Also it's important to understand that a resource heavy NinjaScript could be meaning:
a) the NinjaScript may not be coded as efficiently as possible and would be worthwhile to review if
everything has been done to achieve optimal performance
b) it could be doing intense / steady calculations by design and a higher than average resource use
therefore could likely not be avoided.
It should be thought of a gauge to see where likely performance / code optimization time is likely most
wisely spend if the overall performance footprint is to be reduced.
Our support team is trained with this process and is available to assist.
Отладка Visual Studio
Вы можете отлаживать свои объекты NinjaScript с помощью Microsoft Visual Studio. Объекты
NinjaScript компилируются в одну DLL с именем «NinjaTrader.Custom.dll». При отладке для
временного использования создается специальная отладочная DLL с тем же именем, что и
версия выпуска.
Заметки:
• Он будет работать с Visual Studio 2015, 2017 или 2019 - если установлено несколько версий,
будет использоваться самая высокая из них.
Справочник по языку
Плюсы
• Используйте знакомый редактор NinjaScript (если вам неудобно работать с Visual Studio)
Минусы
После импорта надстройку можно запустить через меню «Создать» в Центре управления.
Плюсы
• Используйте Visual Studio или аналогичную IDE для создания решения, связывающего все
файлы проекта вместе.
• Используйте свою среду IDE для создания DLL, а не экспортируйте через NinjaTrader.
Минусы
Если вы используете эту настройку и создаете DLL со своей IDE, среда IDE автоматически
разместит ее там, где она должна быть, и немедленно запустит платформу для тестирования
любых изменений.
Ниже представлен полный проект Visual Studio с такой настройкой. Просто распакуйте
содержимое этого архива в желаемое место, затем откройте решение
«NinjaTraderAddOnProject.sln» в Visual Studio.
Заметки:
• Это решение Visual Studio нельзя импортировать в NinjaTrader. Его необходимо открыть в
Visual Studio.
• Решение нацелено на .NET 4.8 с NinjaTrader Release R23 или выше. Если вы откроете его в
более ранней версии .NET, Visual Studio предложит вам загрузить требуемый SDK более
высокой версии.
Создание собственного окна надстройки
Разработчики NinjaScript могут использовать платформу AddOn для создания автономных
независимых окон для предоставления настраиваемых функций. В фреймворке доступны
вспомогательные классы для создания экземпляров окон в стиле, аналогичном заранее
созданным окнам NinjaTrader, включая знакомые функции, такие как связывание окон,
интерфейс с вкладками и возможность сохранять окно и его состояние в рабочих областях.
Кроме того, общие элементы пользовательского интерфейса WPF и XAML можно использовать
для стилизации и изменения окон с помощью платформы .NET.
Разработка дополнений
Обзор добавлений
Add Ons - это невероятно мощные объекты NinjaScript, которые позволяют создавать
беспрецедентные инструменты, которые легко интегрируются (визуально и функционально) в
NinjaTrader. Опытные программисты могут использовать информацию, доступную через
фреймворк, для создания новых захватывающих окон и утилит, которые могут дать
пользователям невероятное преимущество над рынками.
Как сделать аддоны
Процесс создания надстройки довольно прост, если понимать структуру. Необходимо ответить
на несколько вопросов, чтобы определить, как создать свое дополнение:
1. Где должна быть точка входа для Add On? Например. Следует ли его запускать из меню
Центра управления? Следует ли запускать из графика?
AddOnBase определяет точку входа пользователя, а затем создает обработчик событий для
создания NTWindow. NTWindow вызывает фабрику вкладок, которая затем передает
содержимое NTTabPage в виде вкладок в NTWindow.
Add On
Управление NinjaTrader
CleanUp()
Определение
Отменяет регистрацию LinkControls (IInstrumentProvider IIntervalProvider) и вызывает Cleanup ()
для элементов управления ICleanable на NTTabPage. Переопределите это, например, чтобы
отказаться от подписки на события или выполнить любые другие операции очистки, когда
вкладка закрыта.
AccountSelector
Определение
AccountSelector можно использовать как элемент пользовательского интерфейса, с которым
пользователи могут взаимодействовать для выбора учетных записей.
События и свойства
public MyAddOnTab()
{
/// Примечание: pageContent (не показан в этом примере) - это содержимое страницы
XAML
// Находим селектор аккаунта
XAML
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Tools="clr-namespace:NinjaTrader.Gui.Tools;assembly=NinjaTrader.Gui"
xmlns:AccountPerformance="clr-
namespace:NinjaTrader.Gui.AccountPerformance;assembly=NinjaTrader.Gui"
xmlns:AccountData="clr-namespace:NinjaTrader.Gui.AccountData;assembly=NinjaTrader.Gui"
xmlns:AtmStrategy="clr-
namespace:NinjaTrader.Gui.NinjaScript.AtmStrategy;assembly=NinjaTrader.Gui">
<Grid>
<Tools:AccountSelector x:Name="accountSelector" HorizontalAlignment="Left"
VerticalAlignment="Top"/>
</Grid>
AtmStrategySelector
Определение
AtmStrategySelector - это элемент пользовательского интерфейса, с которым пользователи
могут взаимодействовать для выбора стратегии банкомата.
События и свойства
Примеры
Этот пример демонстрирует, как использовать селектор стратегии ATM и правильно связать
его поведение с переключателями количества вверх / вниз и TIF.
C#
private QuantityUpDown qudSelector;
private TifSelector tifSelector;
private AtmStrategy.AtmStrategySelector atmStrategySelector;
// Обязательно привяжите наш селектор учетной записи к нашему селектору TIF, чтобы
обеспечить правильную работу
tifSelector.SetBinding(TifSelector.AccountProperty, new Binding { Source = accountSelector,
Path = new PropertyPath("SelectedAccount") });
XAML
<AtmStrategy:AtmStrategySelector x:Name="atmStrategySelector" LinkedQuantity="{Binding
ElementName=qudSelector, Path=Value, Mode=OneWay}" Grid.Row="12" Grid.Column="2">
<AtmStrategy:AtmStrategySelector.Margin>
<Thickness Left="{StaticResource MarginButtonLeft}" Top="{StaticResource MarginControl}"
Right="{StaticResource MarginBase}" Bottom="0" />
</AtmStrategy:AtmStrategySelector.Margin>
</AtmStrategy:AtmStrategySelector>
InstrumentSelector
Определение
InstrumentSelector - это элемент пользовательского интерфейса, с которым пользователи могут
взаимодействовать для выбора инструментов. Это можно использовать с привязкой
инструментов между окнами.
События и свойства
Примеры
Этот пример демонстрирует, как использовать селектор инструментов и правильно связать его
поведение со связью окон.
C#
private InstrumentSelector instrumentSelector;
XAML
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Tools="clr-namespace:NinjaTrader.Gui.Tools;assembly=NinjaTrader.Gui"
xmlns:AccountPerformance="clr-
namespace:NinjaTrader.Gui.AccountPerformance;assembly=NinjaTrader.Gui"
xmlns:AccountData="clr-namespace:NinjaTrader.Gui.AccountData;assembly=NinjaTrader.Gui"
xmlns:AtmStrategy="clr-
namespace:NinjaTrader.Gui.NinjaScript.AtmStrategy;assembly=NinjaTrader.Gui">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
IntervalSelector
Определение
IntervalSelector - это элемент пользовательского интерфейса, с которым пользователи могут
взаимодействовать для выбора интервалов. Это можно использовать с интервалом
связывания между окнами.
События и свойства
Примеры
В этом примере показано, как использовать селектор интервала и правильно связать его
поведение с привязкой окон.
C#
private IntervalSelector intervalSelector;
{
// Очистим наши ресурсы
if (intervalSelector != null)
intervalSelector.IntervalChanged -= OnIntervalChanged();
base.Cleanup();
}
XAML
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Tools="clr-namespace:NinjaTrader.Gui.Tools;assembly=NinjaTrader.Gui"
xmlns:AccountPerformance="clr-
namespace:NinjaTrader.Gui.AccountPerformance;assembly=NinjaTrader.Gui"
xmlns:AccountData="clr-namespace:NinjaTrader.Gui.AccountData;assembly=NinjaTrader.Gui"
xmlns:AtmStrategy="clr-
namespace:NinjaTrader.Gui.NinjaScript.AtmStrategy;assembly=NinjaTrader.Gui">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
TifSelector
Определение
TifSelector можно использовать как элемент пользовательского интерфейса, с которым
пользователи могут взаимодействовать для выбора TIF.
События и свойства
Возможные значения:
TimeInForce.Day
TimeInForce.Gtc
TimeInForce.Gtd
TimeInForce.Ioc
TimeInForce.Opg
ППримеры
Этот пример демонстрирует, как использовать селектор TIF и правильно связать его поведение
с селекторами количества вверх / вниз и TIF.
C#
private QuantityUpDown qudSelector;
private TifSelector tifSelector;
private AtmStrategy.AtmStrategySelector atmStrategySelector;
// Обязательно привяжите наш селектор учетной записи к нашему селектору TIF, чтобы
обеспечить правильную работу
tifSelector.SetBinding(TifSelector.AccountProperty, new Binding { Source = accountSelector,
Path = new PropertyPath("SelectedAccount") });
XAML
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Tools="clr-namespace:NinjaTrader.Gui.Tools;assembly=NinjaTrader.Gui"
xmlns:AccountPerformance="clr-
namespace:NinjaTrader.Gui.AccountPerformance;assembly=NinjaTrader.Gui"
xmlns:AccountData="clr-namespace:NinjaTrader.Gui.AccountData;assembly=NinjaTrader.Gui"
xmlns:AtmStrategy="clr-
namespace:NinjaTrader.Gui.NinjaScript.AtmStrategy;assembly=NinjaTrader.Gui">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
QuantityUpDown
Определение
QuantityUpDown можно использовать как элемент пользовательского интерфейса, с которым
пользователи могут взаимодействовать для выбора количества.
События и свойства
Примеры
Этот пример демонстрирует, как использовать селектор количества вверх / вниз и правильно
связать его поведение со стратегией ATM и селекторами TIF.
C#
private QuantityUpDown qudSelector;
private TifSelector tifSelector;
private AtmStrategy.AtmStrategySelector atmStrategySelector;
// Обязательно привяжите наш селектор учетной записи к нашему селектору TIF, чтобы
обеспечить правильную работу
tifSelector.SetBinding(TifSelector.AccountProperty, new Binding { Source = accountSelector,
Path = new PropertyPath("SelectedAccount") });
XAML
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Tools="clr-namespace:NinjaTrader.Gui.Tools;assembly=NinjaTrader.Gui"
xmlns:AccountPerformance="clr-
namespace:NinjaTrader.Gui.AccountPerformance;assembly=NinjaTrader.Gui"
xmlns:AccountData="clr-namespace:NinjaTrader.Gui.AccountData;assembly=NinjaTrader.Gui"
xmlns:AtmStrategy="clr-
namespace:NinjaTrader.Gui.NinjaScript.AtmStrategy;assembly=NinjaTrader.Gui">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
Account
Определение
Класс Account можно использовать для подписки на события, связанные с учетной
записью, а также для доступа к информации, связанной с учетной записью.
if (myAccount != null)
{
// Распечатываем информацию о нашей учетной записи с помощью
индексатора AccountItem
Print(string.Format("Account Name: {0} Connection Name: {1} Cash Value {2}",
myAccount.Name,
myAccount.Connection.Options.Name,
myAccount.Get(AccountItem.CashValue, Currency.UsDollar)
));
All
Определение
Коллекция объектов Account
Стоимость имущества
Коллекция объектов Account
Синтаксис
Счета.Все
Примеры
protected override void OnStateChange()
{
if (State == State.DataLoaded)
{
foreach (Account sampleAccount in Account.All)
Print(String.Format("The account {0} has a {1} unit FX lotsize set", sampleAccount.Name,
sampleAccount.ForexLotSize));
}
}
AccountStatusUpdate
Определение
AccountStatusUpdate можно использовать для подписки на события состояния учетной записи
со всех учетных записей.
Синтаксис
AccountStatusUpdate
Examples
/ * Пример подписки / отказа от подписки на события обновления статуса учетной записи из
надстройки. Концепция может быть перенесена
к любому объекту NinjaScript, над которым вы можете работать. * /
public class MyAddOnTab : NTTabPage
{
public MyAddOnTab()
{
// Подписка на обновления статуса аккаунта
Account.AccountStatusUpdate += OnAccountStatusUpdate;
}
// Этот метод запускается при любом изменении статуса любой учетной записи
private void OnAccountStatusUpdate(object sender, AccountStatusEventArgs e)
{
// Выводим имя и статус учетной записи
NinjaTrader.Code.Output.Process(string.Format("Account: {0} Status: {1}",
e.Account.Name, e.Status), PrintTo.OutputTab1);
}
SimulationAccountReset
Определение
SimulationAccountReset можно использовать для подписки на события сброса учетной записи
моделирования. Эти сбросы происходят всякий раз, когда пользователь вручную сбрасывает
учетную запись, а также когда пользователь перематывает / перематывает соединение
воспроизведения. Когда сброс происходит из-за изменений в подключении воспроизведения,
важно воссоздать запросы панели.
Синтаксис
SimulationAccountRest
Examples
/ * Этот метод запускается при событиях сброса сим-аккаунта. Важно воссоздать запросы
бара
после сброса подключения воспроизведения * /
// Если учетная запись была сброшена из-за перемотки назад / вперед соединения
воспроизведения
if (simAccount != null && simAccount.Provider == Provider.Playback)
{
// Повторяем запросы наших баров здесь
}
}
Синтаксис
AccountItem
Parameters
AccountItem.BuyingPower
AccountItem.CashValue
AccountItem.Commission
AccountItem.ExcessIntradayMargin
AccountItem.ExcessInitialMargin
AccountItem.ExcessMaintenanceMargin
AccountItem.ExcessPositionMargin
AccountItem.Fee
AccountItem.GrossRealizedProfitLoss
AccountItem.InitialMargin
AccountItem.IntradayMargin
AccountItem.LongOptionValue
AccountItem.LookAheadMaintenanceMargin
AccountItem.LongStockValue
AccountItem.MaintenanceMargin
AccountItem.NetLiquidation
AccountItem.NetLiquidationByCurrency
AccountItem.PositionMargin
AccountItem.RealizedProfitLoss
AccountItem.ShortOptionValue
AccountItem.ShortStockValue
AccountItem.SodCashValue
AccountItem.SodLiquidatingValue
AccountItem.UnrealizedProfitLoss
AccountItem.TotalCashBalance
AccountItemUpdate
Определение
AccountItemUpdate используется для подписки на события обновления элементов учетной
записи.
Примечание. Не забудьте отказаться от подписки, если вы больше не пользуетесь подпиской.
Синтаксис
AccountItemUpdate
Example
Cancel()
Определение
Отменяет указанные объекты Order.
Синтаксис
Отмена (заказы IEnumerable <Order>)
Параметры
Examples
CancelAllOrders()
Определение
Отменяет все заказы инструмента.
Синтаксис
CancelAllOrders (инструментальный инструмент)
Parameters
Example
Change()
Определение
Изменяет указанный объект (ы) Заказа.
Синтаксис
Change(IEnumerable<Order> orders)
Параметры
orders Порядок (а) на изменение
Example
Order stopOrder;
stopOrder.StopPriceChanged = stopOrder.StopPrice - 4 *
stopOrder.Instrument.MasterInstrument.TickSize;
Connection
Определение
Указывает подключение к данным, используемое для указанной учетной записи.
Стоимость имущества
Экземпляр класса Connection, содержащий информацию о соединении, используемом для
указанной учетной записи.
Синтаксис
<Account>.Connection
Примеры
Examples
private Account myAccount;
CreateOrder()
Определение
Создает заказ для отправки через Submit ().
Синтаксис
CreateOrder(Instrument instrument, OrderAction action, OrderType orderType, OrderEntry orderEntry,
TimeInForce timeInForce, int quantity, double limitPrice, double stopPrice, string oco, string name,
DateTime gtd, CustomOrder customOrder)
Parameters
OrderAction.Buy
OrderAction.BuyToCover
OrderAction.Sell
OrderAction.SellShort
OrderType.Limit
OrderType.Market
OrderType.MIT
OrderType.StopMarket
OrderType.StopLimit
OrderEntry.Automated
OrderEntry.Manual
TimeInForce.Day
TimeInForce.Gtc
TimeInForce.Gtd
TimeInForce.Ioc
TimeInForce.Opg
Examples
Order stopOrder;
stopOrder = myAccount.CreateOrder(myInstrument, OrderAction.Sell, OrderType.StopMarket,
OrderEntry.Automated, TimeInForce.Day, 1, 0, 1400, "myOCO", "stopOrder",
Core.Globals.MaxDate, null);
Denomination
Определение
Указывает валюту, установленную на счете
Стоимость имущества
Объект Currency, содержащий информацию о деноминации валюты, указанной в указанной
учетной записи.
<Account>.Connection
Examples
Executions
Определение
Коллекция объектов Execution, созданных для указанной учетной записи. Это текущие
выполнения сеансов, которые должны соответствовать запускам, указанным на вкладке
«Выполнения» окна «Данные учетной записи NinjaTrader».
Стоимость имущества
Коллекция объектов Execution
Syntax
<Account>.Executions
Примечание. В настоящее время не существует поддерживаемого метода для получения
истории выполнения из локальной базы данных.
Examples
ExecutionUpdate
Определение
ExecutionUpdate используется для подписки на события обновления выполнения.
Примечание. Не забудьте отказаться от подписки, если вы больше не пользуетесь подпиской.
Syntax
ExecutionUpdate
Examples
Flatten()
Определение
Сглаживает счет на инструменте.
Синтаксис
Flatten(ICollection<Instrument> instruments)
Parameters
Examples
Сгладить один инструмент
Account.Flatten(new [] { Instrument.GetInstrument("ES 12-15") });
Get()
Определение
Возвращает значение AccountItem, например BuyingPower, CashValue и т. Д.
Возвращаемое значение метода
double, представляющее значение запрошенного AccountItem.
Syntax
Get(AccountItem itemType, Cbi.Currency currency)
Parameters
Examples
Name
Определение
Указывает имя указанной учетной записи
Стоимость имущества
Строка, представляющая имя учетной записи.
Syntax
<Account>.Name
Example
private Account myAccount;
Orders
Определение
Коллекция объектов Order, созданная для указанной учетной записи.
Стоимость имущества
Коллекция объектов Order
Syntax
<Account>.Orders
Examples
private Account myAccount;
OrderUpdate
Определение
OrderUpdate можно использовать для подписки на события обновления заказа.
Синтаксис
Заказать обновление
Examples
/ * Пример подписки / отказа от подписки на события обновления заказа из надстройки.
Концепция может быть перенесена
к любому объекту NinjaScript, над которым вы можете работать. * /
public MyAddOnTab()
{
// Find our Sim101 account
lock (Account.All)
account = Account.All.FirstOrDefault(a => a.Name == "Sim101");
// Other required NTTabPage members left out for demonstration purposes. Be sure to add them
in your own code.
}
Positions
Определение
Коллекция объектов Position, созданных для указанной учетной записи.
Стоимость имущества
Синтаксис
Account.Positions
<Account>.Positions
Examples
private Account myAccount;
if (State == State.DataLoaded)
{
lock (myAccount.Positions)
{
Print("Positions in State.DataLoaded:");
PositionUpdate
Определение
PositionUpdate может использоваться для подписки на события обновления позиции.
Синтаксис
PositionUpdate
Examples
/ * Пример подписки / отказа от подписки на события обновления позиции из надстройки.
Концепция может быть перенесена
к любому объекту NinjaScript, над которым вы можете работать. * /
Strategies
Определение
Коллекция объектов StrategyBase, созданных для указанной учетной записи.
Стоимость имущества
Коллекция объектов StrategyBase
Syntax
<Account>.Strategies
Examples
Submit()
Определение
Отправляет указанный объект (ы) Order.
Syntax
Submit(IEnumerable<Order> orders)
Parameters
Examples
Example
private Account myAccount;
if (myAccount != null)
{
// Распечатываем информацию о нашей учетной записи с помощью индексатора
AccountItem
Print(string.Format("Account Name: {0} Connection Name: {1} Cash Value {2}",
myAccount.Name,
myAccount.Connection.Options.Name,
myAccount.Get(AccountItem.CashValue, Currency.UsDollar)
));
BarsRequest
Определение
BarsRequest можно использовать для запроса данных Bars и подписки на события данных Bars
в реальном времени.
Заметки:
Syntax
BarsRequest(Cbi.Instrument instrument, int barsBack)
BarsRequest(Cbi.Instrument instrument, DateTime fromLocal, DateTime toLocal)
Parameters
Методы и свойства
Examples
public MyAddOnTab()
{
// создаем новый запрос баров. Это определит инструмент и диапазон запрашиваемых
баров.
barsRequest = new BarsRequest(Cbi.Instrument.GetInstrument("AAPL"),
DateTime.Now.AddDays(-daysBack), DateTime.Now);
// Запрашиваем бары
barsRequest.Request(new Action<BarsRequest, ErrorCode, string>((bars, errorCode,
errorMessage) =>
{
if (errorCode != ErrorCode.NoError)
{
// Здесь обрабатываются ошибки при запросе баров
NinjaTrader.Code.Output.Process(string.Format("Error on requesting bars: {0}, {1}",
errorCode, errorMessage), PrintTo.OutputTab1);
return;
}
Syntax
MergePolicy
Example
}));
MergePolicy
Определение
Определяет политику слияния запроса баров.
Заметки:
Стоимость имущества
Представляет MergePolicy, используемый для запроса столбцов.
Возможные значения:
Syntax
MergePolicy
Example
}));
Request()
Определение
Выполняет запрос баров для объекта BarsRequest
Syntax
BarsRequest.Request(Action<BarsRequest, ErrorCode, string> callback)
Properties
Example
// Запрашиваем бары
barsRequest.Request(new Action<BarsRequest, ErrorCode, string>((bars, errorCode,
errorMessage) =>
{
if (errorCode != ErrorCode.NoError)
{
// Здесь обрабатываются ошибки при запросе баров
NinjaTrader.Code.Output.Process(string.Format("Error on requesting bars: {0}, {1}",
errorCode, errorMessage), PrintTo.OutputTab1);
return;
}
Connection (Связь)
Определение
Класс Connection можно использовать для отслеживания событий, связанных с подключением,
а также для доступа к информации, связанной с подключением.
ConnectionStatus.Connected
ConnectionStatus.Connecting
ConnectionStatus.ConnectionLost
Состояние подключения.
ConnectionStatus.Disconnected
ConnectionStatus.Connected
ConnectionStatus.Connecting
ConnectionStatus.ConnectionLost
Состояние подключения.
ConnectionStatus.Disconnected
Example
CancelAllOrders()
Definition
Cancels all orders for the specified instrument on the connection.
Syntax
<Connection>.CancelAllOrders(Instrument instrument)
Connect()
Определение
Подключается к соединению.
Syntax
Connection.Connect(ConnectOptions options)
Parameters
if (connectOptions == null)
{
NinjaTrader.Code.Output.Process("Could not connect. No connection found.",
PrintTo.OutputTab1);
return null;
}
return null;
}
catch (Exception error)
{
NinjaTrader.Code.Output.Process("Connect exception: " + error.ToString(),
PrintTo.OutputTab1);
return null;
}
}
ConnectionStatusUpdate
Определение
ConnectionStatusUpdate можно использовать для подписки на события обновления статуса
подключения.
Syntax
ConnectionStatusUpdate
Example
/ * Пример подписки / отказа от подписки на события обновления соединения из надстройки.
Концепция может быть перенесена
к любому объекту NinjaScript, над которым вы можете работать. * /
ConnectionStatusEventArgs eCopy = e;
Disconnect()(Отключить())
Определение
Отключается от передачи данных.
Syntax
<Connection>.Disconnect()
Example
Options
Definition
The connection's configuration options
Properties
Example
Status
Definition
Indicates the current status of the primary data connection.
Properties
<Connection>.Status
Example
private int priceLost;
private int mainLost;
IInstrumentProvider Interface(Интерфейс
IInstrumentProvider)
Examples
public class MyWindowTabPage : NTTabPage, IInstrumentProvider
{
private Instrument instrument;
public MyWindowTabPage()
{
/ * Определяем содержимое для нашей NTTabPage. Мы можем загрузить
свободный XAML для определения элементов управления и макетов
если мы так выберем и здесь.
// Член IInstrumentProvider
public Instrument Instrument
{
get { return instrument; }
set
{
if (instrument != null)
{
// Отказ от подписки на ранее выбранный инструмент
}
if (value != null)
{
// Создаем подписки для вновь выбранного инструмента
}
instrument = value;
Instrument
Для правильной работы привязки инструментов в вашем аддоне необходимо создать
инструмент.
Examples
// Член IInstrumentProvider
public Instrument Instrument
{
get { return instrument; }
set
{
if (instrument != null)
{
// Отказ от подписки на ранее выбранный инструмент
}
if (value != null)
{
// Создаем подписки для вновь выбранного инструмента
}
instrument = value;
IIntervalProvider Interface
Если при создании NTTabPage вы хотите использовать интервальную ссылку, обязательно
реализуйте интерфейс IIntervalProvider.
Examples
public class MyWindowTabPage : NTTabPage, IIntervalProvider
{
public MyWindowTabPage()
{
/ * Определяем содержимое для нашей NTTabPage. Мы можем загрузить свободный
XAML для определения элементов управления и макетов
если мы так выберем и здесь.
// Член IIntervalProvider
public BarsPeriod BarsPeriod { get; set; }
BarsPeriod
Для правильной работы интервальной привязки в вашем Add On необходимо создать
BarsPeriod.
Examples
// Член IIntervalProvider
public BarsPeriod BarsPeriod { get; set; }
INTTabFactory Interface
NTWindow CreateParentWindow();
NTTabPage CreateTabPage(string typeName, bool isNewWindow = false);
Examples
public class MyWindowFactory : INTTabFactory
{
// Член INTTabFactory. Создает родительское окно, содержащее вкладки
public NTWindow CreateParentWindow()
{
return new MyWindow();
}
CreateParentWindow()
Это определяет, какое NTWindow будет создано в качестве родительского окна для нашего Add
On.
Examples
CreateTabPage()
Это определяет, какая NTTabPage создается всякий раз, когда требуется новая вкладка в
нашем родительском окне для нашего Add On.
Examples
// Член INTTabFactory. Создает новые страницы вкладок всякий раз, когда пользователь
нажимает кнопку +
public NTTabPage CreateTabPage(string typeName, bool isNewWindow = false)
{
return new MyWindowTabPage();
}
IWorkspacePersistence Interface
Этот интерфейс содержит два метода и одно свойство, которое должно быть скрыто
реализующим классом:
Examples
public class MyWindow : NTWindow, IWorkspacePersistence
{
// конструктор по умолчанию
public MyWindow()
{
// Определим наш NTWindow. Если мы хотим использовать вкладки в стиле NT, мы
определим это здесь.
// Член IWorkspacePersistence
public WorkspaceOptions WorkspaceOptions { get; set; }
}
Restore()
Restores the window from workspaces.
Examples
// Член IWorkspacePersistence. Требуется для восстановления окна из рабочих областей
public void Restore(XDocument document, XElement)
{
if (MainTabControl != null)
MainTabControl.RestoreFromXElement(element);
}
Save()
Сохраняет окно в рабочие области.
Examples
WorkspaceOptions
Определение
Устанавливает необходимые параметры рабочего пространства.
Заметки:
• Класс WorkspaceOptions включает логику для открытия, закрытия, сохранения и
восстановления рабочих пространств, проверки того, что окна находятся вне экрана, и
установки основных свойств, таких как имя рабочего пространства и текущий статус.
• Свойство WorkspaceOptions необходимо просто объявить в NTWindow, как в примере ниже.
Вся содержащаяся в нем логика обрабатывается автоматически.
Совет. Чтобы получить полный рабочий пример использования этого класса, загрузите базовый
пример AddOn Framework NinjaScript на свой рабочий стол.
Examples
// Член IWorkspacePersistence
public WorkspaceOptions WorkspaceOptions { get; set; }
NTTabPage Class
Здесь можно определить фактическое содержимое вкладок внутри настраиваемого добавления
в NTWindow.
Examples
public class MyWindowTabPage : NTTabPage, NinjaTrader.Gui.Tools.IInstrumentProvider,
IIntervalProvider
{
private Instrument instrument;
public MyWindowTabPage()
{
/ * Определяем содержимое для нашей NTTabPage. Мы можем загрузить свободный
XAML для определения элементов управления и макетов
если мы так выберем и здесь.
// Save any elements you may want persisted. e.g. selected accounts or instruments
}
// IInstrumentProvider member
public Instrument Instrument
{
get { return instrument; }
set
{
if (instrument != null)
{
// Unsubscribe to subscriptions to previously selected instrument
}
if (value != null)
{
// Create subscriptions for the newly selected instrument
}
instrument = value;
// IIntervalProvider member
public BarsPeriod BarsPeriod { get; set; }
}
CleanUp()
Определение
Отменяет регистрацию LinkControls (IInstrumentProvider IIntervalProvider) и вызывает Cleanup ()
для элементов управления ICleanable на NTTabPage. Переопределите это, например, чтобы
отказаться от подписки на события или выполнить любые другие операции очистки, когда
вкладка закрыта.
Примечание. При переопределении Cleanup () настоятельно рекомендуется вызывать
base.Cleanup (), который гарантирует, что любые элементы управления ссылками также будут
отменены. Базовая реализация также будет обрабатывать все элементы управления,
реализующие ICleanable: AccountSelector, AtmStrategySelector, InstrumentSelector,
IntervalSelector, TifSelector.
Syntax
public override void Cleanup()
{
}
Параметры
Этот метод не принимает никаких параметров
Examples
base.Cleanup();
}
GetHeaderPart()
Определение
Указывает имя заголовка вкладки.
Examples
// Член NTTabPage. Требуется для определения названия заголовка вкладки
protected override string GetHeaderPart(string variable)
{
// Определяем текст для имени заголовка вкладки
switch (variable)
{
case "@INSTRUMENT": return Instrument == null ? Resource.GuiNewTab :
Instrument.MasterInstrument.Name;
case "@INSTRUMENT_FULL": return Instrument == null ? Resource.GuiNewTab :
Instrument.FullName;
}
return variable;
}
Restore()
Save()
Сохраняет элементы из нашей NTTabPage в рабочую область (например, выбранные счета или
инструменты)
Examples
Example
// Вместо Print ()
NinjaTrader.Code.Output.Process("my message", PrintTo.OutputTab1);
// Вместо ClearOutputWindow ()
NinjaTrader.Code.Output.Reset()
Использование предупреждений
Вместо Alert () используйте NinjaTrader.NinjaScript.Alert.AlertCallback () для отправки
предупреждения.
Example
// Instead of Alert()
NinjaTrader.NinjaScript.Alert.AlertCallback(NinjaTrader.Cbi.Instrument.GetInstrument("MSFT"), this,
"someId", NinjaTrader.Core.Globals.Now, Priority.High, "message", null, Brushes.Blue,
Brushes.White, 0);
// Instead of ResetAlert()
NinjaTrader.NinjaScript.Alert.ResetAlert("someId");
Разнообразный
Вместо Log () используйте NinjaScript.Log () для отправки сообщения в журналы NinjaTrader.
Совет: как Globals.PlaySound (), так и .SendMail (), указанные выше, также могут использоваться
в обычных объектах NinjaScript, однако это не рекомендуется, поскольку они не будут
игнорировать вызовы вне State.Realtime, которые могут дать неожиданные результаты.
Examples
// Вместо Log ()
NinjaScript.Log("My log message", LogLevel.Error);
// Вместо PlaySound ()
NinjaTrader.Core.Globals.PlaySound(@"C:\mySound.wav");
// Вместо SendMail ()
NinjaTrader.Core.Globals.SendMail("customers@email.com", "cc_these_people@email.com",
"Subject", "Mail body", null);
AlertCallback()
Определение
Создает событие предупреждения, которое должно быть вызвано, указанное строкой «id», и
будет воспроизводиться соответствующий файл .wav, соответствующий параметру
«soundLocation». После срабатывания предупреждения его сообщение отражается в окне
«Журнал предупреждений» на основе кистей фона и переднего плана, предоставленных в
обратном вызове.
Заметки:
2. Метод AlertCallback () - это та же основная функция, что и более простой метод Alert (),
который в качестве альтернативы может использоваться с индикаторами и стратегиями
NinjaScript. AlertCallback () был доступен для использования с надстройками или другими более
продвинутыми вариантами использования.
Syntax
NinjaTrader.NinjaScript.Alert.AlertCallback(Instrument instrument, object source, string id, DateTime
time, Priority priority, string message, string soundLocation, Brush backBrush, Brush foreBrush, int
rearmSeconds)
Предупреждение: ДОЛЖЕН быть предоставлен параметр "id", иначе будет сгенерировано
исключение с нулевым аргументом.
Parameters
Priority.High
Priority.Low
Priority.Middle
Examples
NinjaTrader.NinjaScript.Alert.AlertCallback(NinjaTrader.Cbi.Instrument.GetInstrument("MSFT"), this,
"someId", NinjaTrader.Core.Globals.Now, Priority.High, "message",
NinjaTrader.Core.Globals.InstallDir+@"\sounds\Alert1.wav", new SolidColorBrush(Colors.Blue),
new SolidColorBrush(Colors.White), 0);
RearmAlert()
Определение
Повторно вызывает существующее событие предупреждения с помощью строкового параметра
id, созданного с помощью метода AlertCallback (). Предупреждение, сгенерированное
NinjaScript, может потребоваться повторно после срабатывания предупреждения в зависимости
от параметра rearmSeconds Alert ().
Syntax
NinjaTrader.NinjaScript.Alert.RearmAlert(string id)
Parameters
Examples
if (resetCondition)
{
NinjaTrader.NinjaScript.Alert.ResetAlertRearmById("someId");
resetCondition = false;
}
AtmStrategy
AtmStrategy содержит свойства и методы, используемые для управления стратегиями
банкоматов. При работе с AtmStrategySelector выбранные объекты могут быть переданы
AtmStrategy для получения или изменения их свойств.
Заметки:
1. Чтобы получить полный рабочий пример использования этого класса, загрузите пример
фреймворка, расположенный в нашем обзоре разработки надстроек.
Example
ControlCenter
Определение
ControlCenter - это определенный XAML класс, содержащий макет и свойства окна Control
Center. При изменении окна Центра управления (например, чтобы добавить пункт меню в меню
«Новый» для запуска NTWindow как части надстройки, как показано в примере ниже), общая
ссылка на объект Window может быть приведена к В частности, ControlCenter.
Примечание. Чтобы получить полный рабочий пример использования этого класса, загрузите
пример фреймворка, расположенный в нашем обзоре разработки надстроек.
Example
private NTMenuItem ControlCenterNewMenu;
FundamentalData
Определение
FundamentalData используется для доступа к фундаментальным данным моментальных
снимков и для подписки на события фундаментальных данных.
Properties
Syntax
FundamentalData
Example
public MyAddOnTab()
{
// Подпишемся на фундаментальные данные. Данные снэпшота предоставляются
прямо при подписке
fundamentalData = new FundamentalData(value);
fundamentalData.Update += OnFundamentalData;
MarketData
Определение
MarketData можно использовать для доступа к рыночным данным моментальных снимков и для
подписки на события рыночных данных.
Заметки:
Properties
Syntax
MarketData
Example
public MyAddOnTab()
{
// Подпишемся на рыночные данные. Данные снэпшота предоставляются прямо при
подписке
// Примечание: в этом примере "инструмент" является заполнителем, вам нужно будет
заменить
// с действительным объектом инструмента с помощью различных методов или
доступных свойств в зависимости от
// на типе NinjaScript, с которым вы работаете (например, Bars.Instrument или
Instrument.GetInstrument ()
MarketDepth
Определение
MarketDepth можно использовать для доступа к моментальному снимку глубины рынка и для
подписки на события глубины рынка.
Примечание. Не забудьте отказаться от подписки, если вы больше не пользуетесь подпиской.
Properties
Syntax
MarketDepth
Example
/ * Пример подписки / отказа от подписки на глубину рынка из надстройки. Концепция может
быть перенесена
к любому объекту NinjaScript, над которым вы можете работать. * /
public MyAddOnTab()
{
// Подпишемся на рыночные данные. Данные снэпшота предоставляются прямо при
подписке
// Примечание: в этом примере "инструмент" является заполнителем, вам нужно будет
заменить
// с действительным объектом инструмента с помощью различных методов или
доступных свойств в зависимости от
// на типе NinjaScript, с которым вы работаете (например, Bars.Instrument или
Instrument.GetInstrument ()
// Этот метод запускается при событиях глубины рынка и после обновления данных
моментального снимка.
private void OnMarketDepth(object sender, MarketDepthEventArgs e)
{
// Распечатываем ценовую лестницу Ask
for (int i = 0; i < marketDepth.Asks.Count; i++)
{
NinjaTrader.Code.Output.Process(string.Format("Position: {0} Price: {1} Volume: {2}", i,
marketDepth.Asks[i].Price, marketDepth.Asks[i].Volume), PrintTo.OutputTab1);
}
}
NewsItems
Определение
NewsItems можно использовать для хранения новостных статей.
Properties
Syntax
NewsItems
Example
/ * Пример хранения и доступа к новостям из надстройки. Концепция может быть
перенесена
к любому объекту NinjaScript, над которым вы можете работать. * /
public MyAddOnTab()
{
// Подписка на новости
newsSubscription = new NewsSubscription();
newsSubscription.Update += OnNews;
newsItems = new NewsItems(10);
// Распечатать новости
PrintNews(newsItems);
}
// Этот метод запускается при поступлении новых событий новостей. События старых
новостей не предоставляются при подписке.
private void OnNews(object sender, NewsEventArgs e)
{
// Сохраняем новости
newsItems.Update(e);
}
NewsSubscription
Определение
NewsSubscription можно использовать для подписки на новости.
Properties
Syntax
NewsSubscription
Example
/ * Пример подписки / отказа от подписки на новости от дополнения. Концепция может быть
перенесена
к любому объекту NinjaScript, над которым вы можете работать. * /
public MyAddOnTab()
{
// Подписка на новости
newsSubscription = new NewsSubscription();
newsSubscription.Update += OnNews;
newsItems = new NewsItems(10);
}
// Этот метод запускается при поступлении новых событий новостей. События старых
новостей не предоставляются при подписке.
private void OnNews(object sender, NewsEventArgs e)
{
// Вывести заголовок новости
NinjaTrader.Code.Output.Process(string.Format("ID: {0} News Provider: {1} Headline: {2}",
e.Id,
e.NewsProvider,
e.Headline), PrintTo.OutputTab1);
// Ведение новостей
newsItems.Update(e);
}
Примечание. Чтобы получить полный рабочий пример использования этого класса, загрузите
пример фреймворка, расположенный в нашем обзоре разработки надстроек.
Examples
NTMessageBoxSimple.Show()
Определение
Создает окно окна сообщения.
Syntax
NTMessageBoxSimple.Show(Window input, string messageTxt, string caption, MessageBoxButton
buttonSet, MessageBoxImage icon)
Parameters
Examples
// Создаем окно MessageBox из диаграммы
ChartControl.Dispatcher.InvokeAsync(new Action(() => {
NinjaTrader.Gui.Tools.NTMessageBoxSimple.Show(Window.GetWindow(ChartControl.OwnerChart
as DependencyObject), "Message Body", "Message Header", MessageBoxButton.OK,
MessageBoxImage.None);
}));
// Создание окна MessageBox при нажатии кнопки в надстройке
private void OnMenuItemClick(object sender, RoutedEventArgs e)
{
NinjaTrader.Gui.Tools.NTMessageBoxSimple.Show(Window.GetWindow(e.Source as
DependencyObject), "Message Body", "Message Header", MessageBoxButton.OK,
MessageBoxImage.None);
}
NTWindow
Определение
Класс NTWindow определяет родительские окна для создания пользовательских окон.
Экземпляры NTWindow действуют как контейнеры для экземпляров NTTabPage, в которых
содержатся элементы пользовательского интерфейса и связанная с ними логика.
Заметки:
• Интерфейс IWorkspacePersistance должен быть реализован, если вы хотите, чтобы ваше окно
было сохранено и восстановлено с помощью рабочих пространств NinjaTrader.
Пример
В приведенном ниже примере показано, как создать экземпляр NTWindow, пока:
Совет: Чтобы получить полный рабочий пример использования этого класса, загрузите пример
фреймворка, расположенный в нашем обзоре разработки надстроек.
// TabControl должен быть создан для содержимого окна, если требуются функции вкладки
TabControl tc = new TabControl();
// Член IWorkspacePersistence
public WorkspaceOptions WorkspaceOptions { get; set; }
}
NumericTextBox
NumericTextBox предоставляет функциональные возможности для числовых текстовых полей
для захвата вводимых пользователем данных. Этот элемент пользовательского интерфейса
может быть определен в XAML для надстройки, если это необходимо, с функциональными
возможностями и логикой, связанными с текстовым полем, определенным в C #, как в примерах
ниже.
Примечание. Чтобы получить полный рабочий пример использования этого класса, загрузите
пример фреймворка, расположенный в нашем обзоре разработки надстроек.
Examples
XAML Definition of the UI Element
<! - Создайте сетку для размещения NumericTextBox ->
<Grid>
<! - Определить NumericTextBox ->
<t:NumericTextBox x:Name="daysBackSelector" Text="5" ValueType="{x:Type system:Int32}"
Width="50" Grid.Column="2">
<! - Установить поля для бокса ->
<t:NumericTextBox.Margin>
<Thickness Left="{StaticResource MarginButtonLeft}" Top="{StaticResource
PaddingColumn}" Right="{StaticResource MarginBase}"/>
</t:NumericTextBox.Margin>
</t:NumericTextBox>
</Grid>
OnWindowCreated()
Определение
Этот метод вызывается всякий раз, когда создается новое окно NTWindow. Он будет
вызываться в потоке этого окна. Здесь вы должны установить свой AddOn в существующее
окно или, если вы создаете свое собственное окно, добавить пункт меню в Центр управления
NinjaTrader.
Syntax
OnWindowCreated(Window window)
Parameters
Examples
public class MyWindowAddOn : AddOnBase
{
private NTMenuItem myMenuItem;
private NTMenuItem existingMenuItem;
// Будет вызываться при создании нового NTWindow. Он будет вызываться в потоке этого
окна
protected override void OnWindowCreated(Window window)
{
// Мы хотим разместить ваше дополнение в меню Центра управления
ControlCenter cc = window as ControlCenter;
if (cc == null)
return;
OnWindowDestroyed()
Определение
Этот метод вызывается всякий раз, когда уничтожается новое окно NTWindow. Он будет
вызываться в потоке этого окна. Окно уничтожается либо пользователем, закрывающим окно,
закрывая рабочую область, либо при закрытии NinjaTrader.
Syntax
OnWindowDestroyed(Window window)
Parameters
myMenuItem.Click -= OnMenuItemClick;
myMenuItem = null;
}
}
}
OnWindowRestored()
Определение
Вызывается при восстановлении окна из рабочей области, которая вызывается после
OnWindowCreated (). Этот метод используется для вызова любых пользовательских данных
XElement из рабочей области путем ссылки на окно. См. Также OnWindowSaved () для
получения информации о том, как сохранить пользовательские данные XElement при
сохранении окна.
Syntax
OnWindowRestored(Window window, XElement element)
Parameters
Examples
protected override void OnWindowRestored(Window window, XElement element)
{
Print("OnWindowRestored for " + window.GetHashCode());
OnWindowSaved()
Определение
Вызывается при сохранении окна в рабочей области, которая вызывается перед
OnWindowDestroyed (). Этот метод используется для сохранения любых пользовательских
данных XElement, связанных с вашим окном.
Syntax
OnWindowSaved(Window window, XElement element)
Parameters
window Объект Window, который сохраняется в
рабочей области.
Examples
protected override void OnWindowSaved(Window window, XElement element)
{
Print("OnWindowSaved for " + window.GetHashCode());
// e.g.,
// <SampleAddOn>
// <ButtonState>true</ButtonState>
// </SampleAddOn>
// добавляем новый элемент в рабочую область, который можно будет восстановить позже
element.Add(xml);
StartAtmStrategy()
Определение
StartAtmStrategy можно использовать для отправки ордеров на вход со стратегиями
банкоматов.
Syntax
NinjaTrader.NinjaScript.AtmStrategy.StartAtmStrategy(AtmStrategy atmStrategyTemplate, Order
entryOrder)
NinjaTrader.NinjaScript.AtmStrategy.StartAtmStrategy(string atmStrategyTemplateName, Order
entryOrder)
Properties
Критично: аргумент «name» в методе CreateOrder () ДОЛЖЕН иметь имя «Entry» для успешного
запуска стратегии ATM.
Example
/ * Пример запуска стратегии банкомата из окна Add On. Концепция может быть перенесена
к любому объекту NinjaScript, над которым вы можете работать. * /
public class MyAddOnTab : NTTabPage
{
private Account account;
private Order entryOrder;
public MyAddOnTab()
{
// Находим наш аккаунт Sim101
lock (Account.All)
account = Account.All.FirstOrDefault(a => a.Name == "Sim101");
if (account != null)
{
entryOrder = account.CreateOrder(Cbi.Instrument.GetInstrument("AAPL"),
OrderAction.Buy, OrderType.Market,
TimeInForce.Day, 1, 0, 0, string.Empty, "Entry", null);
StrategyBase
StrategyBase содержит свойства и методы для управления объектом стратегии и является
базовым классом, производным от AtmStrategy.
Примечание. Чтобы получить полный рабочий пример использования этого класса, загрузите
пример фреймворка, расположенный в нашем обзоре разработки надстроек.
Example
lock (accountSelector.SelectedAccount.Strategies)
// Перебираем коллекцию стратегий в выбранной учетной записи
foreach (StrategyBase strategy in accountSelector.SelectedAccount.Strategies)
outputBox.AppendText(string.Format("{0}Name: {1}{0}ATM Template Name: {2}
{0}Instrument: {3}{0}State: {4}{0}Category: {5}{0}",
Environment.NewLine,
strategy.Name,
strategy.Template,
strategy.Instruments[0].FullName,
strategy.State,
strategy.Category));
}
}
PropagateInstrumentChange()
Определение
В NTWindow PropagateInstrumentChange () отправляет инструмент в другие окна с тем же
настроенным цветом привязки инструментов.
Заметки:
• Для использования PropagateInstrumentChange () необходимо определить общедоступное
свойство Instrument, как в примере ниже.
• Чтобы получить полный рабочий пример использования этого класса, загрузите пример
фреймворка, расположенный в нашем обзоре разработки надстроек.
Example
PropagateInstrumentChange(value);
}
}
PropagateIntervalChange()
Определение
В NTWindow PropagateIntervalChange () отправляет интервал другим окнам с тем же
настроенным цветом Interval Linking.
Заметки:
2. Чтобы получить полный рабочий пример использования этого класса, загрузите пример
фреймворка, расположенный в нашем обзоре разработки надстроек.
Example
PropagateIntervalChange(args.BarsPeriod);
}
TabControl
Определение
Класс TabControl предоставляет функциональные возможности для работы с объектами
NTTabPage в NTWindow. TabControl должен быть создан в конструкторе для экземпляра
NTWindow, чтобы настроить окно так, чтобы оно могло размещать вкладки и работать с ними.
Примечание. Чтобы получить полный рабочий пример использования этого класса, загрузите
пример фреймворка, расположенный в нашем обзоре разработки надстроек.
Пример
В приведенном ниже примере мы определяем экземпляр NTWindow, а затем используем
TabControl для выполнения различных задач настройки:
tc.AddNTTabPage(new MyTab());
}
}
TabControlManager
Определение
Класс TabControlManager можно использовать для установки или проверки нескольких свойств
объекта TabControl. Вместо того, чтобы создавать экземпляр объекта TabControlManager, вы
можете использовать общедоступные статические методы класса для установки определенных
свойств для указанного TabControl, как в примере кода ниже.
Примечание. Чтобы получить полный рабочий пример использования этого класса, загрузите
пример фреймворка, расположенный в нашем обзоре разработки надстроек.
Setters
Getters
Example
public AddOnFrameworkWindow()
{
// TabControl должен быть создан для содержимого окна, если требуются функции вкладки
TabControl tc = new TabControl();
Bars Type
Создание настраиваемых типов полосок обеспечивает невероятную гибкость в способе
представления данных на диаграмме. Методы и свойства, описанные в этом разделе,
уникальны для разработки пользовательских типов стержней.
Методы и свойства
AddBar()
Определение
Добавляет новые точки данных для типа столбцов.
Syntax
AddBar(Bars bars, double open, double high, double low, double close, DateTime time, long volume)
AddBar(Bars bars, double open, double high, double low, double close, DateTime time, long volume,
double bid, double ask)
Параметры
Examples
ApplyDefaultBasePeriodValue()
Определение
Устанавливает базовые значения по умолчанию, используемые для BarsPeriod, выбранного
пользователем (например, PeriodValue по умолчанию, DaysToLoad и т. Д.) Для вашего
настраиваемого типа бара.
Parameters
Синтаксис
Вы должны переопределить метод в своем типе столбцов со следующим синтаксисом:
}
Examples
public override void ApplyDefaultBasePeriodValue(BarsPeriod period)
{
// устанавливает значение периода минутных баров по умолчанию равным 1, а дни для
загрузки - 5
if (period.BaseBarsPeriodType == BarsPeriodType.Minute)
{
period.BaseBarsPeriodValue = 1;
DaysToLoad = 5;
}
// устанавливает значение периода тиковых баров по умолчанию на 150, а дни для
загрузки - на 3
else if (period.BaseBarsPeriodType == BarsPeriodType.Tick)
{
period.BaseBarsPeriodValue = 150;
DaysToLoad = 3;
}
ApplyDefaultValue
Определение
Устанавливает значения BarsPeriod по умолчанию, используемые для настраиваемого типа
бара.
Parameters
Синтаксис
Вы должны переопределить метод в своем типе столбцов со следующим синтаксисом:
Examples
public override void ApplyDefaultValue(BarsPeriod period)
{
period.BarsPeriodTypeName = "MyBarType";
period.Value = 1;
}
BuiltFrom
Определение
Определяет базовый набор данных, используемый для построения BarsType (т. Е. Tick, Minute,
Day). Свойство BuiltFrom будет управлять частотой, с которой OnDataPoint () обрабатывает
исторические данные.
Стоимость имущества
Перечисление BarsPeriodType. Будут признаны следующие ценности:
• BarsPeriodType.Tick
• BarsPeriodType.Minute
• BarsPeriodType.Day
Syntax
BuiltFrom
Examples
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Name = "MyCustomBarsType";
BarsPeriod = new BarsPeriod { BarsPeriodType = (BarsPeriodType) 15, BarsPeriodTypeName
= "MyCustomBarsType(15)", Value = 1 };
BuiltFrom = BarsPeriodType.Minute;// обновляем OnDataPoint () каждую минуту на
исторических данных
DaysToLoad = 5;
}
DefaultChartStyle
Определение
Позволяет установить ChartStyle по умолчанию для использования с типом баров NinjaTrader.
Стоимость имущества
Значение ChartStyleTypeÂenum, представляющее ChartStyle, которое будет установлено по
умолчанию. Системные настройки по умолчанию включают:
• ChartStyleType.Box,
• ChartStyleType.CandleStick,
• ChartStyleType.LineOnClose,
• ChartStyleType.OHLC,
• ChartStyleType.PointAndFigure,
• ChartStyleType.KagiLine,
• ChartStyleType.OpenClose,
• ChartStyleType.Mountain
Syntax
DefaultChartStyle
Examples
GetInitialLookBackDays()
Определение
Определяет, сколько дней загружаются данные, когда пользователь делает запрос данных
«назад».
Method Parameters
Синтаксис
Вы должны переопределить метод в своем типе столбцов, используя следующий синтаксис.
public override int GetInitialLookBackDays(BarsPeriod barsPeriod, TradingHours tradingHours, int
barsBack)
{
}
Examples
Совет: попробуйте запросить объем данных, который подходит именно для того, что
необходимо. Запрос слишком большого набора данных приведет к загрузке ненужных данных.
Запрос слишком маленького набора данных приведет к выполнению нескольких запросов.
GetPercentComplete()
Определение
Определяет значение, которое ваш BarsType вернет для Bars.PercentComplete
Method Parameters
Синтаксис
Вы должны переопределить метод в своем типе столбцов, используя следующий синтаксис.
Examples
public override double GetPercentComplete(Bars bars, DateTime now)
{
// Рассчитываем процент завершения для наших месячных баров
if (now.Date <= bars.LastBarTime.Date)
{
int month = now.Month;
int daysInMonth = (month == 2) ? (DateTime.IsLeapYear(now.Year) ? 29 : 28) :
(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 ||
month == 12 ? 31 : 30);
return (daysInMonth - (barsSeries.LastBarTime.Date.AddDays(1).Subtract(now).TotalDays /
barsSeries.BarsPeriod.Value)) /
daysInMonth; // оценка
}
return 1;
}
Icon
Определение
Форма, которая отображается рядом с пунктом меню «Тип полос». Поскольку это стандартный
объект, можно использовать любой тип значка (символы Юникода, пользовательский ресурс
файла изображения, путь геометрии и т. Д.).
Примечание. При использовании символов UniCode сначала убедитесь, что нужные символы
существуют в пакете значков для семейства шрифтов, используемого в NinjaTrader.
Стоимость имущества
Общий виртуальный объект, представляющий значок меню инструментов рисования. Это
свойство доступно только для чтения.
Синтаксис
Вы должны переопределить это свойство, используя следующий синтаксис:
IsRemoveLastBarSupported
Определение
Определяет, может ли тип столбцов использовать метод RemoveLastBar (), если он имеет
значение true, в противном случае будет создано исключение. Типы полос, которые используют
концепцию удаления последней полосы, НЕ МОГУТ использоваться с повтором тиков, и в
результате повтор тика будет отключен в пользовательском интерфейсе, если для
IsRemoveLastBarSupported установлено значение true.
Примечание. Это свойство доступно только для чтения, но может быть переопределено в
настраиваемом типе полосы.
Syntax
IsRemoveLastBarSupported
Стоимость имущества
Логическое значение, определяющее, может ли BarsType удалить последний; значение по
умолчанию - false.
Examples
IsTimeBased
Определение
Используется для обозначения того, что BarsType построен на основе временных столбцов
(день, минута, секунда). Установка этого свойства для настраиваемого типа полосы полезна
для правильных вычислений на основе многих основных данных и логики сеанса, а также
может использоваться сторонними объектами NinjaScript для определения того, как
взаимодействовать с полосами.
Стоимость имущества
bool значение, которое, когда истинно, сообщает другим объектам, что столбцы построены по
времени; по умолчанию установлено значение false.
Syntax
Bars.IsTimeBased
Examples
Установка значений по умолчанию IsTimeBased в настраиваемом типе
BarsType
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Name = "Custom BarsType";
IsTimeBased = true// указывает ядру, что эти бары построены с использованием
времени.
}
}
if (Bars.BarsType.IsTimeBased)
{
// для столбцов, основанных на времени, форматирование только до "секунд"
timeFormat = "HH:mm:ss";
}
// форматируем строку на основе подходящего формата времени
Print(Time[0].ToString(timeFormat));
}
OnDataPoint()
Определение
Вызывается для каждой записи в соответствующем базовом наборе данных, который
используется для построения BarType (т. Е. Для каждого тика, минуты или дня). Метод
OnDataPoint () - это то место, где вы должны настраивать точки данных (значения столбцов)
вашей серии с помощью AddBar () и UpdateBar (). См. Также свойство BuiltFrom.
Заметки:
1. Обработка исторических данных получает одно обновление для каждого базового бара,
определенного свойством BuiltFrom.
3.После перехода в режим реального времени обновления будут вызывать каждый тик,
обрабатываемый ядром.
5. isBar может иметь значение true в случае, если BarsSeries был внутренне скопирован в
другой BarsSeries, и требуется только для IsTimeBased = true BarsTypes (например, Second /
Minute / Day ...).
Method Parameters
Синтаксис
Вы должны переопределить метод в своем типе столбцов, используя
следующий синтаксис.
protected override void OnDataPoint(Bars bars, double open, double high, double low, double
close,
DateTime time, long volume, bool isBar, double bid, double ask)
{
}
Examples
protected override void OnDataPoint(Bars bars, double open, double high, double low,
double close, DateTime time, long volume, bool isBar, double bid, double ask)
{
int minIndex;
RemoveLastBar()
Определение
Удаляет последнюю точку данных для типа столбцов. Могут быть случаи, когда для вашего
настраиваемого типа полосы может потребоваться изменить последние значения,
добавленные для уже закрытой полосы. Вызов RemoveLastBar () удалит последние точки для
этого типа бара и позволит вам вызвать AddBar () с обновленными значениями.
Заметки:
• Чтобы использовать этот метод, метод IsRemoveLastBarSupported должен иметь значение
true.
Syntax
RemoveLastBar(Bars bars)
Parameters
Examples
RemoveLastBar(bars);
SetPropertyName()
Определение
Устанавливает имя свойства по умолчанию для настраиваемой строки, которая будет
отображаться в пользовательском интерфейсе.
Syntax
SetPropertyName(string propertyName, string displayName)
Method Parameters
Example
protected override void OnStateChange()
{
if (State == State.Configure)
{
Properties.Remove(Properties.Find("Stroke", true));
Properties.Remove(Properties.Find("Stroke2", true));
SetPropertyName("UpBrush", "AdvanceBar");
SetPropertyName("DownBrush", "DeclineBar");
}
}
Стоимость имущества
Объект SessionIterator, который используется для расчета информации о торговых днях /
сессиях.
Syntax
SessionIterator
Examples
protected override void OnDataPoint(Bars bars, double open, double high, double low, double close,
DateTime time, long volume, bool isBar, double bid, double ask)
{
// строим итератор сеанса из обновляемого объекта bar
if (SessionIterator == null)
SessionIterator = new SessionIterator(bars);
Print(SessionIterator.ActualTradingDayExchange);
UpdateBar()
Определение
Обновляет точку данных в нашем типе столбцов.
Syntax
UpdateBar(Bars bars, double high, double low, double close, DateTime time, long volumeAdded)
Parameters
Examples
Chart Style
Пользовательские стили диаграмм можно использовать на диаграммах для представления
информации о столбцах в другом визуальном представлении. Методы и свойства, описанные в
этом разделе, уникальны для разработки пользовательских стилей диаграмм. Ниже приведен
указатель свойств и методов, задокументированных для стилей диаграмм.
Methods and Properties
BarWidth
Определение
Раскрашенная ширина полосы ChartStyle. Это значение будет обновляться при изменении
размера ChartControl.
Стоимость имущества
Двойное значение, представляющее текущую ширину полос диаграммы
Syntax
BarWidth
Examples
BarWidthUI
Определение
Значение ширины полосы, отображаемое в пользовательском интерфейсе. Это значение будет
округлено из внутреннего свойства BarWidth, которое обновляется при изменении размера
ChartControl.
Стоимость имущества
Значение типа int, представляющее ширину полос диаграммы, которая может быть
установлена пользователем.
Syntax
BarWidthUI
Examples
ChartStyleType
Определение
Определяет значение уникального идентификатора, используемое для регистрации
настраиваемого стиля ChartStyle. Существует 11 стилей графиков по умолчанию, которые
поставляются с NinjaTrader, которые зарезервированы для таблицы на этой странице в
разделе параметров этой страницы.
Синтаксис
Вы должны привести ChartStyleType из int, используя следующий синтаксис:
(ChartStyleType) 80;
Параметры
Зарезервированные значения перечисления перечислены ниже:
0 Box
1 CandleStick
2 LineOnClose
3 OHLC
4 PointAndFigure
5 KagiLine
6 OpenClose
7 Mountain
8 Volumetric
9 HollowCandleStick
10 Equivolume
Examples
Стоимость имущества
Объект кисти WPF, используемый для рисования полос вниз
Syntax
DownBrush
Example
DownBrushDX
Definition
A SharpDX Brush object used to paint the down bars for the ChartStyle.
Property Value
A SharpDX Brush object used to paint the down bars
Syntax
DownBrushDX
Example
GetBarPaintWidth()
Определение
Возвращает нарисованную ширину полосы диаграммы. Метод GetBarPintWidth () вернет
минимальное значение 1.
Примечание. Это абстрактный метод, необходимый для компиляции объекта ChartStyle. Если
вы не планируете пересчитывать barWidth, просто верните параметр barWidth по умолчанию,
который передается в этом методе. Пожалуйста, смотрите раздел Примеры на этой странице
для получения дополнительной информации.
Синтаксис
Вы должны игнорировать этот метод, используя следующий синтаксис:
}
Method Parameters
Icon
Определение
Фигура, которая отображается рядом с пунктом меню «Стиль диаграммы». Поскольку это
стандартный объект, можно использовать любой тип значка (символы Юникода,
пользовательский ресурс файла изображения, путь геометрии и т. Д.).
Примечание. При использовании символов UniCode сначала убедитесь, что нужные символы
существуют в пакете значков для семейства шрифтов, используемого в NinjaTrader.
Стоимость имущества
Общий виртуальный объект, представляющий значок меню инструментов рисования. Это
свойство доступно только для чтения.
Синтаксис
Вы должны переопределить это свойство, используя следующий синтаксис:
IsTransparent
Определение
Указывает, что полосы в ChartStyle прозрачны.
Стоимость имущества
Логическое значение, которое, когда оно истинно, указывает, что UpBrush, DownBrush и
Stroke.Brush все установлены на прозрачные. Возвращает false, если какой-либо из трех
непрозрачных.
Syntax
IsTransparent
Example
OnRender()
Определение
Управляемый событиями метод, используемый для визуализации содержимого в ChartStyle.
Метод OnRender () вызывается каждый раз при обновлении значений диаграммы. Эти
обновления управляются входящими данными в столбцы диаграммы или пользователем,
вручную взаимодействующим с элементом управления диаграммы или шкалой диаграммы.
Синтаксис
Вы должны переопределить метод в своем ChartStyle, используя следующий синтаксис:
protected override void OnRender(ChartControl chartControl, ChartScale chartScale, ChartBars
chartBars)
{
}
Method Parameters
Examples
protected override void OnRender(ChartControl chartControl, ChartScale chartScale, ChartBars
chartBars)
{
// Логика рендеринга для нашего стиля диаграммы
}
SetPropertyName()
Определение
Устанавливает имя свойства по умолчанию для настраиваемой строки, которая будет
отображаться в пользовательском интерфейсе.
•UpBrush
•DownBrush
•BarWidth
•Stroke
•Stroke2
Example
SetPropertyName("UpBrush", "AdvanceBar");
SetPropertyName("DownBrush", "DeclineBar");
}
}
TransformBrush()
Определение
Масштабирует кисть не сплошного цвета, используемую для рендеринга стиля диаграммы, для
правильного отображения в NinjaTrader.
Примечание. Этот метод не влияет на кисти со сплошным цветом. Вам нужно будет
использовать только кисть с линейным или радиальным градиентом.
Examples
UpBrush
Определение
Объект Brush, используемый для определения цвета рисования полос вверх для ChartStyle.
Стоимость имущества
Объект кисти WPF, используемый для рисования полос вверх
Syntax
UpBrush
Examples
UpBrushDX
Определение
Объект SharpDX Brush, используемый для рисования полос вверх для ChartStyle.
Стоимость имущества
Объект SharpDX Brush, используемый для рисования полос вверх
Syntax
UpBrushDX
Examples
Drawing Tools
AddPastedOffset() Виртуальный метод, который вызывается
каждый раз, когда инструмент рисования
копируется и вставляется в диаграмму.
Method Parameters
Examples
Anchors
Определение
Возвращает настраиваемую коллекцию ChartAnchors, которая будет представлять различные
точки инструмента рисования.
Примечание. Вы должны объявить это свойство вместе с привязками диаграммы,
используемыми в инструменте рисования, который вы планируете использовать для итерации.
Откроется простой перечислитель, который позволит вам перебирать якоря диаграммы,
определенные в этом интерфейсе.
Стоимость имущества
Виртуальный интерфейс IEnumerable, состоящий из ChartAnchors
Синтаксис
Вы должны переопределить это свойство, используя следующий синтаксис:
public override IEnumerable<ChartAnchor> Anchors
{
}
Examples
// определяет привязки диаграммы, используемые для инструмента рисования
public ChartAnchor StartAnchor { get; set; }
public ChartAnchor MiddleAnchor { get; set; }
public ChartAnchor EndAnchor { get; set; }
}
}
Доступные свойства
Syntax
AttachedTo
Examples
if (AttachedTo.AttachedToType == AttachedToType.Indicator)
// сделай что-нибудьуд
ChartAnchor
Определение
Определяет объекты, используемые инструментами рисования, которые представляют собой
точку на диаграмме, где расположен инструмент рисования.
Syntax
class ChartAnchor
Конструкторы
new ChartAnchor() Инициализирует новый экземпляр объекта
ChartAnchor
Examples
CopyDataValues()
Определение
Копирует значения времени и цены ChartAnchor из одного якоря в другое. Сюда входят
значения BarsAgo, SlotIndex, Time, Price и DrawnOnBar. Этот метод полезен для обновления
привязки диаграммы к недавней точке данных, когда пользователь взаимодействует с
привязкой диаграммы на чертеже.
Syntax
<chartAnchor>.CopyDataValues(ChartAnchor toAnchor)
Method Parameters
Examples
DisplayName
Определение
Устанавливает префикс отображаемого имени, используемый для всех свойств привязки
диаграммы.
Стоимость имущества
Строковое значение, используемое для идентификации имени соответствующей привязки.
Значение по умолчанию - null.
Syntax
<ChartAnchor>.DisplayName
Examples
DrawingTool
Определение
Объект DrawingTool, которому принадлежит привязка диаграммы.
Стоимость имущества
Объект IDrawingTool, представляющий владельца привязки диаграммы
Syntax
<ChartAnchor>.DrawingTool
Examples
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Name = "SampleDrawingTool";
MyAnchor = new ChartAnchor();
MyAnchor.DrawingTool = this;
//NinjaTrader.NinjaScript.DrawingTools.SampleDrawingTool
}
else if (State == State.Configure)
{
}
}
DrawnOnBar
Определение
Получает текущее значение столбца, на котором привязка диаграммы нарисована объектом
NinjaScript. Пожалуйста, см. Раздел «Чертеж» для получения дополнительной информации.
Стоимость имущества
Значение типа int - это значение, на котором отображается текущий столбец, привязанный к
диаграмме. Это свойство доступно только для чтения.
Syntax
<ChartAnchor>.DrawnOnBar
Examples
// Размещает текст, если высокий 2419, и печатает, на какой полосе был нарисован текст
if (High[0] == 2419)
{
Text myText = Draw.Text(this, @"Text " + CurrentBar, @"High is 2419" , 0, High[0]);
Print("Text is on bar " + myText.Anchor.DrawnOnBar);
}
GetPoint()
Определение
Возвращает точку данных привязки диаграммы в пикселях устройства.
Syntax
<chartAnchor>.GetPoint(ChartControl chartControl, ChartPanel chartPanel, ChartScale, [bool
pixelAlign])
Method Parameters
Examples
IsBrowsable
Определение
Определяет, видна ли привязка в пользовательском интерфейсе. Если установлено значение
true, значения привязки Y и X можно просмотреть в свойствах объектов чертежа.
Стоимость имущества
Значение типа bool, которое, когда оно истинно, будет отображать значения данных привязки
из свойств рисованного объекта; в противном случае - ложь. Значение по умолчанию - истина.
Syntax
<ChartAnchor>.IsBrowsable
Examples
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
MyAnchor = new ChartAnchor();
MyAnchor.IsBrowsable = true;
}
else if (State == State.Configure)
{
}
}
IsEditing
Определение
Определяет, можно ли редактировать привязку.
Стоимость имущества
Значение типа bool, которое, когда оно истинно, определяет, находится ли привязка диаграммы
в состоянии, в котором ее можно редактировать. По умолчанию - false.
Syntax
<ChartAnchor>.IsEditing
Examples
IsNinjaScriptDrawn
Определение
Указывает, была ли привязка диаграммы нарисована объектом NinjaScript (например,
индикатором или стратегией).
Стоимость имущества
Значение типа bool, которое возвращает true для объекта, было нарисовано другим объектом
NinjaScript; в противном случае - ложь. Это свойство доступно только для чтения.
Syntax
<ChartAnchor>.IsNinjaScriptDrawn
Examples
IsXPropertiesVisible
Определение
Указывает, что свойства X привязки отображаются в пользовательском интерфейсе. Если
установлено значение true, значения X можно просмотреть в свойствах объектов чертежа.
Стоимость имущества
Значение типа bool, которое, когда оно истинно, будет отображать значения данных X (время)
привязки из свойств рисованного объекта; в противном случае - ложь. Значение по умолчанию -
истина.
Syntax
<ChartAnchor>.IsXPropertiesVisibile
Examples
}
}
IsYPropertyVisibile
Определение
Указывает, что свойства Y привязки отображаются в пользовательском интерфейсе. Если
установлено значение true, значения Y можно просмотреть в свойствах объектов чертежа.
Стоимость имущества
Значение типа bool, которое, когда оно истинно, будет отображать значения данных Y (цена)
привязки из свойств рисованного объекта; в противном случае - ложь. Значение по умолчанию -
истина.
Syntax
<ChartAnchor>.IsYPropertyVisibile
Examples
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
MyAnchor = new ChartAnchor();
MyAnchor.IsYPropertyVisibile = true;
}
else if (State == State.Configure)
{
}
}
MoveAnchor()
Определение
Перемещает значения x и y привязки диаграммы от начальной точки на величину дельта-точки.
Syntax
<ChartAnchor>.MoveAnchor(ChartAnchor startDataPoint, ChartAnchor deltaDataPoint, ChartControl
chartControl, ChartPanel chartPanel, ChartScale chartScale, DrawingTool drawingTool)
Method Parameters
Examples
MoveAnchorX()
Определение
Перемещает значение x привязки от начальной точки на величину дельта-точки.
Examples
MoveAnchorY()
Определение
Перемещает значение y привязки от начальной точки на величину дельта-точки.
Возвращаемое значение метода
Этот метод не возвращает значения.
Syntax
<ChartAnchor>.MoveAnchorY(Point startPoint, Point deltaPoint, ChartControl chartControl,
ChartScale chartScale)
Method Parameters
Examples
PriceОп
Определение
Определяет значение цены, по которой рисуется привязка графика.
Стоимость имущества
Двойное значение, представляющее значение цены
Syntax
<ChartAnchor>.Price
Examples
SlotIndex
Определение
Указывает значение ближайшего слота бара, где на графике рисуется привязка. В диаграмме с
одной серией всегда будет равное количество слотов и полос, однако для диаграмм с
несколькими сериями могут быть дополнительные слоты по сравнению с серией столбцов, в
которой находится ваш инструмент рисования.
Стоимость имущества
Двойное значение, представляющее текущий бар.
Примечание: значение индекса столбца представлено как двойное, поскольку это возможно (и
вероятно), что данная привязка диаграммы нарисована между столбцами (то есть, если
пользователь рисует инструмент с отключенным режимом привязки).
Syntax
ChartAnchor.SlotIndex
Examples
П Time
Определение
Определяет значение даты / времени, когда отрисовывается привязка диаграммы.
Стоимость имущества
Значение DateTime, представляющее значение времени
Syntax
<ChartAnchor>.Time
Examples
UpdateFromPoint()
Определение
Обновляет значения x и y привязки из заданной точки (в пикселях устройства).
Syntax
<ChartAnchor>.UpdateFromPoint(Point point, ChartControl chartControl, ChartScale chartScale)
Method Parameters
Examples
еремещает значение y п
ривяз
UpdateXFromPoint()ки о
Определение
Обновляет значение X привязки из заданной точки (в пикселях устройства).
Syntax
<ChartAnchor>.UpdateXFromPoint(Point point, ChartControl chartControl, ChartScale chartScale)
Method Parameters
Examples
UpdateYFromPoint()
Определение
Обновляет значение Y привязки из заданной точки (в пикселях устройства).
Method Parameters
Examples
ConvertToVerticalPixels()
Определение
Используется для преобразования позиции курсора (в пикселях) в пиксели устройства,
представленные на оси Y диаграммы. Этот метод потребуется только в том случае, если
заданное вами значение предоставлено в пиксельной точке WPF (например, точка данных,
используемая в OnMouseDown), но вам потребуется значение в отображаемых пикселях
диаграммы. Это полезно при работе с инструментами рисования и диаграммами, которые
имеют несколько панелей диаграмм.
Syntax
ConvertToVerticalPixels(ChartControl chartControl, ChartPanel chartPanel, double wpfY)
Method Parameters
Examples
CreateAnchor()
Определение
Используется для создания новой привязки диаграммы в указанной точке мыши.
Возвращаемое значение метода
Новый ChartAnchor в указанной точке в пикселях устройства.
Syntax
CreateAnchor(Point point, ChartControl chartControl, ChartScale chartScale)
Method Parameters
Examples
DisplayOnChartsMenus
Определение
Определяет, отображается ли инструмент рисования в меню инструментов рисования
диаграммы.
Стоимость имущества
Значение типа bool, если true, инструмент рисования будет создан в меню инструментов
рисования диаграммы; в противном случае - ложь. Значение по умолчанию - истина.
Syntax
DisplayOnChartsMenus
Examples
Dispose()
Определение
Освобождает все ресурсы устройства, используемые для инструмента рисования.
Синтаксис
Утилизировать ()
Параметры метода
Этот метод не принимает никаких параметров
Examples
DrawingState
Определение
Представляет текущее состояние инструмента рисования для выполнения различных
действий, таких как построение, редактирование или перемещение.
Стоимость недвижимости
Перечисление, представляющее текущее состояние инструмента рисования. Возможные
значения:
Syntax
DrawingState
Examples
DrawnBy
Определение
Представляет объект NinjaScript, создавший объект рисования.
Стоимость имущества
Объект NinjaScript, создавший инструмент рисования; это значение будет нулевым, если
нарисовано пользователем.
Syntax
DrawnBy
Examples
GetAttachedToChartBars()
Определение
Возвращает информацию, относящуюся к базовой серии стержней, к которой
прикреплен инструмент рисования. Если инструмент рисования прикреплен к
индикатору, а не к серии столбцов, будут возвращены серии столбцов индикатора,
используемые для ввода.
Examples
GetClosestAnchor()
// получаем attDefinition
Возвращает ближайшую привязку диаграммы в пределах указанного максимального
расстояния от курсора мыши.
Syntax
GetClosestAnchor(ChartControl chartControl, ChartPanel chartPanel, ChartScale chartScale, double
maxDist, Point point)
Method Parameters
Examples
public override Cursor GetCursor(ChartControl chartControl, ChartPanel chartPanel, ChartScale
chartScale, Point point)
{
// получаем ближайшую привязку к тому месту, где щелкнул пользователь
ChartAnchor closest = GetClosestAnchor(chartControl, chartPanel, chartScale, 10, point);
if (closest != null)
{
// устанавливаем курсор, чтобы указать, что его можно перемещать
return Cursors.SizeNWSE;
}
// в противном случае установите курсор обратно на стрелку
else return Cursors.Arrow;
}
GetCursor()
Определение
Управляемый событиями метод, который вызывается при выборе объекта диаграммы. Этот
метод можно использовать для изменения изображения курсора, используемого в различных
состояниях.
Синтаксис
Вы должны переопределить метод в Инструменте рисования, используя следующий синтаксис:
}
Method Parameters
Examples
GetSelectionPoints()
Определение
Возвращает точки данных объекта диаграммы, с которыми пользователь может
взаимодействовать. Эти точки используются для визуального обозначения того, что объект
диаграммы выбран, и позволяют пользователю манипулировать этим объектом. Этот метод
вызывается только в том случае, если IsSelected имеет значение true.
Синтаксис
Вы должны переопределить метод, используя следующий синтаксис:
public override Point[] GetSelectionPoints(ChartControl chartControl, ChartScale chartScale)
{
Method Parameters
chartControl ChartControl, представляющий ось x
Examples
Icon
Определение
Фигура, которая отображается рядом с пунктом меню «Инструмент рисования». Поскольку это
стандартный объект, можно использовать любой тип значка (символы Юникода,
пользовательский ресурс файла изображения, путь геометрии и т. Д.). Дополнительные
сведения об использовании изображений для создания значков см. На странице
«Использование изображений с настраиваемыми значками».
Примечание. При использовании символов UniCode сначала убедитесь, что нужные символы
существуют в пакете значков для семейства шрифтов, используемого в NinjaTrader.
Стоимость имущества
Общий виртуальный объект, представляющий значок меню инструментов рисования. Это
свойство доступно только для чтения.
Syntax
IgnoresSnapping
Определение
Определяет, будут ли привязки диаграммы инструмента рисования использовать координаты
мыши режима привязки диаграммы.
Стоимость имущества
Логическое значение, при котором инструмент рисования игнорирует привязку; в противном
случае - ложь. По умолчанию установлено значение false.
Syntax
IgnoresSnapping
Examples
}
}
IgnoresUserInput
Определение
Определяет, может ли пользователь щелкнуть инструмент рисования.
Стоимость имущества
Значение типа bool, которое становится истинным, если пользователь не может
взаимодействовать с инструментом рисования; в противном случае - ложь. По умолчанию
установлено значение false.
Syntax
IgnoresUserInput
Examples
}
}
IsAttachedToNinjaScript
Определение
Указывает, прикреплен ли в настоящее время инструмент рисования к объекту NinjaScript
(например, к индикатору или стратегии).
Стоимость имущества
Значение типа bool, которое имеет значение true, если инструмент рисования прикреплен к
объекту NinjaScript; в противном случае - ложь. Это свойство доступно только для чтения.
Syntax
IsAttachedToNinjaScript
Examples
IsGlobalDrawingTool
Определение
Указывает, установлен ли в настоящее время инструмент рисования как глобальный объект
рисования. Глобальные рисованные объекты отображаются на любой диаграмме, которая
соответствует базовому инструменту родительской диаграммы.
Стоимость имущества
Значение типа bool, которое возвращает истину, если инструмент рисования в настоящее
время присоединен как глобальный объект рисования; в противном случае - ложь.
Syntax
IsGlobalDrawingTool
Examples
IsLocked
Определение
Определяет, нужно ли зафиксировать инструмент рисования на месте. Это свойство можно
установить вручную через пользовательский интерфейс или явно с помощью кода.
Стоимость имущества
Значение типа bool, которое имеет значение true, если инструмент рисования заблокирован; в
противном случае - ложь. По умолчанию установлено значение false.
Примечание. Для инструментов рисования, которые рисуются индикатором или стратегией, это
свойство по умолчанию имеет значение true.
Syntax
IsLocked
Examples
IsUserDrawn
Определение
Указывает, был ли инструмент рисования нарисован пользователем вручную, а не программно
нарисован объектом NinjaScript (например, индикатором или стратегией).
Стоимость имущества
Значение типа bool, которое имеет значение true, если рисованный объект был нарисован
вручную; в противном случае - ложь. Это свойство доступно только для чтения
Syntax
IsUserDrawn
Examples
if (IsUserDrawn)
{
// что-то делаем, только если объект нарисован вручную
}
OnBarsChanged()
Определение
Управляемый событиями метод, который вызывается каждый раз при изменении ряда базовых
столбцов для диаграммы, на которой находится инструмент рисования. Например, если
пользователь изменил основной инструмент или временные рамки баров, используемых на
графике.
Синтаксис
Вы должны переопределить этот метод, используя следующий синтаксис:
public override void OnBarsChanged()
{
}
Параметры метода
Этот метод не принимает никаких параметров
Examples
OnMouseDown()
Определение
Управляемый событиями метод, который вызывается каждый раз, когда указатель мыши над
элементом управления диаграммой удерживает нажатой кнопку мыши.
}
Method Parameters
Examples
Синтаксис
Вы должны переопределить метод в Инструменте рисования, используя следующий синтаксис.
public override void OnMouseMove(ChartControl chartControl, ChartPanel chartPanel, ChartScale
chartScale, ChartAnchor dataPoint)
{
Method Parameters
OnMouseUp()
Определение
Метод, управляемый событиями, вызывается каждый раз, когда указатель мыши находится над
элементом управления диаграммой и отпускается кнопка мыши.
Синтаксис
Вы должны переопределить метод, используя следующий синтаксис.
public override void OnMouseUp(ChartControl chartControl, ChartPanel chartPanel, ChartScale
chartScale, ChartAnchor dataPoint)
{
}
Method Parameters
Examples
SupportsAlerts
Определение
Определяет, можно ли использовать инструмент рисования для предупреждений, настроенных
вручную через пользовательский интерфейс.
Стоимость имущества
Логическое значение, которое при истине определяет, что пользователь может настроить
предупреждение на основе этого инструмента рисования; в противном случае - ложь.
ZOrderType
Определение
Определяет порядок, в котором инструмент рисования будет отображаться. Это поможет
контролировать индекс ZOrder между объектами диаграммы.
Стоимость имущества
Перечисление, определяющее тип ZOrder инструмента рисования. Возможные значения:
Syntax
ZOrderType
Examples
Import Type
Могут быть разработаны пользовательские типы импорта данных, позволяющие
импортировать исторические данные из любого формата. В этом разделе описаны два важных
метода обработчика событий:
Methods and Properties
OnNextInstrument()
Определение
Метод OnNextInstrument () вызывается в начале процесса импорта для каждого
импортируемого файла. Этот метод вызывается только после того, как он определит, что файл
содержит допустимый инструмент.
Синтаксис
См. Пример ниже. Мастер кода NinjaScript автоматически сгенерирует для вас синтаксис
метода.
Example
try
{
reader = new StreamReader(FileNames[currentInstrumentIdx]);
}
catch (Exception exp)
{
NinjaScript.Log(FileNames[currentInstrumentIdx], exp.Message, LogLevel.Error);
continue;
}
}
OnNextDataPoint()
Определение
Метод OnNextDataPoint () вызывается для каждой строки данных, содержащихся в
импортируемом файле. Этот метод вызывается только в том случае, если тип импорта
определяет, что файл имеет допустимую точку данных, и будет продолжать вызываться до тех
пор, пока не достигнет конца файла или пока точка данных не станет недействительной.
Example
Indicator
Методы и свойства, описанные в этом разделе, уникальны для разработки пользовательских
индикаторов. Свойства конфигурации индикатора глобально определяют различное поведение
индикаторов. Все свойства имеют значения по умолчанию и могут быть переопределены, задав
их в методе OnStateChange () индикатора.
Совет: См. Также раздел «Общие» для получения дополнительных сведений о методах и
свойствах, которые являются общими для типов NinjaScript.
AddLine()
Определение
Добавляет линейные объекты на график.
Syntax
AddLine(Brush brush, double value, string name)
AddLine(Stroke stroke, double value, string name)
Examples
Defining a single UI configurable static line
[XmlIgnore]
public Brush MyBrush { get; set; }
AreLinesConfigurable
Определение
Определяет, можно ли настроить линии, используемые в индикаторе, из диалогового окна
индикатора.
Стоимость имущества
Логическое значение, которое имеет значение true, если какие-либо линии индикатора можно
настроить; в противном случае - ложь. По умолчанию установлено значение true.
Syntax
AreLinesConfigurable
Examples
Line Class
Определение
Объекты, производные от класса Line, используются для характеристики визуального
отображения (построения) линии осциллятора на графике.
Syntax
Line(Stroke stroke)
Parameters
Lines
Определение
Коллекция, содержащая все объекты Line, которые определяют линии осциллятора
характеристик визуализации индикатора.
Стоимость имущества
Коллекция объектов Line.
Syntax
Lines[int index]
Examples
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
// Строки добавляются в коллекцию Lines по порядку
AddLine(Brushes.Gray, 30, "Lower"); // Сохраняется в строках [0]
AddLine(Brushes.Gray, 70, "Upper"); // Сохраняется в строках [1]
}
}
AddPlot()
Определение
Добавляет объекты графика, которые определяют способ отображения ряда данных
индикатора или стратегии на графике. Когда этот метод вызывается для добавления графика,
создается связанный объект Series <double>, содержащийся в коллекции Values.
Syntax
AddPlot(Brush brush, string name)
AddPlot(Stroke stroke, PlotStyle plotStyle, string name)
Предупреждение: этот метод должен вызываться ТОЛЬКО в методе OnStateChange () во время
State.SetDefaults или State.Configure
Parameters
Возможные значения:
PlotStyle.Bar
PlotStyle.Block
PlotStyle.Cross
PlotStyle.Dot
PlotStyle.Hash
PlotStyle.HLine
PlotStyle.Line
PlotStyle.PriceBox
PlotStyle.Square
PlotStyle.TriangleDown
PlotStyle.TriangleLeft
PlotStyle.TriangleRight
PlotStyle.TriangleUp
stroke Объект Stroke, используемый для построения
графика
Советы:
2. Объекты графика НЕ содержат фактических значений скрипта. Они просто определяют, как
значения скрипта отображаются на диаграмме.
4. Если сценарий вызывает AddPlot () несколько раз, то добавляются несколько серий значений
в соответствии с примером «серии из трех значений» ниже.
6. Графики станут видимыми после того, как будет выполнено значение BarsRequiredToPlot
скрипта. По умолчанию значение 20.
Examples
Индикатор, использующий различные сигнатуры AddPlot ()
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Name = "Examples Indicator";
// Ensures that the width of the PlotStyle.Bar plot matches the width of the data series
Plots[0].AutoWidth = true;
}
}
Индикатор, использующий публичную серию <double> для отображения
графика с понятным именем.
[Browsable(false)]
[XmlIgnore]
public Series<double> MyPlot
{
get { return Values[0]; }
}
[XmlIgnore]
public Brush MyBrush { get; set; }
ArePlotsConfigurable
Определение
Определяет, можно ли настроить графики, используемые в индикаторе, в диалоговом окне
индикатора.
Стоимость имущества
Логическое значение, которое возвращает истину, если любой индикаторный график можно
настроить; в противном случае - ложь. По умолчанию установлено значение true.
Syntax
ArePlotsConfigurable
Examples
Displacement
Определение
Значение смещения, которое сдвигает визуально отображаемое значение индикатора.
Стоимость имущества
Значение типа int, представляющее количество баров назад, на которое нужно смещаться.
Syntax
Displacement
Examples
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Displacement = 2;// Строит значение индикатора 2 бара назад на текущем баре
AddPlot(Brushes.Orange, "SMA");
}
}
PlotBrushes
Определение
Содержит массив объектов цветовой серии, содержащих исторические цвета столбцов. Объект
цветовой серии добавляется к этому массиву при вызове метода AddPlot () в настраиваемом
индикаторе для графиков. Его цель - предоставить доступ к свойству цвета всех полос.
Стоимость имущества
Массив объектов цветовой серии.
Syntax
PlotBrushes[int PlotIndex][int barsAgo]
Examples
protected override void OnStateChange()
{
if(State == State.SetDefaults)
{
Name = "Example Indicator";
// Добавляем два графика
AddPlot(Brushes.Blue, "Upper");
AddPlot(Brushes.Orange, "Lower");
}
}
Стоимость имущества
Коллекция объектов Plot.
Syntax
Plots[int index]
Примечание. В приведенном ниже примере кода изменится цвет всей серии графиков. См.
PlotBrushes для получения информации об изменении вместо этого только определенных
сегментов графика.
Example
Стоимость имущества
Значение типа int, представляющее минимальное количество необходимых столбцов.
Syntax
BarsRequiredToPlot
Examples
DisplayInDataBox
Определение
Определяет, отображаются ли графики в поле данных диаграммы.
Стоимость имущества
Это свойство возвращает истину, если значения графика (графиков) индикатора отображаются
в поле данных диаграммы; в противном случае - ложь. По умолчанию установлено значение
true.
Предупреждение: это свойство должно быть установлено ТОЛЬКО из метода OnStateChange ()
во время State.SetDefaults или State.Configure
Syntax
DisplayInDataBox
Examples
DrawHorizontalGridLines
Определение
Строит горизонтальные линии сетки на панели индикатора.
Стоимость имущества
Это свойство возвращает истину, если на панели индикатора нанесены горизонтальные линии
сетки; в противном случае - ложь. По умолчанию установлено значение true.
DrawOnPricePanel
Определение
Определяет панель диаграммы, отображаемую рисованными объектами.
Стоимость имущества
Это свойство возвращает истину, если индикатор рисует рисованные объекты на ценовой
панели; в противном случае, если установлено значение false, рисованные объекты рисуются
на самой панели индикатора. По умолчанию установлено значение true.
DrawVerticalGridLines
Определение
Строит вертикальные линии сетки на панели индикатора.
Стоимость имущества
Это свойство возвращает истину, если на панели индикатора нанесены вертикальные линии
сетки; в противном случае - ложь. По умолчанию установлено значение true.
Syntax
DrawVerticalGridLines
Examples
IndicatorBaseConverter Class
Определение
Пользовательский класс TypeConverter, обрабатывающий разработанное поведение коллекции
дескрипторов свойств индикатора. Используйте его как базовый класс для любого
настраиваемого TypeConverter, который вы применяете к классу индикатора.
Примечания:
Syntax
public class IndicatorBaseConverter : TypeConverter
Предупреждение. Неспособность применить тип IndicatorBaseConverter к классу индикатора
может привести к непредсказуемому поведению стандартной сетки свойств NinjaTrader WPF.
Совет: общие индикаторные функции, такие как Print (), недоступны для экземпляра
преобразователя типов. Чтобы отладить класс преобразователя типов, вы можете
использовать AddOn Debug Concepts или присоединиться к отладчику (рекомендуется)
Examples
// Это пространство имен содержит индикаторы в этой папке и является обязательным. Не
меняйте это.
namespace NinjaTrader.NinjaScript.Indicators
{
// При применении преобразователя типов вы должны полностью указать имя
[TypeConverter("NinjaTrader.NinjaScript.Indicators.MyCustomConveter")]
public class MyCustomIndicator : Indicator
{
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Name = "MyCustomIndicator";
}
}
PropertyDescriptorCollection propertyDescriptorCollection =
base.GetPropertiesSupported(context)
? base.GetProperties(context, component, attrs) :
TypeDescriptor.GetProperties(component, attrs);
NinjaTrader.Code.Output.Process(property.Name, PrintTo.OutputTab1);
}
// Важно: это должно возвращать истину, иначе преобразователь типов не будет вызываться
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{ return true; }
}
}
}
IsChartOnly
Определение
Если установлено значение true, любой индикатор будет доступен только для построения
графиков - индикаторы с включенным этим свойством, например, не должны отображаться при
вызове в окне SuperDOM или MarketAnalyzer.
Стоимость имущества
Это свойство возвращает истину, если индикатор можно использовать только на графике; в
противном случае - ложь. По умолчанию установлено значение false.
Предупреждение: это свойство должно быть установлено ТОЛЬКО из метода OnStateChange ()
во время State.SetDefaults или State.Configure
Syntax
IsChartOnly
Examples
IsSuspendedWhileInactive
Определение
Предотвращает запуск OnBarUpdate, когда отображение индикаторов не используется.
Включение этого свойства в вашем индикаторе помогает сэкономить циклы ЦП, пока индикатор
приостановлен и не используется пользователем. Как только индикатор перейдет в состояние,
которое больше не будет считаться приостановленным, будут запущены исторические события
OnBarUpdate (), позволяющие индикатору догнать текущие значения в реальном времени.
• Минимизированная диаграмма
• Свернутый SuperDOM
Стоимость имущества
Это свойство возвращает истину, если индикатор может использовать оптимизацию
приостановки; в противном случае - ложь. По умолчанию установлено значение false.
Examples
Определение
Если true, любые значения графиков индикатора отображают ценовые маркеры по оси Y.
Стоимость имущества
Это свойство возвращает истину, если значения графика индикатора отображаются по оси Y; в
противном случае - ложь. По умолчанию установлено значение true.
Syntax
PaintPriceMarkers
Examples
ShowTransparentPlotsInDataBox
Определение
Определяет, отображаются ли значения графиков, для которых установлена прозрачная кисть,
в поле данных диаграммы. Поведение по умолчанию - скрыть все графики, которые были
настроены как прозрачная кисть, однако это поведение можно изменить, установив для
ShowTransparentPlotsInDataBox значение true на индикаторе.
Стоимость имущества
Это свойство возвращает значение true, если значения прозрачных графиков индикаторов
отображаются в поле данных графика; в противном случае - ложь. По умолчанию установлено
значение false.
Предупреждение: это свойство должно быть установлено ТОЛЬКО из метода OnStateChange ()
во время State.SetDefaults или State.Configure
Syntax
ShowTransparentPlotsInDataBox
Examples
В этой секции
Стоимость имущества
Строка, представляющая текст для отображения в столбце
Syntax
CurrentText
Example
CurrentValue
Определение
Значение, которое будет отображаться в столбце Market Analyzer.
Стоимость имущества
Двойное значение, представляющее значение, которое будет отображаться в столбце
Syntax
CurrentValue
Example
DataType
Определение
Определяет тип данных, отображаемых в столбце Market Analyzer.
Syntax
DataType
Example
FormatDecimals
Определение
Округляет значение, содержащееся в CurrentValue, до указанного количества десятичных
знаков перед отображением его в столбце Market Analyzer.
Стоимость имущества
Тип int, представляющий количество десятичных знаков, до которых округляется CurrentValue.
Syntax
FormatDecimals
Example
IsEditable
Определение
Определяет, доступен ли столбец Market Analyzer для редактирования.
Стоимость имущества
Это свойство возвращает true, если столбец Market Analyzer можно редактировать; в противном
случае - ложь.
Syntax
IsEditable
Example
OnRender()
Определение
Используется для рисования настраиваемого содержимого в столбце анализатора рынка,
например графика.
Синтаксис
Вы должны переопределить метод в столбце Market Analyzer, используя следующий синтаксис:
protected override void OnRender(DrawingContext dc, System.Windows.Size renderSize)
{
Method Parameters
Совет: чтобы принудительно вызвать OnRender () при определенном условии, вызовите метод
OnPropertyChanged (), который заставит перерисовать весь столбец. Этот подход следует
использовать вместо прямого вызова OnRender ().
Examples
PriorValue
Определение
Содержит последнее значение CurrentValue. PriorValue присваивается значение CurrentValue
непосредственно перед обновлением CurrentValue.
Стоимость имущества
Двойное значение, содержащее последнее значение, содержащееся в CurrentValue перед его
последним обновлением.
Syntax
PriorValue
Example
Optimization Fitness
При оптимизации можно использовать настраиваемые параметры оптимизации, чтобы помочь
вам выбрать настраиваемые показатели, по которым может быть измерена ваша стратегия.
Методы и свойства, описанные в этом разделе, уникальны для пользовательской разработки
Optimization Fitness.
В этой секции
OnCalculatePerformanceValue()
Определение
Этот метод вычисляет значение пригодности для оптимизации.
Syntax
protected override void OnCalculatePerformanceValue(StrategyBase strategy)
{
}
Examples
Value
Определение
Значение, по которому будет рассчитываться оптимизация при использовании этого
приспособления для оптимизации.
Стоимость имущества
Двойное значение.
Syntax
Value
Examples
Optimizer
Пользовательские оптимизаторы можно использовать для оптимизации вашей стратегии с
помощью различных алгоритмов. Это может позволить вам пойти на компромисс, например,
возможность быстро найти адекватные результаты, а не пытаться найти абсолютно лучший
результат, но с помощью трудоемкого процесса. Методы и свойства, описанные в этом
разделе, уникальны для разработки пользовательского оптимизатора.
В этой секции
NumberOfIterations
Определение
Сообщает анализатору стратегии, сколько итераций оптимизации ему необходимо сделать.
Стоимость имущества
Значение типа int.
Syntax
NumberOfIterations
Examples
OnOptimize()
Определение
Этот метод необходимо переопределить, чтобы оптимизировать стратегию. Этот метод
вызывается один раз за прогон оптимизации (не один раз за итерацию).
Синтаксис
Вы должны переопределить метод в оптимизаторе, используя следующий синтаксис.
}
Examples
// Логика оптимизатора
}
OptimizationParameters
Определение
Параметры оптимизации, выбранные для прогона оптимизации. (например, параметры
пользователя или ряд данных)
Стоимость имущества
Логическое значение.
Syntax
Strategies[0].OptimizationParameters
Examples
RunIteration()
Определение
Выполняет итерацию тестирования на истории для оптимизатора.
Возвращаемое значение метода
Этот метод не возвращает значения.
Syntax
RunIteration()
Examples
SupportsMultiObjectiveOptimization
Определение
Сообщает анализатору стратегии, может ли этот оптимизатор выполнять многоцелевые
оптимизации.
Стоимость имущества
Логическое значение.
Syntax
SupportsMultiObjectiveOptimization
Examples
Performance Metrics
Пользовательские показатели эффективности можно использовать при создании статистики
эффективности торговли.
После создания настраиваемых показателей производительности обязательно разрешите их
использование в меню «Инструменты»> «Параметры»> «Общие», иначе они не будут доступны
в окнах «Анализатор стратегий» или «Эффективность торговли».
В этой секции
Format()
Определение
Этот метод позволяет вам настроить отображение значения производительности в итоговой
сетке.
Syntax
public override string Format(object value, Cbi.PerformanceUnit unit, string propertyName)
{
}
Examples
OnAddTrade()
Определение
Этот метод вызывается при добавлении каждой сделки. Вы можете добавить сюда любую
произвольную математику, которую захотите.
Examples
Examples
protected override void OnCopyTo(PerformanceMetricBase target)
{
// Вам нужно преобразовать, чтобы получить доступ к нужному типу
SampleCumProfit targetMetrics = (target as SampleCumProfit);
if (targetMetrics != null)
Array.Copy(Values, targetMetrics.Values, Values.Length);
}
OnMergePerformanceMetric()
Определение
Этот метод вызывается, когда показатели производительности будут агрегированы и
объединены (например, в итоговой строке анализатора стратегий).
Syntax
protected override void OnMergePerformanceMetric(PerformanceMetricBase merge)
{
Examples
PerformanceUnit
Определение
Перечисление, определяющее каждый тип PerformanceUnit, вычисляемый NinjaTrader.
Используется для хранения значения этого типа производительности в PerformanceMetrics.
Syntax
PerformanceUnit.Currency
PerformanceUnit.Percent
PerformanceUnit.Pips
PerformanceUnit.Points
PerformanceUnit.Ticks
Examples
Values
Определение
Массив Values содержит 5 значений, соответствующих каждому Cbi.PerformanceUnit. Затем
NinjaTrader получит доступ к свойству Values, чтобы отобразить рассчитанную метрику
производительности в пользовательском интерфейсе. Вы также можете получить доступ к этим
показателям производительности для стратегии NinjaScript.
Syntax
public double[] Values
{ get; private set; }
Расчет значений на примере OnAddTrade
protected override void OnAddTrade(Cbi.Trade trade)
{
Values[(int)Cbi.PerformanceUnit.Currency] += trade.ProfitCurrency;
Values[(int)Cbi.PerformanceUnit.Percent] = (1.0 + Values[(int)Cbi.PerformanceUnit.Percent])
* (1.0 + trade.ProfitPercent) - 1;
Values[(int)Cbi.PerformanceUnit.Pips] += trade.ProfitPips;
Values[(int)Cbi.PerformanceUnit.Points] += trade.ProfitPoints;
Values[(int)Cbi.PerformanceUnit.Ticks] += trade.ProfitTicks;
}
private set;
}
Share Service
Пользовательские службы общего доступа могут быть разработаны для того, чтобы
пользователи могли обмениваться контентом из приложения NinjaTrader на различных веб-
сайтах и в социальных сетях через диалоговое окно «Службы совместного использования».
NinjaTrader 8 поставляется с предварительно настроенными службами обмена для Twitter,
StockTwits и адаптером электронной почты, однако пользовательский адаптер может быть
разработан для любого веб-сайта, форума или сети социальных сетей, следуя их
общедоступной документации и руководствам по API.
В этой секции
CharacterLimit
Определение
Определяет максимальное количество символов, разрешенное социальной сетью. Подпись,
текст и ссылки вносят вклад в это количество символов, отображаемое в окне общего доступа.
Значение int.MaxValue не определяет практического ограничения и заставляет счетчик
символов не отображаться в окне общего доступа.
Стоимость имущества
Значение типа int, которое представляет максимальное количество символов, разрешенное
социальной сетью.
Syntax
CharacterLimit
Examples
CharactersReservedPerMedia
Определение
Устанавливает допустимое количество символов при прикреплении изображения, чтобы
обеспечить правильное вычисление количества символов.
Примечание. Социальные сети, такие как Twitter или StockTwits, которые ограничивают
количество символов для каждого сообщения, будут иметь определенное количество
символов, которые зарезервированы при прикреплении изображения или другого носителя.
Стоимость имущества
Значение типа int, представляющее количество символов, зарезервированных при
прикреплении изображения или другого носителя.
Icon
Определение
Форма, которая отображается в окне «Поделиться» при публикации содержимого. Поскольку
это стандартный объект, можно использовать любой тип значка (символы Юникода,
пользовательский ресурс файла изображения, путь геометрии и т. Д.). Дополнительные
сведения об использовании изображений для создания значков см. На странице
«Использование изображений с настраиваемыми значками».
Примечание. При использовании символов UniCode сначала убедитесь, что нужные символы
существуют в пакете значков для семейства шрифтов, используемого в NinjaTrader.
Стоимость имущества
Общий виртуальный объект, представляющий значок меню инструментов рисования. Это
свойство доступно только для чтения.
Синтаксис
Вы должны переопределить это свойство, используя следующий синтаксис:
UseOAuth
Определение
Если для этого свойства установлено значение true, в диалоговом окне для настройки адаптера
появится кнопка «Подключить», которая будет вызывать OnAuthorizeAccount (), когда
пользователь щелкает ее.
Стоимость имущества
Логическое значение, определяющее, следует ли вызывать метод OnAuthorizeAccount () для
авторизации учетной записи в социальной службе.
Syntax
UseOAuth
Examples
IsConfigured
Определение
Устанавливается, когда служба общего доступа настроена правильно. Обычно это
устанавливается после авторизации учетной записи, после чего адаптер позволяет
пользователю обмениваться контентом с службой совместного использования.
IsConfigured = true;
}
IsDefault
Определение
Устанавливает службу общего доступа по умолчанию, используемую при выборе типа службы
общего доступа (электронная почта, Twitter и т. Д.).
Например, если вы используете два разных адаптера Twitter, вы можете установить один из
них по умолчанию, когда пользователь выбирает службу общего доступа Twitter. Установка
этого свойства по умолчанию будет применяться только к любым адаптерам Twitter и не будет
применяться к другим типам служб общего доступа, у которых есть собственный
соответствующий адаптер по умолчанию.
Стоимость имущества
Логическое значение, указывающее, является ли текущий адаптер службой общего доступа по
умолчанию, используемой для этого типа службы общего доступа.
IsImageAttachmentSupported
Определение
Определяет, разрешает ли служба общего доступа использовать изображения в качестве
вложений.
Стоимость имущества
Если значение типа bool равно false, скриншоты нельзя будет отправить в социальную сеть.
Syntax
IsImageAttachmentSupported
Examples
OnAuthorizeAccount()
Определение
Если для свойства IsAuthorizationRequired установлено значение true, этот метод будет
вызываться, когда пользователь нажимает кнопку «Подключиться» в диалоговом окне «Общие
службы» в разделе «Инструменты» -> «Параметры». Когда этот метод вызывается, он позволит
вам пройти процесс рукопожатия для авторизации учетной записи в службе совместного
использования. Например, вы можете получить токены пользователей для публикации от их
имени в социальных сетях с использованием аутентификации OAuth.
Параметры
Этот метод не требует никаких параметров
Синтаксис
Этот метод не требуется переопределять. При необходимости вы можете переопределить
метод в вашей службе общего доступа, используя следующий синтаксис:
public override async Task OnAuthorizeAccount()
{
Examples
OnShare()
Определение
Этот метод вызывается, когда пользователь нажимает кнопку «ОК» в окне «Поделиться» в
NinjaTrader. Этот метод также может вызываться предупреждениями и общими объектами
NinjaScript.
Syntax
Examples
Signature
Определение
Задает текст, добавляемый в конец сообщения пользователя. Он не редактируется
пользователем и влияет на количество символов в общем сообщении.
Вы можете установить для него пустую строку, если это не относится к вашему адаптеру. В
этом случае метка «Подпись» не появится в окне «Поделиться».
Стоимость имущества
// пример №1, в конец сообщения добавляется текст «Это сообщение было отправлено из
NinjaTrader 8».
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Signature = "This message was sent from NinjaTrader 8";
}
}
Strategy
Методы и свойства, описанные в этом разделе, уникальны для разработки пользовательской
стратегии.
В этой секции
Account
Определение
Представляет реальную учетную запись или учетную запись моделирования, настроенную для
стратегии.
Стоимость имущества
Объект Account, настроенный для стратегии
Syntax
Account
Examples
AddChartIndicator()
Определение
Добавляет индикатор в стратегию только для отображения на графике.
Примечания:
• Чтобы добавить объекты Bars в вашу стратегию для целей расчета, см. Метод AddDataSeries
().
o Если вызывающая стратегия указывает вторичную или нулевую серию Bars (а не сам
индикатор), вместо нее будет подставлена первичная серия стратегии.
Parameters
Examples
protected override void OnStateChange()
{
if (State == State.DataLoaded)
{
// Наносит на график 20-периодную простую скользящую среднюю
AddChartIndicator(SMA(20));
}
}
AddPerformanceMetric()
Определение
Добавляет экземпляр настраиваемой метрики производительности в стратегию, используемую
в расчетах стратегии.
Parameters
Examples
AtmStrategyCancelEntryOrder()
Определение
Отменяет указанный порядок входа, определенный строковым параметром orderId.
Примечания:
1. Этот метод предназначен ТОЛЬКО для заказов, представленных как заказы на вход через
банкомат, и предполагает, что OrderState НЕ является терминальным (т. Е. Отменен, исполнен,
отклонен, неизвестен).
Syntax
AtmStrategyCancelEntryOrder(string orderId)
Предупреждение: этот метод следует вызывать ТОЛЬКО после того, как состояние стратегии
достигло состояния State.Realtime
Parameters
Examples
AtmStrategyChangeEntryOrder()
Определение
Изменяет цену указанного ордера на вход.
Syntax
AtmStrategyChangeEntryOrder(double limitPrice, double stopPrice, string orderId)
Parameters
Examples
AtmStrategyChangeStopTarget()
Определение
Изменяет цену указанного ордера указанной стратегии ATM.
Syntax
AtmStrategyChangeStopTarget(double limitPrice, double stopPrice, string orderName, string
atmStrategyId)
Parameters
Examples
AtmStrategyClose()
Определение
Отменяет все рабочие ордера и закрывает любую открытую позицию стратегии, используя
поведение закрытия стратегии ATM по умолчанию.
AtmStrategyCreate()
Определение
Отправляет ордер на вход, который будет выполнять указанную стратегию банкомата.
Примечания:
Syntax
AtmStrategyCreate(OrderAction action, OrderType orderType, double limitPrice, double stopPrice,
TimeInForce timeInForce, string orderId, string strategyTemplateName, string atmStrategyId,
Action<Cbi.ErrorCode, string> callback)
Parameters
Возможные значения:
-OrderAction.Buy
-OrderAction.Sell
Возможные значения:
•OrderType.Limit
•OrderType.Market
•OrderType.MIT
•OrderType.StopMarket
•OrderType.StopLimit
•TimeInForce.Day
•TimeInForce.Gtc
orderId Уникальный идентификатор заявки на вход
Examples
if(isAtmStrategyCreated)
{
// atm логика
}
else if(!isAtmStrategyCreated)
{
// настраиваемая обработка неудачной стратегии банкомата
}
}
GetAtmStrategyEntryOrderStatus()
Определение
Получает текущее состояние указанного порядка входа.
Примечание. Если метод не может найти указанный порядок, возвращается пустой массив.
Parameters
Examples
protected override void OnBarUpdate()
{
string[] entryOrder = GetAtmStrategyEntryOrderStatus("orderId");
GetAtmStrategyMarketPosition()
Определение
Получает текущую рыночную позицию указанной стратегии банкомата.
Примечания:
3. Обратите внимание, что это обеспечивает доступ к текущей позиции стратегии банкомата,
которую не следует путать с позицией стратегии NinjaScript или позицией счета. Для получения
дополнительной информации см. Раздел «Использование банкоматов».
Examples
protected override void OnBarUpdate()
{
// Проверяем, плоский ли
if (GetAtmStrategyMarketPosition("id") == MarketPosition.Flat)
Print("ATM Strategy position is currently flat");
}
GetAtmStrategyPositionAveragePrice()
Определение
Получает среднюю цену текущей позиции для указанной стратегии банкомата.
Examples
GetAtmStrategyPositionQuantity()
Определение
Получает текущее количество позиций указанной стратегии банкомата.
Примечание: изменения позиций не будут отражены, по крайней мере, до следующего события
OnBarUpdate () после заполнения ордера.
Examples
GetAtmStrategyRealizedProfitLoss()
Определение
Получает значение реализованной прибыли и убытка для указанной стратегии банкомата.
Examples
Примечания:
1. Если метод не может найти указанный порядок (а), возвращается пустой массив.
2. Указанный стоп или цель в стратегии банкомата может фактически удерживать несколько
ордеров. Например, если ваша стратегия банкомата отправляет стоп и цель, и вы получаете
несколько частичных заполнений при входе с задержкой в несколько секунд или более между
заполнениями входа, стратегия банкомата будет отправлять стоповые и целевые ордера для
каждого частичного заполнения одним и тем же цена и вид заказа.
Syntax
GetAtmStrategyStopTargetOrderStatus(string orderName, string atmStrategyId)
Parameters
Examples
protected override void OnBarUpdate()
{
string[,] orders = GetAtmStrategyStopTargetOrderStatus("Target1", "idValue");
GetAtmStrategyUnrealizedProfitLoss()
Определение
Получает значение нереализованной прибыли и убытка по указанной стратегии банкомата.
Syntax
GetAtmStrategyUnrealizedProfitLoss(string atmStrategyId)
Parameters
Examples
GetAtmStrategyUniqueId()
Определение
Создает уникальное значение идентификатора стратегии банкомата.
Параметры
Этот метод использует любые параметры.
Примеры
BarsRequiredToTrade
Определение
Количество исторических баров, необходимое для того, чтобы стратегия начала обрабатывать
методы заказа, вызываемые в методе OnBarUpdate (). Это свойство обычно устанавливается
через пользовательский интерфейс при запуске стратегии.
Стоимость имущества
Значение типа int, представляющее количество исторических баров. Значение по умолчанию -
20.
Syntax
BarsRequiredToTrade
Совет: при работе с многосерийной стратегией события обновления бара в реальном времени
для конкретного объекта Bars принимаются только тогда, когда этот объект Bars удовлетворяет
требованию BarsRequiredToTrade. Чтобы обеспечить выполнение этого требования,
используйте массив CurrentBars.
Examples
Установка значения BarsRequiredToTrade по умолчанию
protected override void OnStateChange()
{
if (State == State.Configure)
{
BarsRequiredToTrade = 20;
}
}
Проверка BarsRequiredToTrade по массиву CurrentBars
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
BarsRequiredToTrade = 20;
}
else if (State == State.Configure)
{
// добавляем 30-минутный ряд для логики расчета
AddDataSeries(BarsPeriodType.Minute, 30);
}
}
// логика заказа
}
BarsSinceEntryExecution()
Определение
Возвращает количество баров, прошедших с момента последней записи. Если указано имя
сигнала, будет возвращено количество баров, прошедших с момента последней конкретной
записи.
Syntax
BarsSinceEntryExecution()
BarsSinceEntryExecution(string signalName)
Parameters
Examples
protected override void OnBarUpdate()
{
if (CurrentBar < BarsRequiredToTrade)
return;
// Входим только в том случае, если с момента последнего входа прошло не менее 10 баров
if ((BarsSinceEntryExecution() > 10 || BarsSinceEntryExecution() == -1) && CrossAbove(SMA(10),
SMA(20), 1))
EnterLong();
BarsSinceExitExecution()
Определение
Возвращает количество баров, прошедших с момента последнего выхода. Если указано имя
сигнала, будет возвращено количество баров, прошедших с момента последнего конкретного
выхода.
Syntax
BarsSinceExitExecution()
BarsSinceExitExecution(string signalName)
Parameters
Examples
// Входить только в том случае, если с момента нашего последнего выхода прошло не менее
10 баров или мы еще не торговали
if ((BarsSinceExitExecution() > 10 || BarsSinceExitExecution() == -1) && CrossAbove(SMA(10),
SMA(20), 1))
EnterLong();
}
ChartIndicators
Определение
Содержит коллекцию индикаторов, которые были добавлены в экземпляр стратегии с помощью
AddChartIndicator ().
Свойство стоимости
Индикаторный объект
Syntax
ChartIndicators[int index]
Examples
if (State == State.DataLoaded)
{
AddChartIndicator(SMA(20));
CloseStrategy()
Определение
Отменяет все рабочие ордера, закрывает все существующие позиции и, наконец, отключает
стратегию. При желании это поведение также можно изменить для данной стратегии.
Примечания:
Syntax
CloseStrategy(string signalName)
Предупреждение: этот метод можно вызвать только до того, как State достигнет
State.Terminated
}
Parameters
Examples
Базовое использование CloseStrategy
DateTime StartTime = new DateTime();
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Name = "ExampleStrategy";
}
ConnectionLossHandling
Определение
Устанавливает способ поведения вашей стратегии при обнаружении потери соединения.
• Если поток ордеров отключается, и стратегия размещает действие ордера при отключении,
стратегия останавливается.
• Если и поток данных, и поток заказов отключаются на время, превышающее время, указанное
в DisconnectDelaySeconds, стратегия останавливается.
Syntax
ConnectionLossHandling
Examples
DaysToLoad
Определение
Определяет количество торговых дней, которое будет настроено при загрузке стратегии из
таблицы стратегий.
Примечания:
Стоимость имущества
Значение типа int, определяющее количество торговых дней, загружаемых для обработки
исторических данных. Значение по умолчанию - 5, но его можно настроить и переопределить из
пользовательского интерфейса.
Syntax
DaysToLoad
Examples
DefaultQuantity
Определение
Переменная размера ордера, которая может быть установлена программно или
переопределена с помощью стратегии, которая определяет количество ордера на вход.
Стоимость имущества
Значение типа int представляет количество контрактов или акций для входа в позицию.
Значение по умолчанию - 1.
DisconnectDelaySeconds
Определение
Определяет количество времени, которое должно длиться отключение, прежде чем обработка
потери соединения начнет действовать.
Стоимость имущества
Значение типа int представляет время, необходимое для того, чтобы отключение продлилось
до того, как произойдут действия по обработке потери соединения. Значение по умолчанию -
10.
Syntax
DisconnectDelaySeconds
Examples
EntriesPerDirection
Определение
Определяет максимальное количество записей, разрешенных для каждого направления, пока
позиция активна, на основе свойства EntryHandling.
Примечание. Это свойство применяется ТОЛЬКО к методам управляемого заказа. Если для
IsUnmanaged установлено значение true, свойства обработки входа будут скрыты в
пользовательском интерфейсе.
Стоимость имущества
Значение типа int представляет максимально допустимое количество записей. Значение по
умолчанию - 1.
Syntax
EntriesPerDirection
Examples
Если открытая позиция уже существует, последующие вызовы EnterLong
() игнорируются.
// Example #1
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
EntriesPerDirection = 1;
EntryHandling = EntryHandling.AllEntries;
}
}
EntryHandling
Определение
Устанавливает способ обработки ордеров на вход.
Примечание. Это свойство применяется ТОЛЬКО к методам управляемого заказа. Если для
IsUnmanaged установлено значение true, свойства обработки входа будут скрыты в
пользовательском интерфейсе.
Стоимость имущества
Перечисление, которое устанавливает, как обрабатываются заказы на вход. Значение по
умолчанию - EntryHandling.AllEntries. Возможные значения включают:
Syntax
EntryHandling
Examples
Разрешить максимум два входа, пока позиция открыта
// Example #1
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
EntriesPerDirection = 2;
EntryHandling = EntryHandling.AllEntries;
}
}
Execution
Определение
Представляет интерфейс только для чтения, который предоставляет информацию о
выполнении (заполненном заказе), являющемся результатом заказа, и передается как
параметр в Definition
Represents a read only interface that exposes information regarding an execution (filled order)
resulting from an order and is passed as a parameter in the OnExecutionUpdate() method.
Note: Not all executions will have associated Order objects (e.g ExitOnSessionClose executions or
AtmStrategyCreate() executions)методе OnExecutionUpdate ().
Примечание. Не все исполнения будут иметь связанные объекты Order (например, выполнение
ExitOnSessionClose или выполнение AtmStrategyCreate ())
Возможные значения:
•MarketPosition.Long
•MarketPosition.Short
Examples
Поиск выполнения определенного объекта Order
// Example #1
private Order entryOrder = null;
// Example #2
protected override void OnExecutionUpdate(Execution execution, string executionId, double price,
int quantity, MarketPosition marketPosition, string orderId, DateTime time)
{
// Не забудьте проверить базовый объект Order на null, прежде чем пытаться получить
доступ к его свойствам
if (execution.Order != null && execution.Order.OrderState == OrderState.Filled)
Print(execution.ToString());
}
ExitOnSessionCloseSeconds
Определение
Количество секунд до фактического времени окончания сеанса, которое вызовет функция
IsExitOnSessionCloseStrategy.
Время, от которого будет вычисляться это свойство, берется из свойства EOD торговых часов,
установленного в шаблоне торговых часов стратегии. Свойство ExitOnSessionCloseSeconds
может быть установлено программно в методе OnStateChange () или управляться
пользовательским интерфейсом во время выполнения.
Примечание. Это свойство работает только в реальном времени, оно не повлияет на время
ExitOnSessionClose при тестировании обработки исторических данных на исторических данных.
Стоимость имущества
Тип int, представляющий количество секунд. Значение по умолчанию - 30.
Examples
IncludeCommission
Определение
Определяет, будут ли результаты эффективности стратегии включать комиссию на
историческом бэктесте. Если задано значение true, будет использоваться шаблон комиссии,
примененный к учетной записи, на которой работает стратегия.
Стоимость имущества
Логическое значение, которое возвращает истину, если стратегия включает комиссию на
историческом бэктесте; в противном случае - ложь. По умолчанию установлено значение false.
Syntax
IncludeCommission
Examples
IncludeTradeHistoryInBacktest
Определение
Определяет, будет ли стратегия сохранять ордера, сделки и историю исполнения. Если для
этого свойства установлено значение false, вы увидите значительную экономию памяти за счет
доступа к подробной торговой информации.
Примечания:
• В 32-битной среде для этого свойства всегда по умолчанию установлено значение false, за
исключением случаев, когда стратегия работает на графике или при тестировании на истории
одного инструмента.
• В 64-битной среде для этого свойства всегда установлено значение true, за исключением
случаев, когда стратегия выполняется на вкладке стратегии.
Стоимость имущества
Это свойство возвращает истину, если стратегия будет включать торговую историю; в
противном случае - ложь. По умолчанию установлено значение true.
Syntax
IncludeTradeHistoryInBacktest
Examples
IsAdoptAccountPositionAware
Определение
Определяет, запрограммирована ли стратегия способом, позволяющим обрабатывать
реальные позиции на счетах. Если установлено значение true, параметры «Начальное
поведение» вашей стратегии будут включать дополнительный параметр с именем «Принять
позицию на счете», который можно установить во время выполнения. Устанавливайте значение
true только в том случае, если вы специально запрограммировали свою стратегию на
использование позиций на счете.
Стоимость имущества
Это свойство возвращает истину, если стратегия может принимать позиции счета; в противном
случае - ложь. По умолчанию установлено значение false.
Примечание. Это свойство следует устанавливать ТОЛЬКО из метода OnStateChange () во
время State.SetDefaults.
Syntax
IsAdoptAccountPositionAware
Examples
IsExitOnSessionCloseStrategy
Определение
Определяет, будет ли стратегия отменять все созданные стратегией ордера на всех
стратегических инструментах и закрывать все открытые стратегические позиции при закрытии
ЛЮБОГО сеанса для мульти-таймфреймов / мультиинструментальных стратегий. Это свойство
может быть установлено программно в методе OnStateChange () или управляться
пользовательским интерфейсом во время выполнения. См. Также
«ExitOnSessionCloseSeconds».
Стоимость имущества
Это свойство возвращает истину, если стратегия завершается при закрытии; в противном
случае - ложь. По умолчанию установлено значение true.
Предупреждения:
Syntax
IsExitOnSessionCloseStrategy
Examples
IsFillLimitOnTouch
Определение
Определяет, будет ли стратегия использовать более либеральный алгоритм заполнения только
для целей обратного тестирования. По умолчанию алгоритм исполнения стратегии исполняет
лимитный ордер после того, как цена превысила лимитную цену. Однако это поведение можно
изменить, установив для IsFillLimitOnTouch значение true, и в этом случае алгоритм заполнения
стратегии будет считать лимитный ордер исполненным, как только цена достигнет лимитной
цены, но не обязательно торговать по лимитной цене.
Стоимость имущества
Это свойство возвращает истину, если стратегия будет заполнять лимитные ордера при
касании; в противном случае - ложь. По умолчанию установлено значение false.
Syntax
IsFillLimitOnTouch
Examples
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
IsFillLimitOnTouch = true;
}
}
IsInstantiatedOnEachOptimizationIteration
Определение
Определяет, следует ли повторно создавать (воссоздавать) стратегию после каждого прогона
оптимизации при использовании оптимизатора Strategy Analyzer.
Стоимость имущества
Это свойство возвращает истину, если стратегия не используется повторно; в противном
случае - ложь. По умолчанию установлено значение true.
Examples
IsInstantiatedOnEachOptimizationIteration = true;
}
Print(myTrades.Count);
}
}
}
}
else if (CrossBelow(SMA(Fast), SMA(Slow), 1))
{
EnterShort();
myTrades.Add(Time[0], "short");
}
}
// в этом случае нам не нужно повторно создавать экземпляр стратегии после каждой
оптимизации
// потому что мы явно сбрасываем пользовательский торговый словарь в State.DataLoaded
// Этот вариант повторного использования экземпляра стратегии дает преимущества в
производительности
IsInstantiatedOnEachOptimizationIteration = false;
}
if (myTrades != null)
myTrades.Clear();
else
myTrades = new Dictionary<DateTime, string>();
// Любые поддерживаемые значения стратегии по умолчанию не нужно сбрасывать, если
они не изменяются во время выполнения стратегии.
// Любое состояние стратегии, которое может быть изменено после State.SetDefaults,
необходимо сбросить для следующего запуска.
myDouble = double.MinValue;
myBool = false;
myDateTime = DateTime.MinValue;
myOrderObject = null;
myBrushObject = null;
mySMAIndicator = SMA(14);
if (myIntArray != null)
Array.Clear(myIntArray, 0, myIntArray.Length);
else
myIntArray = new int[20];
if (myList != null)
myList.Clear();
else
myList = new List<object>();
}
else if (CrossBelow(SMA(Fast), SMA(Slow), 1))
{
EnterShort();
myTrades.Add(Time[0], "short");
}
}
IsInStrategyAnalyzer
Определение
Определяет, запускается ли текущая стратегия NinjaScript из диаграммы Анализатора
стратегий.
Стоимость имущества
Логическое значение, если истинно, стратегия запускается из диаграммы Анализатора
стратегий; в противном случае вернет false.
Syntax
IsInStrategyAnalyzer
Examples
IsTradingHoursBreakLineVisible
Определение
Наносит на индикаторную панель линии излома торговых часов.
Стоимость имущества
Это свойство возвращает истину, если на панели индикатора нанесены линии разрыва
торговых часов; в противном случае - ложь. По умолчанию установлено значение true.
Examples
IsWaitUntilFlat
Определение
Указывает, что стратегия в настоящее время ожидает обнаружения плоской позиции перед
отправкой живых ордеров.
Примечание. Это свойство будет применяться только в том случае, если для стратегии
StartBehavior задано значение StartBehavior.WaitUntilFlat или
StartBehavior.WaitUntilFlatSynchronizeAccount.
Стоимость имущества
Это свойство возвращает истину, если стратегия обнаружила, что она находится в длинной или
короткой позиции во время State.Transition; в противном случае - ложь. По умолчанию
установлено значение false.
Syntax
IsWaitUntilFlat
Examples
NumberRestartAttempts
Определение
Определяет максимальное количество попыток перезапуска, разрешенное в течение
последних x минут, определенных в RestartsWithinMinutes, когда стратегия испытывает потерю
соединения. Если количество попыток перезапуска превышает это свойство в течение периода
времени, меньшего или равного RestartsWithinMinutes, то стратегия будет остановлена и
дальнейших попыток не будет. Цель этих настроек - остановить стратегию, если ваше
соединение нестабильно и не может поддерживать согласованное состояние подключения.
Стоимость имущества
Значение типа int представляет максимальное количество попыток перезапуска. По умолчанию
установлено значение 4.
Syntax
NumberRestartAttempts
Examples
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
// Разрешить перезапуск стратегии только 4 раза в промежутке времени MaxRestartMinutes
// При отключении более 4 раз за этот промежуток времени остановите стратегию и не
// пытаемся перезапустить дальше.
NumberRestartAttempts = 4;
}
}
OnAccountItemUpdate()
Определение
Управляемый событиями метод, используемый для стратегий, который вызывается для
каждого обновления AccountItem для учетной записи, на которой выполняется стратегия.
Синтаксис
}
Method Parameters
Examples
protected override void OnAccountItemUpdate(Account account, AccountItem accountItem, double
value)
{
Print(string.Format("{0} {1} {2}", account.Name, accountItem, value));
// output:
// Sim101 BuyingPower 103962.5
// Sim101 CashValue 103962.5
// Sim101 GrossRealizedProfitLoss 3962.5
// Sim101 RealizedProfitLoss 3962.5
}
AccountItemEventArgs
Определение
AccountItemEventArgs содержит информацию об учетной записи, которая должна быть
передана в качестве аргумента событию OnAccountItemUpdate ().
Примечание. Чтобы получить полный рабочий пример использования этого класса, загрузите
пример фреймворка, расположенный в нашем обзоре разработки надстроек.
Example
// Этот метод запускается при любом изменении AccountItem
private void OnAccountItemUpdate(object sender, AccountItemEventArgs e)
{
/ * Dispatcher.InvokeAsync () необходим для многопоточности. При обработке
событий вне потока пользовательского интерфейса, и мы хотим
влиять на пользовательский интерфейс .InvokeAsync () позволяет нам это делать.
Это также может помочь предотвратить блокировку потока пользовательского
интерфейса при длительных операциях. * /
Dispatcher.InvokeAsync(() =>
{
/ Распечатываем, какой AccountItem изменился, для какой учетной записи и новое
значение, используя
outputBox.AppendText(string.Format("{0}Account: {1}{0}AccountItem: {2}{0}Value: {3}",
Environment.NewLine,
e.Account.Name,
e.AccountItem,
e.Value));
});
OnExecutionUpdate()
Определение
Управляемый событиями метод, который вызывается при поступлении выполнения заказа,
управляемого стратегией. Исполнение - это другое название исполнения заказа.
Примечания:
• Пользователи Rithmic и Interactive Brokers: из-за конструкции API провайдера эти адаптеры не
гарантируют последовательность событий OnOrderUpdate, OnExecution и OnPositionUpdate.
Поэтому при работе над стратегией, которая будет работать в этих соединениях,
рекомендуется работать только с данными, передаваемыми по значению из этого обратного
вызова, чтобы устранить зависимость от последовательности событий.
Синтаксис
Вы должны переопределить метод в своей стратегии, используя следующий синтаксис:
protected override void OnExecutionUpdate(Execution execution, string executionId, double price, int
quantity, MarketPosition marketPosition, string orderId, DateTime time)
{
}
Parameters
• MarketPosition.Long
• MarketPosition.Short
Пример OnExecutionUpdate
// Пример
protected override void OnExecutionUpdate(Execution execution, string executionId, double price,
int quantity, MarketPosition marketPosition, string orderId, DateTime time)
{
Print(execution.ToString());
}
Дополнительные эталонные образцы
Дополнительные образцы кода доступны в разделе «Образовательные ресурсы NinjaScript» на
нашем форуме поддержки.
OnOrderTrace()
Определение
Управляемый событиями метод, используемый для стратегий, который позволит вам настроить
вывод TraceOrders.
Синтаксис
Вы должны переопределить метод в своей стратегии, используя следующий синтаксис:
protected override void OnOrderTrace(DateTime timestamp, string message)
{
Method Parameters
// Расширенный пример также будет включать полное имя инструмента из нашего объекта
первичных баров
if (BarsArray[0] != null)
Print(string.Format("{0} {1} {2}", timestamp, message, BarsArray[0].Instrument.FullName));
}
OnOrderUpdate()
Определение
Управляемый событиями метод, который вызывается каждый раз, когда заказ, управляемый
стратегией, меняет состояние. Заказ изменит состояние, когда произойдет изменение
количества, цены или состояния заказа (от рабочего до выполненного). Вы можете
использовать этот метод для программирования собственной обработки отклонения заказа.
Примечания:
• Для запуска таких действий, как отправка стоп-лосса и целевого ордера с использованием
настраиваемой логики ОСО, когда ваш ордер на вход заполнен, мы рекомендуем вместо этого
работать непосредственно в OnExecutionUpdate ().
• OnOrderUpdate () будет запускаться внутри методов заказа, таких как EnterLong () или
SubmitOrderUnmanaged (), поэтому попытка назначить объект заказа вне OnOrderUpdate ()
может не вернуть, как ожидалось. Если ваша стратегия зависит от отслеживания объекта
заказа с самого первого обновления, вам следует попытаться сопоставить объекты заказа по
order.Name (имя сигнала) во время OnOrderUpdate (), поскольку заказ обновляется впервые.
• Пользователи Rithmic и Interactive Brokers: из-за конструкции API провайдера эти адаптеры не
гарантируют последовательность событий OnOrderUpdate, OnExecution и OnPositionUpdate.
Поэтому при работе над стратегией, которая будет работать в этих соединениях,
рекомендуется работать только с данными, передаваемыми по значению из этого обратного
вызова, чтобы устранить зависимость от последовательности событий.
Критично: если вы хотите управлять логикой своей стратегии на основе выполнения заказов,
вы должны использовать OnExecutionUpdate () вместо OnOrderUpdate (). OnExecutionUpdate ()
всегда запускается после OnOrderUpdate (). Существует внутренняя логика стратегии, которая
запускается после вызова OnOrderUpdate (), но до OnExecutionUpdate (), что может
отрицательно повлиять на вашу стратегию, если вы полагаетесь на отслеживание заполнения
в OnOrderUpdate ().
Подключение к воспроизведению
При подключении к Playback Connection вызов методов на основе рыночного ордера, таких как
EnterLong () и EnterShort (), приведет к запуску событий состояния ордера до того, как метод
ордера вернет объект ордера. Это сделано для того, чтобы все события были
синхронизированы при высокоскоростном воспроизведении.
Синтаксис
Вы должны переопределить метод в своей стратегии, используя следующий синтаксис:
protected override void OnOrderUpdate(Order order, double limitPrice, double stopPrice, int quantity,
int filled, double averageFillPrice, OrderState orderState, DateTime time, ErrorCode error, string
comment)
{
Method Parameters
Возможные значения:
ErrorCode.LoginExpired
ErrorCode.LogOnFailed
ErrorCode.NoError
ErrorCode.OrderRejected
ErrorCode.OrderRejectedByRisk
ErrorCode.Panic
ErrorCode.UnableToCancelOrder
ErrorCode.UnableToChangeOrder
ErrorCode.UnableToSubmitOrder
ErrorCode.UserAbort
OrderState Values
Examples
Понимание параметра объекта заказа и параметра обновления значения
(соображения многопоточности для NinjaScript)
protected override void OnOrderUpdate(Cbi.Order order, double limitPrice, double stopPrice,
int quantity, int filled, double averageFillPrice,
Cbi.OrderState orderState, DateTime time, Cbi.ErrorCode error, string
comment)
{
Print("The most current order state is: " + order.OrderState); // OrderState.PartFilled
Print("This particular order update state is: " + orderState); // OrderState.Working
}
protected override void OnOrderUpdate(Order order, double limitPrice, double stopPrice, int
quantity, int filled, double averageFillPrice, OrderState orderState, DateTime time, ErrorCode
error, string nativeError)
{
// проверяем, совпадает ли текущий ордер с orderName, переданным в "EnterLong" ()
// Назначьте entryOrder в OnOrderUpdate (), чтобы гарантировать, что назначение
происходит, когда ожидалось.
// Это более надежно, чем присвоение объектов Order в OnBarUpdate, так как не
гарантируется, что назначение будет завершено, если на него сделана ссылка сразу
после отправки
if (order.Name == "entryOrder")
entryOrder = order;
OnPositionUpdate()
Определение
Управляемый событиями метод, который вызывается каждый раз, когда позиция
стратегии меняет состояние.
Примечания:
Синтаксис
Вы должны переопределить метод в своей стратегии, используя следующий синтаксис:
}
Method Parameters
• MarketPosition.Flat
• MarketPosition.Long
• MarketPosition.Short
Examples
OptimizationPeriod
Определение
Зарезервированное для пошаговой оптимизации, это свойство определяет количество дней,
используемых для периода тестирования на исторических данных «в выборке» для данной
стратегии. См. Также TestPeriod.
Стоимость имущества
Значение типа int, представляющее количество дней "в выборке", используемых для прямой
оптимизации; По умолчанию установлено 10.
Syntax
OptimizationPeriod
Examples
Order
Определение
Представляет интерфейс только для чтения, который предоставляет информацию о заказе.
• Объект Order, возвращаемый при вызове метода заказа, является динамическим в том
смысле, что его свойства всегда отражают текущее состояние заказа.
• Свойство <Order> .OrderId НЕ является уникальным значением, так как оно может изменяться
в течение всего срока действия заказа. Пожалуйста, см. Раздел «Обработка авансовых
заказов» «Переход от исторических ссылок к текущим заказам», чтобы узнать, как это делать.
• К свойству <Order> .Oco БУДЕТ добавлен суффикс, когда стратегия переходит из истории в
режим реального времени, чтобы гарантировать, что идентификатор OCO является
уникальным для нескольких стратегий для текущих заказов.
OrderAction.Buy
OrderAction.BuyToCover
OrderAction.Sell
OrderAction.SellShort
OrderType.Limit
OrderType.Market
OrderType.MIT
OrderType.StopMarket
OrderType.StopLimit
TimeInForce.Day
TimeInForce.Gtc
OrderState Values
Examples
protected override void OnOrderUpdate(Order order, double limitPrice, double stopPrice, int
quantity, int filled, double averageFillPrice, OrderState orderState, DateTime time, ErrorCode error,
string nativeError)
{
// Назначьте entryOrder в OnOrderUpdate (), чтобы гарантировать, что назначение
происходит, когда ожидалось.
// Это более надежно, чем присвоение объектов Order в OnBarUpdate, так как не
гарантируется, что назначение будет завершено, если на него сделана ссылка сразу после
отправки
if (order.Name == "myEntryOrder")
entryOrder = order;
IsTerminalState()
Определение
Статический метод, используемый для определения того, считается ли OrderState заказа
терминальным и больше не активным.
Примечание. Это статический метод, который сравнивается с состоянием заказа, а НЕ с самим
заказом. Пожалуйста, посмотрите пример ниже для правильного использования синтаксиса.
Syntax
IsTerminalState(OrderState orderState)
Parameters
Examples
protected override void OnOrderUpdate(Order order, double limitPrice, double stopPrice, int
quantity, int filled, double averageFillPrice, OrderState orderState, DateTime time, ErrorCode error,
string nativeError)
{
// назначаем входящий ордер
if (entryOrder == null)
{
// проверяем соответствие порядка по имени сигнала, что порядок не находится в
состоянии терминала
if (order.Name == "myEntryOrder" && !Order.IsTerminalState(order.OrderState))
entryOrder = order;
}
Order Methods
Примечание: вы не сможете смешивать и сочетать два подхода. Если вы решите использовать
управляемый подход, вы сможете использовать только методы управляемого заказа. Если вы
решите использовать неуправляемый подход, вы сможете использовать только неуправляемые
методы заказа.
Managed
Управляемый подход предлагает вам методы ордеров, которые обернуты невидимым удобным
слоем, который позволяет вам сосредоточиться на торговых правилах вашей системы,
оставляя основную механику управления ордерами и отношения между ордерами на вход и
выход и позициями для NinjaTrader. Плата за использование уровня удобства заключается в
том, что существуют правила обработки заказов, которые необходимо соблюдать, чтобы
предотвратить ошибки в заказе.
Managed Approach
Управляемый подход в NinjaScript разработан, чтобы предложить максимальную
простоту использования для начинающих и программистов среднего уровня. Методы
ордеров обернуты в удобный слой, который позволяет вам сосредоточиться на
торговых правилах вашей системы, оставляя основную механику управления ордерами
и отношения между ордерами на вход, выходом и позициями на NinjaTrader. Этот подход
лучше всего подходит для простых и средних заказов и может быть далее разбит на
базовый / общий управляемый подход и более продвинутый управляемый подход. В
следующем разделе будет обсуждаться использование базового / общего подхода.
• Изменения и отмены заказов ставятся в очередь в том случае, если заказ находится в
состоянии, в котором его нельзя отменить или изменить.
В приведенном ниже примере ордер Buy Limit работает по цене предложения, при условии, что
цена закрытия текущего бара больше, чем текущее значение 20-периодной простой
скользящей средней. Если условие входа больше не выполняется и ордер по-прежнему
активен, он будет немедленно отменен.
protected override void OnBarUpdate()
{
// Условие входа
if (Close[0] > SMA(20)[0])
EnterLongLimit(GetCurrentBid());
}
Этот метод позволяет вам максимально быстро и просто отправлять заказы, подходящие для
программистов всех уровней. Если вы хотите отправить заказ и не должны повторно
отправлять его, чтобы поддерживать его в рабочем состоянии, вы можете использовать
расширенный подход, предназначенный для опытных программистов, который включает в себя
возможность поддерживать заказы до тех пор, пока они не будут отменены в коде.
Ниже приведен пример размещения ордера на вход в рынок и связанного с ним лимитного
ордера на выход, связанных вместе именем сигнала ордера на вход.
protected override void OnBarUpdate()
{
if (CurrentBar < 1) return;