Я пытаюсь реализовать функцию трейлинг-стопа в C #, аналогичную описанной здесь:
https://www.multicharts.com/trading-software/index.php/SetPercentTrailing
Обычно, если прибыль увеличивается на определенную сумму, а затем падает на определенный процент от этой суммы, ордер закрывается.
К сожалению, по какой-то причине это не работает. Он никогда не выходит, когда есть прибыль, но стоп-лосс работает. У меня нет опыта работы с C #, и, потратив немало времени на это, я озадачен тем, что может пойти не так - я думал, что я могу использовать списки неправильно. Это пишется с помощью QuantConnect / LEAN. Вот что я написал:
// 0.00025m is the conversion factor for profitPercentage into recognizable integers
var profitPercentage = Portfolio[_symbol].UnrealizedProfitPercent / 0.00025m;
var percentages = new List<decimal>();
var profitThreshold = 10;
decimal maxProfit;
decimal trailingPercent = 10;
decimal stopLoss = -10;
if (profitPercentage > profitThreshold)
{
percentages.Add(profitPercentage);
percentages.Sort();
maxProfit = percentages[percentages.Count - 1];
if (profitPercentage < (maxProfit - (maxProfit * trailingPercent)))
{
SetHoldings(_symbol, 0);
percentages.Clear();
position = "none";
}
}
else if (profitPercentage < stopLoss)
{
Console.WriteLine("Profit:" + profitPercentage);
SetHoldings(_symbol, 0);
percentages.Clear();
position = "none";
}
Кажется, что стоп-лосс работает нормально, поэтому profitPercentage
выводит правильные значения. Проблема, похоже, заключается в логике, связанной со списком. Точно так же, если я упросту первое утверждение if следующим образом:
if (profitPercentage > profitThreshold)
{
SetHoldings(_symbol, 0);
}
Это тоже отлично работает.