Announcement

Collapse
No announcement yet.

Partner 728x90

Collapse

Custom Button for to close opened position from a strategy

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Custom Button for to close opened position from a strategy


    Hello boys !!!!!

    I need a Button to be able to close the open position in a strategy. If I close the position from the Close Button of the chartPanel, the strategy stops, and I want the strategy to continue running. So I was thinking about a Close Button for trading from an indicator or from the strategy itself.

    Now I have this code but it gives me the following error:

    ChartControl does not contain a definition for MainControl and no accessible extension method MainControl,

    The code I have is the following, but if anyone knows an easier way to create that close button from eun indicator or from a strategy I would greatly appreciate it, especially Chelsea B from NinjaTrader support and Gaby who are experts. The code that gives me an error is the following:​

    [I]#region Using declarations
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    using NinjaTrader.Gui.Chart;
    using NinjaTrader.Gui.Tools;
    using NinjaTrader.NinjaScript.DrawingTools;

    using NinjaTrader.Cbi;
    using NinjaTrader.Core;
    using NinjaTrader.Gui;
    using NinjaTrader.Gui.NinjaScript.AtmStrategy;
    using System.Linq;
    using System.Windows.Data;
    using System.Xml.Linq;
    #endregion

    namespace NinjaTrader.NinjaScript.Strategies
    {
    public class SampleWPFModifications : Strategy
    {

    #region Variables
    private System.Windows.Controls.Button[] chartTraderCustomButtonsArray;
    private bool customCtButtonsActive;
    #endregion

    protected override void OnStateChange()
    {
    if (State == State.SetDefaults)
    {
    Description = @"Estrategia personalizada con botones personalizados en ChartTrader.";
    Name = "SampleWPFModifications";
    Calculate = Calculate.OnEachTick;
    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;
    IsInstantiatedOnEachOptimizationIteration = true;
    }
    else if (State == State.Configure)
    {
    // Inicializar los botones cuando la estrategia se configura
    InitializeButtons();
    }
    else if (State == State.Terminated)
    {
    // Limpiar los botones cuando la estrategia se termina
    CleanUpButtons();
    }
    }

    private void InitializeButtons()
    {
    // Crear botones personalizados para el ChartTrader
    chartTraderCustomButtonsArray = new Button[4];

    for (int i = 0; i < 4; ++i)
    {
    chartTraderCustomButtonsArray[i] = new Button()
    {
    Content = $"Button {i + 1}",
    Height = 30,
    Margin = new Thickness(0, 0, 0, 0),
    Padding = new Thickness(0, 0, 0, 0),
    Style = Application.Current.TryFindResource("BasicEntryBut ton") as Style
    };

    if (i % 3 != 0)
    {
    chartTraderCustomButtonsArray[i].Background = Brushes.Gray;
    chartTraderCustomButtonsArray.BorderBrush = Brushes.DimGray;
    }
    }

    // Asignar el manejador de eventos para el Button 1
    chartTraderCustomButtonsArray[0].Click += Button1_Click;

    // Añadir los botones al ChartControl
    ChartControl.Dispatcher.InvokeAsync(() =>
    {
    foreach (var button in chartTraderCustomButtonsArray)
    {
    // Usar ChartControl.MainPanel para añadir los botones
    ChartControl.MainPanel.Children.Add(button);
    }
    });
    }

    private void CleanUpButtons()
    {
    // Remover los botones del ChartControl cuando la estrategia se termina
    ChartControl.Dispatcher.InvokeAsync(() =>
    {
    foreach (var button in chartTraderCustomButtonsArray)
    {
    // Usar ChartControl.MainPanel para remover los botones
    ChartControl.MainPanel.Children.Remove(button);
    }
    });
    }

    private void Button1_Click(object sender, RoutedEventArgs eventArgs)
    {
    // Verificar si hay órdenes abiertas usando la referencia de la instancia actual (this)
    if (Position.MarketPosition != MarketPosition.Flat)
    {
    // Si no está en posición plana, cerrar la posición con una orden de salida (Exit Long)
    if (Position.MarketPosition == MarketPosition.Long)
    {
    ExitLong();
    Draw.TextFixed(this, "infobox", "Exit Long Order Placed", TextPosition.BottomLeft, Brushes.Green, new SimpleFont("Arial", 25), Brushes.Transparent, Brushes.Transparent, 100);
    }
    }
    else
    {
    Draw.TextFixed(this, "infobox", "No Open Orders", TextPosition.BottomLeft, Brushes.Gray, new SimpleFont("Arial", 25), Brushes.Transparent, Brushes.Transparent, 100);
    }

    ForceRefresh();
    }

    private void ForceRefresh()
    {
    // Método para forzar una actualización en la interfaz
    ChartControl.Dispatcher.InvokeAsync(() =>
    {
    ChartControl.InvalidateVisual();
    });
    }
    }
    }​



    THANK YOU BOYS!!!!!

    #2
    Hello gustavobp,

    ChartControl.MainPanel is not a valid NinjaScript property.

    Where was this suggested to you?

    Below are links to an example of adding buttons.

    Join the official NinjaScript Developer Community for comprehensive resources, documentation, and community support. Build custom indicators and automated strategies for the NinjaTrader platforms with our extensive guides and APIs.
    Chelsea B.NinjaTrader Customer Service

    Comment

    Latest Posts

    Collapse

    Topics Statistics Last Post
    Started by NullPointStrategies, Yesterday, 05:17 AM
    0 responses
    58 views
    0 likes
    Last Post NullPointStrategies  
    Started by argusthome, 03-08-2026, 10:06 AM
    0 responses
    133 views
    0 likes
    Last Post argusthome  
    Started by NabilKhattabi, 03-06-2026, 11:18 AM
    0 responses
    73 views
    0 likes
    Last Post NabilKhattabi  
    Started by Deep42, 03-06-2026, 12:28 AM
    0 responses
    45 views
    0 likes
    Last Post Deep42
    by Deep42
     
    Started by TheRealMorford, 03-05-2026, 06:15 PM
    0 responses
    50 views
    0 likes
    Last Post TheRealMorford  
    Working...
    X