Hello Jesse, I've completed your hardcoded quantity solution successfully to related thread ( https://ninjatrader.com/support/foru...26#post1189426 ) with shared app
https://ninjatraderecosystem.com/use...ellmkthotkeys/
I've got some questions about the advanced method you showed above.
Can you please explain how you went from
private void On_Quantity_Selector_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
NinjaTrader.Gui.Tools.QuantityUpDown qs = send er as NinjaTrader.Gui.Tools.QuantityUpDown;
if( e.Key >= Key.D0 && e.Key <= Key.D9) qs.Con tent = (string)qs.Content + e.Key;
}
to (Taking the expanded version from fx.practice below (post #5)
myQuantityUpDown.PreviewKeyDown += (o, e) =>
{
if (e.Key == Key.Delete || e.Key == Key.Back)
{
e.Handled = true;
spQtySelector1.Value = 0;
}
if ((e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9))
{
e.Handled = true;
string number = e.Key.ToString();
string newnumber = myQuantityUpDown.Value.ToString();
number = number.Replace("NumPad", "");
number = number.Replace("D", "");
int num = int.Parse(newnumber + number);
myQuantityUpDown.Value = num;
NinjaTrader.Gui.Tools.QuantityUpDown qs = o as NinjaTrader.Gui.Tools.QuantityUpDown;
if (qs != null) qs.Value = num;
}
};
It is the first time I see that structure and I'm not sure what to make of it.
I understand the functional part of the code:
Delete or Back key pressed sets the Quantity to zero.
0-9 (main keys or numpad keys) single key or double keys sets the quantity to the typed number.
But I don't understand the use of myQuantityUpDown/spQtySelector1. What does it come from? A custom class or something else?
From comparisons to snippets #1 and #2 below, here's what I've tried to reconstruct from it (with no compile errors).
From snippet #2 example, I added a variable (private QuantityUpDown myQuantityUpDown; ) to assign the "myQuantityUpDown" "method" to.
And i embedded it in the private void On_Quantity_Selector_PreviewKeyDown(object sender, KeyEventArgs e){} method (to test if that was what was needed).
But it seem to be an unusual method. And the Quantity Selector Field is not populated when I type numbers (the Dataseries picker is prompted instead).
the indicator scipt avaiable at
namespace NinjaTrader.NinjaScript.Indicators
{
public class BuyMktSellMktHotkeysQS : Indicator
{
...
// QS
private QuantityUpDown myQuantityUpDown;
...
private void On_Quantity_Selector_PreviewKeyDown(object sender, KeyEventArgs e)
{
myQuantityUpDown.PreviewKeyDown += (o, p) =>
{
if (e.Key == Key.Delete || e.Key == Key.Back)
{
e.Handled = true;
myQuantityUpDown.Value = 0;
}
if ((e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9))
{
e.Handled = true;
string number = e.Key.ToString();
string newnumber = myQuantityUpDown.Value.ToString();
number = number.Replace("NumPad", "");
number = number.Replace("D", "");
int num = int.Parse(newnumber + number);
myQuantityUpDown.Value = num;
}
};
}
Snippet #1 (from https://ninjatraderecosystem.com/use...ellmkthotkeys/ )
protected void ChartControl_PreviewKeyDown(object sender, KeyEventArgs e)
{
TriggerCustomEvent(o =>
{
Order buyMktOrder = null;
if (Keyboard.IsKeyDown(Key.NumPad7))
{
buyMktOrder = myAccount.CreateOrder(Instrument, OrderAction.Buy, OrderType.Market, OrderEntry.Manual, TimeInForce.Day, 1, 0, 0, "", "buyMktOrder"+DateTime.Now.ToString(), DateTime.MaxValue, null);
}
myAccount.Submit(new[] { buyMktOrder });
}, null);
e.Handled = true;
TriggerCustomEvent(p =>
{
Order sellMktOrder = null;
if (Keyboard.IsKeyDown(Key.NumPad8))
{
sellMktOrder = myAccount.CreateOrder(Instrument, OrderAction.Sell, OrderType.Market, OrderEntry.Manual, TimeInForce.Day, 1, 0, 0, "", "sellMktOrder"+DateTime.Now.ToString(), DateTime.MaxValue, null);
}
myAccount.Submit(new[] { sellMktOrder });
}, null);
e.Handled = true;
}
Snipper #2 ( from this doc: https://ninjatrader.com/support/help...tityupdown.htm )
private AtmStrategy.AtmStrategySelector atmStrategySelector;
...
private DependencyObject LoadXAML()
{
...
// When our ATM selector's selection changes
atmStrategySelector.SelectionChanged += (o, args) =>
{
if (atmStrategySelector.SelectedItem == null)
return;
if (args.AddedItems.Count > 0)
{
// Change the selected TIF in our TIF selector too
AtmStrategy selectedAtmStrategy = args.AddedItems[0] as AtmStrategy;
if (selectedAtmStrategy != null)
tifSelector.SelectedTif = selectedAtmStrategy.TimeInForce;
}
};
}

Leave a comment: