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!!!!!

Comment