• Demo счет NinjaTrader, регистрируется в брокерской компании NinjaTrader Brokerage . NinjaTrader™, LLC
    Ссылка на демо счет NinjaTrader
    Фид на соединении Continuum/CQG.
    Для справки: Continuum - это брэнд CQG, и ни чем они не отличаются друг от друга.
    Обратите внимание, что в настоящее время CQG не высылает логин и пароль на электронные адреса от mail.ru, bk.ru, list.ru, inbox.ru, поэтому необходимо повторить регистрацию с электронного адреса от другого домейна (yahoo, gmail, и тд).
  • NinjaTrader с зарекомендовавшим себя брокерским сервисом предоставляет наилучшие условия для фьючерсной торговли, включая:
    • Низкие комиссии: Экономьте на торгах через низкие и понятные комиссии
    • Низкая маржа: Всего $50 для микро контрактов
    • Низкие минимумы: Откройте счет от $400
    • Бесплатная платформа: Включает весь необходимый функционал для торговли в реале
  • Уважаемые посетители форума!
    При регистрации на форуме отправляется письмо подтверждения на ваш почтовый ящик, если письмо не пришло, просьба проверить папку "спам" вашего почтового ящика, возможно письмо попало туда.
  • Сколько я реально плачу комиссии?
    Подробнее по ссылке

Программирование АТМ стратегия в стратегии. Создаём вместе.

Iman

Well-Known Member
NinjaTrader
#21
Код:
#region Using declarations
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Xml.Serialization;
using NinjaTrader.Cbi;
using NinjaTrader.Data;
using NinjaTrader.Indicator;
using NinjaTrader.Gui.Chart;
using NinjaTrader.Strategy;
#endregion

// This namespace holds all strategies and is required. Do not change it.
namespace NinjaTrader.Strategy
{
    /// <summary>
    /// Enter the description of your strategy here
    /// </summary>
    [Description("Enter the description of your strategy here")]
    public class ATMstrategyVstrategy : Strategy
    {
        #region Variables
        // Wizard generated variables
        private int _contracts = 1; // Default setting for Contracts
        private string _instrumentName = @"CL 12-15"; // Default setting for Instrument
       
        private int        fast    = 10;
        private int        slow    = 25;
       
        private string    atmStrategyId        = string.Empty;    // Variable to hold the atmStrategyId
        private string    orderId                = string.Empty; // Variable to hold the orderId
        private double    realizedProfitLoss    = 0;            // Variable to hold a specific ATM strategy's profit/loss
        private double    unrealizedProfitLoss= 0;            // Variable to hold a strategy's unrealized profit/loss
        private double    totalPL                = 0;            // Variable to hold the running total of realized profit/loss
       
        private int timeStart               = 100000; // Default setting for TimeStart
        private int timeEnd                 = 230000; // Default setting for TimeEnd
       
        private double  dayTakeProfit       = 1000;
        private double  dayStopLoss         = 1000;
       
        private bool CheckTime()
        {          
            // Проверка диапазона времени
            bool rez=false;
            if (timeStart < timeEnd
            && ToTime(Time[0]) >= timeStart
            && ToTime(Time[0]) < timeEnd)    rez=true;
            if(timeStart > timeEnd) rez=true;
            return rez;
        }
       
        // User defined variables (add any user defined variables below)
        #endregion

        /// <summary>
        /// This method is used to configure the strategy and is called once before any strategy method is called.
        /// </summary>
        protected override void Initialize()
        {
            Add( _instrumentName,PeriodType.Minute,1);
            SMA(Fast).Plots[0].Pen.Color = Color.Orange;
            SMA(Slow).Plots[0].Pen.Color = Color.Green;

            Add(SMA(Fast));
            Add(SMA(Slow));
           
           
            CalculateOnBarClose = true;
        }

