Почему этот код ниндзяскрипта C# не может дождаться своих бычьих-бычьих-медвежьих входных параметров?C#

Место общения программистов C#
Ответить
Anonymous
 Почему этот код ниндзяскрипта C# не может дождаться своих бычьих-бычьих-медвежьих входных параметров?

Сообщение Anonymous »

Цель этого кода — войти в сделку по разворотной модели. В долгосрочной перспективе это будет как минимум одна медвежья свеча, за которой последуют две бычьи свечи. Вход происходит при закрытии второй бычьей свечи. Кажется, что этот код игнорирует параметры направления и вместо этого открывает длинную позицию на большинстве бычьих свечей, следующих за медвежьей, и короткую позицию на тех медвежьих свечах, которые следуют за бычьей.

Код: Выделить всё

using System;
using NinjaTrader.Cbi;
using NinjaTrader.NinjaScript;
#endregion

namespace NinjaTrader.NinjaScript.Strategies
{
public class BullishBearishAtmStrategy : Strategy
{
private string atmStrategyId = string.Empty;
private string orderId = string.Empty;
private bool isAtmCreated = false; // Renamed variable to avoid ambiguity
private bool waitingForNextSetup = false;

protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = "Enter long after a bullish-bullish-bearish sequence, and short after a bearish-bearish-bullish sequence, using the ATM strategy 'BooDeng'.";
Name = "BullishBearishAtmStrategy";
Calculate = Calculate.OnEachTick;
IsInstantiatedOnEachOptimizationIteration = true;
EntriesPerDirection = 1;
EntryHandling = EntryHandling.AllEntries;
IsExitOnSessionCloseStrategy = true;
ExitOnSessionCloseSeconds = 30;
BarsRequiredToTrade = 3;
}
}

protected override void OnBarUpdate()
{
if (CurrentBars[0] < 3 || State == State.Historical)
return;

// Check for Long Entry Setup
bool currentBullish = Close[0] > Open[0];
bool previousBullish = Close[1] > Open[1];
bool secondPreviousBearish = Close[2] < Open[2];

// Check for Short Entry Setup
bool currentBearish = Close[0] < Open[0];
bool previousBearish = Close[1] < Open[1];
bool secondPreviousBullish = Close[2] > Open[2];

// Prevent multiple entries in the same direction by waiting for a setup to complete
if (waitingForNextSetup && Position.MarketPosition == MarketPosition.Flat)
{
waitingForNextSetup = false;
}

// Check for a valid long entry condition
if (!waitingForNextSetup && currentBullish && previousBullish && secondPreviousBearish && Position.MarketPosition == MarketPosition.Flat && orderId.Length == 0 && atmStrategyId.Length == 0)
{
// Reset ATM strategy creation flag
isAtmCreated = false;
atmStrategyId = GetAtmStrategyUniqueId();
orderId = GetAtmStrategyUniqueId();

AtmStrategyCreate(OrderAction.Buy, OrderType.Market, 0, 0, TimeInForce.Gtc, orderId, "BooDeng", atmStrategyId, (atmCallbackErrorCode, atmCallBackId) => {
if (atmCallbackErrorCode == ErrorCode.NoError && atmCallBackId == atmStrategyId)
isAtmCreated = true;
});

// Set the flag to prevent immediate re-entry
waitingForNextSetup = true;
}

// Check for a valid short entry condition
if (!waitingForNextSetup && currentBearish && previousBearish && secondPreviousBullish && Position.MarketPosition == MarketPosition.Flat && orderId.Length == 0 && atmStrategyId.Length == 0)
{
// Reset ATM strategy creation flag
isAtmCreated = false;
atmStrategyId = GetAtmStrategyUniqueId();
orderId = GetAtmStrategyUniqueId();

AtmStrategyCreate(OrderAction.Sell, OrderType.Market, 0, 0, TimeInForce.Gtc, orderId, "BooDeng", atmStrategyId, (atmCallbackErrorCode, atmCallBackId) => {
if (atmCallbackErrorCode == ErrorCode.NoError && atmCallBackId == atmStrategyId)
isAtmCreated = true;
});

// Set the flag to prevent immediate re-entry
waitingForNextSetup = true;
}

// Check if ATM strategy was created
if (!isAtmCreated)
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
if (status.Length > 0)
{
Print("The entry order average fill price is: " + status[0]);
Print("The entry order filled amount is: " + status[1]);
Print("The entry 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;
}
}
else if (atmStrategyId.Length > 0 && GetAtmStrategyMarketPosition(atmStrategyId) == MarketPosition.Flat)
atmStrategyId = string.Empty;

if (atmStrategyId.Length > 0)
{
// Optionally adjust stop/target or track information
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));
}
}
}
}
Я пытался манипулировать значениями «больше/меньше». Я установил параметры с помощью bool и && и не нашел желаемого результата.

Подробнее здесь: https://stackoverflow.com/questions/790 ... bullish-be
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»