Трейлинг-стоп не работает должным образом в C # - я неправильно использую списки? - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь реализовать функцию трейлинг-стопа в 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);
}

Это тоже отлично работает.

...