• Тинькофф Банк-лучшие банковские продукты еще выгоднее
    Выбирайте продукт от банка Тинькофф
  • Уважаемые форумчане, друзья и посетители!
    Поступило предложение ( ссылка на обсуждение ) на сбор средств поддержания форума в рабочем состоянии с 1 июня ( оплата хостинга, бэкап ежедневный на другой хостинг и тд), отчетность будет предоставляться ежемесячно. Пока на ЮMoney ( яндекс деньги), доступно картой перевод, далее добавлю другие способы. Сумму перевода указывайте на ваш выбор исходя из своих возможностей.
    Форум продолжает свою работу благодаря Вашим пожертвованиям.

NinjaTrader 8 Пытаюсь протестировать простую стратегию, созданную в Построителе стратегий НТ8

gelono

Member
NinjaTrader
Народ, подскажите, что я не так делаю. Пытаюсь протестировать простую стратегию, созданную в Построителе стратегий НТ8. Индикатор считает дельту и условием для сделки является разворот дельты на минутном баре. Вроде все просто. Но выставляя галочку "проиграть тик" в анализаторе стратегий за один день на минутном графике появляется порядка 10 000 сделок. Ужас((. Кстати, при создании стратегии выбирал расчет с каждым тиком. Если менять расчет по закрытию бара, то сделок вообще нет! В общем похоже, что при функции "проиграть тик" сделки появляются на развороте дельты на каждом тике. То что график минутный вообще фиолетово(((
 
namespace NinjaTrader.NinjaScript.Strategies
{
public class My01 : Strategy
{
private double Zero;

private A01 A011;

protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Enter the description for your new custom Стратегия here.";
Name = "My01";
Calculate = Calculate.OnBarClose;
EntriesPerDirection = 1;
EntryHandling = EntryHandling.AllEntries;
IsExitOnSessionCloseStrategy = true;
ExitOnSessionCloseSeconds = 30;
IsFillLimitOnTouch = false;
MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix;
OrderFillResolution = OrderFillResolution.Standard;
Slippage = 0;
StartBehavior = StartBehavior.WaitUntilFlat;
TimeInForce = TimeInForce.Gtc;
TraceOrders = false;
RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose;
StopTargetHandling = StopTargetHandling.PerEntryExecution;
BarsRequiredToTrade = 20;
// Disable this property for performance gains in Strategy Analyzer optimizations
// See the Help Guide for additional information
IsInstantiatedOnEachOptimizationIteration = true;
Zero = 0;
}
else if (State == State.Configure)
{
SetProfitTarget("", CalculationMode.Ticks, 5);
SetStopLoss("", CalculationMode.Ticks, 5, false);
}
else if (State == State.DataLoaded)
{
A011 = A01(Close);
A011 = A01(Close);
A011.Plots[0].Brush = Brushes.DarkCyan;
A011.Plots[1].Brush = Brushes.Crimson;
AddChartIndicator(A011);
}
}

protected override void OnBarUpdate()
{
if (CurrentBars[0] < 1)
return;

// Установить 1
if ((A011.Buys[0] > Zero)
&& (A011.Buys[1] == Zero))
{
EnterLong(Convert.ToInt32(DefaultQuantity), "");
}

}
}
}
 
На основе этого индюка считается дельта. В стратегии только сделки в лонг прописаны.
namespace NinjaTrader.NinjaScript.Indicators
{
public class A01 : Indicator
{
private double buys;
private double sells;
private int activeBar = 0;
double delta = 0;

protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = NinjaTrader.Custom.Resource.NinjaScriptIndicatorDescriptionBuySellVolume;
Name = "A01";
BarsRequiredToPlot = 1;
Calculate = Calculate.OnEachTick;
DrawOnPricePanel = false;
IsOverlay = false;
DisplayInDataBox = true;

// Plots will overlap each other no matter which one of these comes first
// in NT8, we would add the Sells first in code and then Buys, and the "Sells" was always in front of the buys.
AddPlot(new Stroke(Brushes.DarkCyan, 2), PlotStyle.Bar, NinjaTrader.Custom.Resource.BuySellVolumeBuys);
AddPlot(new Stroke(Brushes.Crimson, 2), PlotStyle.Bar, NinjaTrader.Custom.Resource.BuySellVolumeSells);
}
else if (State == State.Historical)
{
if (Calculate != Calculate.OnEachTick)
{
Draw.TextFixed(this, "NinjaScriptInfo", string.Format(NinjaTrader.Custom.Resource.NinjaScriptOnBarCloseError, Name), TextPosition.BottomRight);
Log(string.Format(NinjaTrader.Custom.Resource.NinjaScriptOnBarCloseError, Name), LogLevel.Error);
}
}
}

protected override void OnMarketData(MarketDataEventArgs e)
{
if(e.MarketDataType == MarketDataType.Last)
{
if(e.Price >= e.Ask)
{
buys += e.Volume;
}
else if (e.Price <= e.Bid)
{
sells += e.Volume;
}
}
}

protected override void OnBarUpdate()
{
if (CurrentBar < activeBar || CurrentBar <= BarsRequiredToPlot)
return;

// New Bar has been formed
// - Assign last volume counted to the prior bar
// - Reset volume count for new bar
if (CurrentBar != activeBar)
{
if (delta > 0)
{
Sells[1] = 0;
Buys[1] = delta;
}
else
{
Sells[1] = delta;
Buys[1] = 0;
}
//Sells[1] = sells;
//Buys[1] = buys;
buys = 0;
sells = 0;
activeBar = CurrentBar;
}

delta = buys - sells;

if (delta > 0)
{
Sells[0] = 0;
Buys[0] = delta;
}
else
{
Sells[0] = delta;
Buys[0] = 0;
}
}
 
My01 - стратегия
 

Вложения

  • My01.cs
    61,7 КБ · Просмотры: 12
  • A01.cs
    4,6 КБ · Просмотры: 13
Выложил два раза. Но не вижу своих сообщений. Не пойму, видите ли Вы их или нет?
 
пробую решить такой же вариант, не получается отобразить данные индикатора. Скачал твой вариант, если стоит
Код:
Calculate                = Calculate.OnEachTick;
то ничего нет в подвале индикатора,
если ставлю
Код:
Calculate                = Calculate.OnBarClose;
то в окне индикатора получаю сообщение, скрин прилагаю
Screenshot_3.png
 
пробую решить такой же вариант, не получается отобразить данные индикатора. Скачал твой вариант, если стоит
Код:
Calculate                = Calculate.OnEachTick;
то ничего нет в подвале индикатора,
если ставлю
Код:
Calculate                = Calculate.OnBarClose;
то в окне индикатора получаю сообщение, скрин прилагаю
Посмотреть вложение 4428
разобрался со своей проблемой.

А по поводу вашей могу предположить что вы правильно поняли, при каждой смени дельты у вас стратегия открывает сделку, если вы хотите сделать по закрытию бара, тогда делайте проверку на ПервыйТик в баре, и проверяйте дельты [1] и [2]

Код:
            if (IsFirstTickOfBar)
            {
                // Set 1
                if ((A011.Buys[1] > Zero)
                     && (A011.Buys[2] == Zero))
                {
                    EnterLong(Convert.ToInt32(DefaultQuantity), "");
                }
            }
 
Последнее редактирование:
Спасибо за отклик, Arkadiy. Для начала попробовал сравнивать дельты на [1] и [2]. Действительно сделки начали открываться как надо. Но, в течение дня появляется бар, на котором открывается больше 1000 сделкок(((. И он такой единственный. Остальные сделки все в норме. Мистика. Далее попробовал использовать код с проверкой на ПервыйТик. Сделки вообще не открываются. Я конечно еще "зеленый" в программировании и может что-то не так сделал.
 
Спасибо за отклик, Arkadiy. Для начала попробовал сравнивать дельты на [1] и [2]. Действительно сделки начали открываться как надо. Но, в течение дня появляется бар, на котором открывается больше 1000 сделкок(((. И он такой единственный. Остальные сделки все в норме. Мистика. Далее попробовал использовать код с проверкой на ПервыйТик. Сделки вообще не открываются. Я конечно еще "зеленый" в программировании и может что-то не так сделал.
Пробуй и придет опыт. Я долго не мог реализовать то что смог ты )))). Смотри другие примеры, всем миром по нитке как говорится и рубаха получится.
 
Спасибо за отклик, Arkadiy. Для начала попробовал сравнивать дельты на [1] и [2]. Действительно сделки начали открываться как надо. Но, в течение дня появляется бар, на котором открывается больше 1000 сделкок(((. И он такой единственный. Остальные сделки все в норме. Мистика. Далее попробовал использовать код с проверкой на ПервыйТик. Сделки вообще не открываются. Я конечно еще "зеленый" в программировании и может что-то не так сделал.
Да действительно возникает такой бар , продолбался с этой проблемой несколько дней !
Интересно вот что ,все знают откуда пришла эта стратегия и все видели этот сумасшедший результат ,
как только убрался этот бар при помощи кода , результат упал до почти убыточного!
То есть в видео,
был продемонстрирован результат с этой ошибкой ,но мы этого не увидели ,
а увидели супер результат и бросились строить стратегию.
Хотя может я и ошибаюсь.. не обессудте .
код добавленный показал результат. выполнялось построение стратегии точно как на видео ,только средствами стратежи билдер.
 
Да действительно возникает такой бар , продолбался с этой проблемой несколько дней !
Интересно вот что ,все знают откуда пришла эта стратегия и все видели этот сумасшедший результат ,
как только убрался этот бар при помощи кода , результат упал до почти убыточного!
То есть в видео,
был продемонстрирован результат с этой ошибкой ,но мы этого не увидели ,
а увидели супер результат и бросились строить стратегию.
Хотя может я и ошибаюсь.. не обессудте .
код добавленный показал результат. выполнялось построение стратегии точно как на видео ,только средствами стратежи билдер.
я видимо упустил истоки сообщений, не видел видео. киньте ссылку на пост, посмотрю.
 
спасибо, я даже был на этом вэбе )))
да тестер стратегий обнадеживает сильно. сам попадаюсь на это, и слышал мнение что тестеру верить нельзя, поэтому надо прогонять на реплее, а потом на демо. и только потом реал.
 
спасибо, я даже был на этом вэбе )))
да тестер стратегий обнадеживает сильно. сам попадаюсь на это, и слышал мнение что тестеру верить нельзя, поэтому надо прогонять на реплее, а потом на демо. и только потом реал.
Всё верно по этапам обкатки стратегии !
Но здесь немного вопрос в другом ,
то что все видят в результате этого видео - это рез с ошибкой .
Поэтому он такой фантастический.
Да можно исправленную версию про оптимизировать и т.д. , но это уже другая повесть.
Есть данное видео ,в видео есть четкий алгоритм , мы его строим и получаем что то ......
 
Всё верно по этапам обкатки стратегии !
Но здесь немного вопрос в другом ,
то что все видят в результате этого видео - это рез с ошибкой .
Поэтому он такой фантастический.
Да можно исправленную версию про оптимизировать и т.д. , но это уже другая повесть.
Есть данное видео ,в видео есть четкий алгоритм , мы его строим и получаем что то ......
ну автор в видео говорит что это не готовый пример для запуска в работу, он на этом сильно акцентирует внимание. вот чем хороши вэбы от Ланы, там первый слайд и начало каждого вэба начинается с понятие о РИСКАХ. каждый должен понимать это, если не понимаешь рынок научит очень быстро, но больно!!!
 
пробовали новый чарт открыть и по новой загрузить все индикаторы ? глюки случаются , иногда к сожалению .
да попробуйте удалить воркспейс. если не поможет, тогда смотрите в логах что пишет, может есть ошибка в индикаторе, и надо править.
 
ну автор в видео говорит что это не готовый пример для запуска в работу, он на этом сильно акцентирует внимание. вот чем хороши вэбы от Ланы, там первый слайд и начало каждого вэба начинается с понятие о РИСКАХ. каждый должен понимать это, если не понимаешь рынок научит очень быстро, но больно!!!
Всем добрый вечер. Да действительно это пример, учебный пример. И я об этом говорил, что до боевого робота, очень и очень далеко. Это просто 1 кирпичик, плохой или хороший, вам решать. Но я использую его при постооении роботов, это дает смещение вероятности, не 50/50, а чуть по лучше.
Я и не планировал и вряд ли когда выложу боевого робота в свободный доступ + покажу как его запрограммировать. Надеюсь вы меня правильно поймете.
Цель вебинара была другой - постараться донести до трейдеров мысль, что каждую, любую торговую стратегию нужно проверять. Не верить никому на слово. Единственная объективная проверка, это её программирование и тестирование на истории. А для этого нужно уметь программировать. Часто стали в последнее время попадаться "трейдеры" которые верят на слово всяким гуру. И самое плохое, что уверены в том что ТС класная, рабочая, а дело в психологии, в них... и идут на следующие тренинги, по психологии, силе, духа и т.д. А проверить ТС на вшивость не догадываются. И когда им говоришь про это обижаются....
Я рад что хоть несколько человек, попытались что то запрограммировать. Это здорово, это их первый шаг.
 
Назад
Верх Низ