        /// <summary>
        /// Called on each bar update event (incoming tick)
        /// </summary>
        protected override void OnBarUpdate()
        {
            //На первом тике начала сессии запоминаем суммарный профит(убыток)
            if (Bars.FirstBarOfSession && FirstTickOfBar)
                priorTradesCumProfit = Performance.AllTrades.TradesPerformance.Currency.CumProfit;

            //Сравниваем разницу профита(убытка) на текущий момент и профит(убыток) на начало сессии
            if (Performance.AllTrades.TradesPerformance.Currency.CumProfit - priorTradesCumProfit >= dayTakeProfit)
                return;
        
            if (Performance.AllTrades.TradesPerformance.Currency.CumProfit - priorTradesCumProfit <= -dayStopLoss)
                return;
           
            /* HELP DOCUMENTATION REFERENCE: Please see the Help Guide section "Using ATM Strategies"
               Make sure this strategy does not execute against historical data */
            if (Historical)
                return;

            /* Submits an entry limit order at the current low price to initiate an ATM Strategy if both order id and strategy id are in a reset state
               **** YOU MUST HAVE AN ATM STRATEGY TEMPLATE NAMED 'AtmStrategyTemplate' CREATED IN NINJATRADER (SUPERDOM FOR EXAMPLE) FOR THIS TO WORK ****/
            if (orderId.Length == 0 && atmStrategyId.Length == 0 && Close[0] > Open[0])
            {
                atmStrategyId = GetAtmStrategyUniqueId();
                orderId = GetAtmStrategyUniqueId();
                AtmStrategyCreate(OrderAction.Buy, OrderType.Market, 0, 0, TimeInForce.Day, orderId, "ATMstrategyVstrategy", atmStrategyId);
            }

            // Check for a pending entry order
            if (orderId.Length > 0)
            {
                string[] status = GetAtmStrategyEntryOrderStatus(orderId);
               
                // If the status call can't find the order specified, the return array length will be zero otherwise it will hold elements
                if (status.GetLength(0) > 0)
                {
                    // If the order state is terminal, reset the order id value
                    if (status[2] == "Filled" || status[2] == "Cancelled" || status[2] == "Rejected")
                        orderId = string.Empty;
                }
            } // If the strategy has terminated reset the strategy id after doing some profit/loss calculations.
            else if (atmStrategyId.Length > 0 && GetAtmStrategyMarketPosition(atmStrategyId) == Cbi.MarketPosition.Flat)
            {
                /* Retrieve the profit or loss from the just-closed ATM strategy and round it to the nearest tick. This only updates after all targets or stops are filled (the position is flat).
                   GetAtmStrategyRealizedProfitLoss can return values such as 99.9999999998 or 100.00000000012, which would be rounded to 100. */
                realizedProfitLoss = Instrument.MasterInstrument.Round2TickSize(GetAtmStrategyRealizedProfitLoss(atmStrategyId));
               
                // Sum the profit to the running total.
                totalPL = totalPL + realizedProfitLoss;
               
                // Reset the strategy id and unrealized profit/loss variables because the strategy is now terminated.
                atmStrategyId = string.Empty;
                unrealizedProfitLoss = 0;
            }
           
            // Make sure atmStrategyId contains a value or GetAtmStrategyUnrealizedProfitLoss() will throw an error.
            if (atmStrategyId.Length > 0)
            {
                unrealizedProfitLoss = Instrument.MasterInstrument.Round2TickSize(GetAtmStrategyUnrealizedProfitLoss(atmStrategyId));
            }
           
            // Concatenate all the information and then draw it onto the chart. '\r\n' basically just means new line.
            string textToDraw = "Unrealized P/L: " + unrealizedProfitLoss.ToString() + "\r\nRealized P/L: " + totalPL.ToString() + "\r\nLast Strategy's P/L: " + realizedProfitLoss.ToString();
            DrawTextFixed("P/L information", textToDraw, TextPosition.BottomRight);
           
            {
            if (CrossAbove(SMA(Fast), SMA(Slow), 1))
                EnterLong();
            else if (CrossBelow(SMA(Fast), SMA(Slow), 1))
                EnterShort();
            }
           
            {          
            if(!CheckTime()) return;
            }

        }
               
        #region Properties
        /// <summary>
        /// </summary>
        [Description("Period for fast MA")]
        [GridCategory("Parameters")]
        public int Fast
        {
            get { return fast; }
            set { fast = Math.Max(1, value); }
        }

        /// <summary>
        /// </summary>
        [Description("Period for slow MA")]
        [GridCategory("Parameters")]
        public int Slow
        {
            get { return slow; }
            set { slow = Math.Max(1, value); }
        }
       
        [Description("Время начала работы робота")]
        [GridCategory("Parameters")]
        [Gui.Design.DisplayName("\t\t\t\t\t\tTimeStart")]
        public int TimeStart
        {
            get { return timeStart; }
            set { timeStart = Math.Max(0, value); }
        }

