Как использовать «Цикл For» для закрытия нескольких позиций на покупку и продажу с разными значениями пунктов

#c# #for-loop

Вопрос:

Как я могу использовать «Цикл For» для написания следующего кода для сохранения строк в моем коде? Я пробовал, но застрял в позиции закрытия(позиции); линии. (за использование слова позиция) «Цикл For» должен изменять значения пунктов и позиций. Я новичок — пожалуйста, помогите. Смотрите код ниже:

     // Block One 
foreach (var position in positions)
                if (position.TradeType == TradeType.Buy)
                    if (position.Pips > 22)
                    {
                        ClosePosition(position, 2200);
                    }
            foreach (var position in positions)
                if (position.TradeType == TradeType.Sell)
                    if (position.Pips > 22)
                    {
                        ClosePosition(position, 2200);
                    }

            // Block Two
            foreach (var position in positions)
                if (position.TradeType == TradeType.Buy)
                    if (position.Pips > 21)
                    {
                        ClosePosition(position, 2100);
                    }
            foreach (var position in positions)
                if (position.TradeType == TradeType.Sell)
                    if (position.Pips > 21)
                    {
                        ClosePosition(position, 2100);
                    }

            // Block Three
            foreach (var position in positions)
                if (position.TradeType == TradeType.Buy)
                    if (position.Pips > 20)
                    {
                        ClosePosition(position, 2000);
                    }
            foreach (var position in positions)
                if (position.TradeType == TradeType.Sell)
                    if (position.Pips > 20)
                    {
                        ClosePosition(position, 2000);
                    }
               

 

I have tried the following code, but it is not working.

protected override void OnBar()
        {
            var positions = this.Positions.FindAll("PerfectBot");
            double netProfit = positions.Sum(x => x.NetProfit);
            
            int[] position = new int[3] 
            {
                20,
                21,
                22
            };

            for (int i = 0; i <= 3; i--)
                foreach (int value in position)
                    if (position[i].Contains(int value))
                    if (position.TradeType == TradeType.Sell)
                    if (position.Pips > 22)
                    {
                        ClosePosition(position, 2200);
                    }
}
 

Я хотел бы использовать код в разделе OnBar (); — для использования разных временных рамок.
Я был бы признателен вам за помощь. Хорошего вам дня.

Комментарии:

1. пожалуйста, укажите используемый язык программирования, это поможет

2. В Microsoft C#. Я был бы очень, очень признателен вам за помощь. Хорошего вам дня.

3. читайте о переключателе docs.microsoft.com/en-us/dotnet/csharp/language-reference/…

4. у вас может быть только 1 цикл для… и в этом цикле вы можете выполнить проверку на position.TradeType

5.Важен ли заказ? Я имею в виду, что в исходном коде вы закрываете все TradeType == Buy Pips > 22 позиции и перед обработкой любых TradeType == Sell позиций или более низких Pips значений…

Ответ №1:

Вместо шести foreach циклов, каждый с одним if (с другим if внутри), вы можете объединить их if в один цикл foreach. Плюс я бы посоветовал всегда использовать { } — это делает ваш код более понятным.

 foreach (var position in positions)
{
    if (position.TradeType == TradeType.Buy)
    {
        if (position.Pips > 22)
        {
             ClosePosition(position, 2200);
        }
        else if (position.Pips > 21)
        {
             ClosePosition(position, 2100);
        }
        else if (position.Pips > 20)
        {
             ClosePosition(position, 2000);
        }
    }

    if (position.TradeType == TradeType.Sell)
    {
        if (position.Pips > 22)
        {
            ClosePosition(position, 2200);
        }
        // else if ...
    }

    // etc
}
 

Затем вы можете объединить эти вложенные if s:

     if (position.TradeType == TradeType.Buy amp;amp; position.Pips > 22)
    {
        ClosePosition(position, 2200);
    }
 

Или вы можете использовать a switch в цикле foreach:

    switch (position.TradeType)
   {
      case TradeType.Buy:
        if (position.Pips > 22)
        {
             ClosePosition(position, 2200);
        }
        break;
      case TradeType.Sell:
        if (position.Pips > 22)
        {
            ClosePosition(position, 2200);
        }
        break;
     // etc
   }
 

Используя последнюю версию C#, вы можете сделать ее еще короче:

    switch (position.TradeType)
   {
      case TradeType.Buy when position.Pips > 22:
         ClosePosition(position, 2200);
         break;
      case TradeType.Sell when position.Pips > 22:
         ClosePosition(position, 2200);
         break;
     // etc
   }

 

Комментарии:

1. Ух ты!… Огромное спасибо. Это было действительно полезно.

Ответ №2:

Я предполагаю, что вы хотите, чтобы переработанный код выполнял в основном то же самое в том же порядке, что и ваш исходный код.

Вспомогательная функция

 private static int ResolvePips(int pips)
{
    if (pips > 22) return 2200;
    if (pips > 21) return 2100;
    if (pips > 20) return 2000;
    // whatever works in other cases?
    throw new ArgumentException(nameof(pips));
}
 

Поскольку ваша фактическая ClosePosition подпись одинакова, независимо от того, покупаете вы или продаете, или какое значение пипсов имеет место, вы можете предварительно отфильтровать и предварительно заказать свои товары, а затем просто позвонить ClosePosition с соответствующими параметрами. Нет необходимости иметь несколько строк кода для вызова ClosePosition .

 var preparedPositions = positions
    // no idea what should happen with smaller pips...
    .Where(p => p.Pips > 20)
    // just in case there might be other trade types...
    .Where(p => p.TradeType == TradeType.Buy || p.TradeType == TradeType.Sell)
    // handle highest pips range first
    .OrderByDesc(p => ResolvePips(p.Pips))
    // handle buy before sell
    .ThenByDesc(p => p.TradeType == TradeType.Buy);

foreach (var position in preparedPositions)
{
    ClosePosition(position, ResolvePips(position.Pips));
}
 

Комментарии:

1. Мне очень, очень нравится этот. Огромное спасибо.

2. Я получил этот код ошибки в строке foreach. (Ошибка CS0230: и тип, и идентификатор требуются в инструкции foreach.) Что мне там делать?

3. @MustangSally Изменился… Я закодировал это в браузере, поэтому не получил никакого предупреждения, когда забыл переменную var перед циклом