Hi,
I created a strategy based on SampleAtmStrategy and SampleMACrossOver templates, but once the condition it´s met, the strategy disable itself and does not create an order.
I am quite new with code, I have some basic knowlege, but I can´t figure it out myself.
#region Using declarations
using NinjaTrader.Cbi;
using NinjaTrader.NinjaScript.Indicators;
#endregion
//This namespace holds Strategies in this folder and is required. Do not change it.
namespace NinjaTrader.NinjaScript.Strategies
{
public class TESTOrder : Strategy
{
private string atmStrategyId = string.Empty;
private string orderId = string.Empty;
private bool isAtmStrategyCreated;
private TEST TEST1;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
//Description = Custom.Resource.NinjaScriptStrategyDescriptionSampleATMStrategy;
//Name = Custom.Resource.NinjaScriptStrategyNameSampleATMStrategy;
// This strategy has been designed to take advantage of performance gains in Strategy Analyzer optimizations
// See the Help Guide for additional information
IsInstantiatedOnEachOptimizationIteration = false;
}
/*else if (State == State.Configure)
{
}*/
else if (State == State.DataLoaded)
{
AddChartIndicator(TEST(Close, 1, 1));
}
}
protected override void OnBarUpdate()
{
if (CurrentBar < BarsRequiredToTrade)
return;
// HELP DOCUMENTATION REFERENCE: Please see the Help Guide section "Using ATM Strategies" under NinjaScript--> Educational Resources--> http://ninjatrader.com/support/helpGuides/nt8/en-us/using_atm_strategies.htm
// Make sure this strategy does not execute against historical data
if(State == State.Historical)
return;
// Submits an entry market order at the current 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' or your custom strategy name CREATED IN NINJATRADER (SUPERDOM FOR EXAMPLE) FOR THIS TO WORK ****
if (orderId.Length == 0 && atmStrategyId.Length == 0 /*&& Close[0] > Open[0]*/)
{
isAtmStrategyCreated = false; // reset atm strategy created check to false
atmStrategyId = GetAtmStrategyUniqueId();
orderId = GetAtmStrategyUniqueId();
if(CrossAbove(TEST1.Default, TEST1.Value, 1))
{
AtmStrategyCreate(OrderAction.Buy, OrderType.Market, 0, 0, TimeInForce.Day, orderId, "TESTATM", atmStrategyId, (atmCallbackErrorCode, atmCallBackId) =>
{
//check that the atm strategy create did not result in error, and that the requested atm strategy matches the id in callback
if (atmCallbackErrorCode == ErrorCode.NoError && atmCallBackId == atmStrategyId)
isAtmStrategyCreated = true;
});
}
if(CrossBelow(TEST1.Default, TEST1.Value, 1))
{
AtmStrategyCreate(OrderAction.Sell, OrderType.Market, 0, 0, TimeInForce.Day, orderId, "TESTATM", atmStrategyId, (atmCallbackErrorCode, atmCallBackId) =>
{
//check that the atm strategy create did not result in error, and that the requested atm strategy matches the id in callback
if (atmCallbackErrorCode == ErrorCode.NoError && atmCallBackId == atmStrategyId)
isAtmStrategyCreated = true;
});
}
}
// Check that atm strategy was created before checking other properties
if (!isAtmStrategyCreated)
return;
// 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)
{
// Print out some information about the order to the output window
Print($"The entry order average fill price is: {status[0]}");
Print($"The entry order filled amount is: {status[1]}");
Print($"The entry order order state is: {status[2]}");
// 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
else if (atmStrategyId.Length > 0 && GetAtmStrategyMarketPosition(atmStrategyId) == MarketPosition.Flat)
atmStrategyId = string.Empty;
if (atmStrategyId.Length > 0)
{
// You can change the stop price
if (GetAtmStrategyMarketPosition(atmStrategyId) != MarketPosition.Flat)
AtmStrategyChangeStopTarget(0, Low[0] - 3 * TickSize, "STOP1", atmStrategyId);
// Print some information about the strategy to the output window, please note you access the ATM strategy specific position object here
// the ATM would run self contained and would not have an impact on your NinjaScript strategy position and PnL
Print($"The current ATM Strategy market position is: {GetAtmStrategyMarketPosition(atmStrategyId)}");
Print($"The current ATM Strategy position quantity is: {GetAtmStrategyPositionQuantity(atmStrategyId)}");
Print($"The current ATM Strategy average price is: {GetAtmStrategyPositionAveragePrice(atmStrategyId)}");
Print($"The current ATM Strategy Unrealized PnL is: {GetAtmStrategyUnrealizedProfitLoss(atmStrategyId)}");
}
}
}
}