        [Description("Время окончания работы робота")]
        [GridCategory("Parameters")]
        [Gui.Design.DisplayName("\t\t\t\t\t\tTimeEnd")]
        public int TimeEnd
        {
            get { return timeEnd; }
            set { timeEnd = Math.Max(0, value); }
        }
       
        [Description("Default setting for Instrument")]
        [Category("Parameters")]
        public string Instrument
        {
            get { return _instrumentName; }
            set { _instrumentName = value; }
        }
       
        [Description("The number of contracts to trade")]
        [Category("Parameters")]
        public int Contracts
        {
            get { return _contracts; }
            set { _contracts = Math.Max(1, value); }
        }
        [Description("Ограничить профитом в день")]
        [GridCategory("parameters")]
        public double DayTakeProfit
        {
            get { return dayTakeProfit; }
            set { dayTakeProfit = Math.Max(1, value); }
        }
    
        [Description("Ограничить размером потерь в день")]
        [GridCategory("parameters")]
        public double DayStopLoss
        {
            get { return dayStopLoss; }
            set { dayStopLoss = Math.Max(1, value);}
        }
        #endregion
    }
}
Готово, конечно с ошибками, но цель уже близка.
2 ошибки
piorTradesCumProfit CS0103

string for MasterInstrument CS1061

жду ваших советов и поправок

Спасибо.
 

Вложения

Iman

Well-Known Member
NinjaTrader
#24
Код:
#region Variables
        // Wizard generated variables
        private int _contracts                = 1; // Default setting for Contracts
        private string _instrumentName        = @"CL 12-15"; // Default setting for Instrument
       
        private int        fast                  = 10;
        private int        slow                  = 25;
       
        private string    atmStrategyId          = string.Empty;    // Variable to hold the atmStrategyId
        private string    orderId                  = string.Empty; // Variable to hold the orderId
        private double    realizedProfitLoss      = 0;            // Variable to hold a specific ATM strategy's profit/loss
        private double    unrealizedProfitLoss  = 0;            // Variable to hold a strategy's unrealized profit/loss
        private double    totalPL                  = 0;            // Variable to hold the running total of realized profit/loss
       
        private int timeStart                 = 100000; // Default setting for TimeStart
        private int timeEnd                   = 230000; // Default setting for TimeEnd
       
        private double  dayTakeProfit         = 1000;   // Default setting for DayTakeProfit
        private double  dayStopLoss           = 1000;   // Default setting for DayStopLoss
       
        private IOrder myEntryOrder           = null;
        private IOrder myExitOrder            = null;
        private IOrder stopStrategyLong       = null;
        private IOrder stopStrategyShort      = null;
        private bool haltProcessing           = false;
               
        // User defined variables (add any user defined variables below)
        #endregion
 

Вложения

Последнее редактирование:

Iman

Well-Known Member
NinjaTrader
#29
Логические ошибки, не могу исправить.

Может кто на досуге поправит?

PnL на графике показывает, а в Control centr>strategy не реагирует.
АТМ в пааметрах не срабатывает.

Хотелось бы сделать шаблон атм стратегии.
 

Вложения

  • 7 КБ Просмотры: 7

NT8

Well-Known Member
NinjaTrader
#31
Идея хороша только для обучения программирования. В реальной торговле вы НИКОГДА не заработаете на простой шаблонной стратегии.
 

Iman

Well-Known Member
NinjaTrader
#32
Прекрасные слова. Без хорошей системы ничего не получится.
Идея в том, чтобы не программисту мозно было поместит свою 1) систему-стратегию в шаблон, 2) в параметрах вписать свою АТМ стратегию .
Для начинающих будет прекрасный толчок, я сам понятия не имел о скриптах пока Привал и thinarthrill не подсказали, что и где.
В шаблоне можно реализовать свою идею, проверить и в заклучении отдать программисту на доработку.
 

FoP

New Member
NinjaTrader
#33
Здравтсвуйте! Я хотел бы узнать, если в стратегии нет отдельного параметра atm template, есть ли возможность все таки установить парамертры трейлинг стопа и тд как в atm template strategy? Или нужно чтобы обязательно был прописан этот параметр в стратегии? Например в стандартных стратегиях нет этого парамертра. Как в них прописать этот atm, что бы можно было менять трейлинг стоп и тд? Или sample atm strategy(имеется ввиду там где выбираются стратегии) он и есть, и он будет работать совместно с моей стратегией?Заранее спасибо.
 

Iman

Well-Known Member
NinjaTrader
#35
Здравтсвуйте! Я хотел бы узнать, если в стратегии нет отдельного параметра atm template, есть ли возможность все таки установить парамертры трейлинг стопа и тд как в atm template strategy? Или нужно чтобы обязательно был прописан этот параметр в стратегии? Например в стандартных стратегиях нет этого парамертра. Как в них прописать этот atm, что бы можно было менять трейлинг стоп и тд? Или sample atm strategy(имеется ввиду там где выбираются стратегии) он и есть, и он будет работать совместно с моей стратегией?Заранее спасибо.
Привет. Если тебе нужен только триллинг стоп, то он есть в визарде и можно вывести его в параметрах, а там устанавливать кол-во тиков. Иначе, можешь собрать стратегию в визарде, скопировать её код и поместить в sample atm strategy, а после...

2016-11-21 at 19-39-10.png
 

FoP

New Member
NinjaTrader
#36
Привет! Я просто хотел бы в стратегии вывести параметр atm template что бы можно было через стакан выставлять в atm strategy название стратегии и свои параметры стоп, тейк, трал. Как это сделать, просто через edit strategy добавить параметр atm template или нужно еще код прописать в стратегии?
 

Iman

Well-Known Member
NinjaTrader
#37
Привет! Я просто хотел бы в стратегии вывести параметр atm template что бы можно было через стакан выставлять в atm strategy название стратегии и свои параметры стоп, тейк, трал. Как это сделать, просто через edit strategy добавить параметр atm template или нужно еще код прописать в стратегии?
1. Собери стратегию в edit strategy, его также называют Strategy Wizard. Доп. инфо. почитай Control Center>Help>Help или F1.
2. После перенесём этот код в SampleATMStrategy (поменяем название, настроишь АТМ т.д.)

2016-11-27 at 16-20-34.png
 

Muratik

Well-Known Member
NinjaTrader
#39
Идея в том, чтобы не программисту мозно было поместит свою 1) систему-стратегию в шаблон, 2) в параметрах вписать свою АТМ стратегию .
Для начинающих будет прекрасный толчок, я сам понятия не имел о скриптах пока Привал и thinarthrill не подсказали, что и где.
В шаблоне можно реализовать свою идею, проверить и в заклучении отдать программисту на доработку.
Я хотел бы узнать, если в стратегии нет отдельного параметра atm template, есть ли возможность все таки установить парамертры трейлинг стопа и тд как в atm template strategy? Или нужно чтобы обязательно был прописан этот параметр в стратегии? Например в стандартных стратегиях нет этого парамертра. Как в них прописать этот atm, что бы можно было менять трейлинг стоп и тд? Или sample atm strategy(имеется ввиду там где выбираются стратегии) он и есть, и он будет работать совместно с моей стратегией?
Здравствуйте!

Не даёт покоя ситуация, когда в NT8, стратегии, в которых вставляется название ATM, не бэктестятся в StrategyAnalyzer.

В продолжение темы и в продолжение поиска решения мыслишки/вопросы/идейки/просьбы:

Можно в стратегию (WCCIautotrader) добавить не название ATM, а её программный аналог?
Идея такая:
Собираем нужную ATM со всеми безубытками-стопами-таргетами-трейлингами в модуле стакана или чарт трейдера. Собранную ATM сама NinjaTrader "видит" как программный код? Да? Нет?
Если Да, то, скорее всего, можно как то "вытащить" этот код в отдельный скрипт (или часть кода?) что бы вставлять его в стратегию, допустим, вместо названия ATM. В таком виде StrategyAnalyzer, скорее, всего примет ATM и позволит нормально проводить тестирование/оптимизацию стратегии/робота с ATM стратегией.

Возможность есть. Но это нужно вручную все программировать.
sample atm strategy - как раз пример такого.
Можно эту SampleAtmStrategy задействовать в этих же целях? Может на её основе? Если можно то как вставлять SampleAtmStrategy со своими параметрами в, допустим, WCCIautotrader?

Вообще, хорошо бы разобрать все возможности и способности SampleAtmStrategy скрупулёзнее, детальнее. Может в отдельной теме?

Спасибо!
 

NT8

Well-Known Member
NinjaTrader
#40
Сколько раз еще повторить?
АТМ стратегии ТОЛЬКО для реал-тайма и не подлежат тестированию на истории.

Функционал любой АТМ стратегии можно повторить и в обычной стратегии. Но для этого нужно программировать.
 
Вверх Снизу