【问题标题】:How to test more than one variable in an if statement?如何在 if 语句中测试多个变量?
【发布时间】:2019-10-23 13:14:46
【问题描述】:

我正在尝试在 if 语句中测试多个变量。

double firstPlot = RMMA(MultiMA1types.VWMA, 2, 160, 10, 2, 128, 0.75, 0.5).Values[15][0];
double secondPlot = RMMA(MultiMA1types.VWMA, 2, 160, 10, 2, 128, 0.75, 0.5).Values[14][0];

实际上它们将不止一个变量: 第三个情节 第四情节 …

if(firstPlot < highPrice && firstPlot > lowPrice)

是否可以在 if 语句中一次性测试每个变量,而不必重复 if 语句的次数与变量数相同?就像创建一个变量来收集所有 Plot 并在 if 语句中分别进行测试?

谢谢

【问题讨论】:

  • 可能,但目前还不清楚仅凭此信息究竟如何。它很可能涉及使用某种集合而不是单独的变量。例如,LINQ 将允许您执行 .All() 以针对集合中的所有元素执行测试(以及 .Where() 以选择匹配的元素)。
  • 将绘图实例存储在集合中并使用Enumerable.All
  • 通常使用where子句来区分元素。
  • NinjaTraderNinjaScript 标签对产生此问题的搜索很有帮助。 C#-5.0 也会更具体,因为当前版本的 NinjaTrader 仅限于此。我不能添加标签,如果有更大代表的人愿意这样做。

标签: c# if-statement variables


【解决方案1】:

看起来Values 是一个锯齿状数组,您想从中提取每个底层数组的第一个元素,所以以下应该可以工作:

using System.Collections.Generic;
using System.Linq;
...
double[][] plots = RMMA(MultiMA1types.VWMA, 2, 160, 10, 2, 128, 0.75, 0.5).Values;

IEnumerable<double> firstValues = plots.Select(a => a[0]);

bool allValuesInRange = firstValues.All(v => v < highPrice && v > lowPrice);

在您发表评论后编辑:

NinjaTrader.NinjaScript.Series<double>[] series = 
    RMMA(MultiMA1types.VWMA, 2, 160, 10, 2, 128, 0.75, 0.5).Values;

IEnumerable<double> firstValues = series.Select(s => s[0]);

foreach (double firstValue in firstValues)
{
    Console.WriteLine(firstValue);
}

【讨论】:

  • double[][] 上的错误:无法将类型 'NinjaTrader.NinjaScript.Series []' 隐式转换为 'double' CS0029 93 27
  • 错误:NinjaScript 文件错误代码行列 SampleDisplayBarsAgo.cs 'NinjaTrader.NinjaScript.Series ' 不包含 'First' 的定义,也没有接受 main 的附加方法 'Prime'找到类型为“NinjaTrader.NinjaScript.Series ”的参数 (CSU61) 95 67
  • 它在输出窗口中的闪烁速度非常快,一条错误消息我无法捕捉到打印但是:它关于 systemlinq: +Where Selectarray,iterator2 Ninjascript series 1 [systemdouble][double[]double ] 我看到的方式它您的脚本仅测试 rmma 值中的值。不是全部。
  • @FrankDuc firstValues 是一个可枚举的,你不能打印它。查看更新的代码。
  • 您的代码正在运行,谢谢,但它没有返回或解决我的问题。但那部分不是你的错。如果 i Print(firstValue) 在 if 语句中返回所有来自 RMMA 的图。所以它看起来像它的处理。好消息!但是我的最终变量不会为每个情节返回答案。在 RMMA 图中的 if 语句结果通过一堆公式之后,然后 lambda 从收盘价中选择最接近的答案。该变量是调用 nearclose,我期望 nearclose 为 RMMA 的每个图返回一个结果,但事实并非如此。我哪里做错了?
【解决方案2】:

你可以遍历你的数组吗?例如,像这样:

    private bool CheckValues(/*params here*/)
    {
        var RMMAVals = RMMA(MultiMA1types.VWMA, 2, 160, 10, 2, 128, 0.75, 0.5);
        for (int k = 0;  k<RMMAVals.Length; k++)
        {
            if (RMMAVals[k][0] >= highPrice || RMMAVals[k][0] <= lowPrice)
                return false;
        }
        return true;
    }

【讨论】:

  • RMMA 是一种创建多重移动平均线的工具。 2 是最低周期,160 是最大值,10 是一个区间,这意味着图表中将绘制 15 条移动平均线。我想在 if 语句中测试 9。我为它们中的每一个创建了一个变量 firstPlot,secondPlot,......我会试试你的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
相关资源
最近更新 更多