#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
перед циклом