簡體   English   中英

需要一個循環來查找某個值在列表的頂部 3rd、中間 3rd 和底部 3rd 中的位置

[英]Need a loop to find where a certain value resides within the top 3rd, middle 3rd and bottom 3rd of a list

我正在使用 Ninjatrader 腳本來查找某個價格所在的酒吧。 到目前為止,我有一個值“價格”,它是列表中的值之一。 所以在柱內有 x 個從低到高的價格,我使用 for 循環來查找這些值。 我需要將列表從高到低排序。 計數會因酒吧而異。 所以說我在列表中有 16 個值。 我需要確定這些值的前 3 位、中位 3 位和后 1/3 位,然后一旦確定將某個“價格”與它所在的三分之一進行比較。 計數會有所不同,並且不會被 3 整除。

for ( double myPrice = Low[0]; myPrice = High[0]; myPrice += Ticksize)
{
    myList.Add(myPrice);
}

從這里我需要弄清楚如何將列表分成三部分,然后檢查 ABC_Price 是否在列表的頂部、中間或底部三分之一,列表從高到低排序。

要了解哪些價格限制划定了清單的三分之一,您可以計算價格清單的 1/3 和 2/3 百分位數。

我們可以使用 0 到 1 范圍內的百分位數來計算這樣的百分位數:

public static double Percentile(IList<double> sortedValues, double percentile)
{
    double realIndex = percentile * (sortedValues.Count - 1);
    int index = (int)realIndex;
    if (index < sortedValues.Count - 1) {
        double fraction = realIndex - index;
        return sortedValues[index] * (1 - fraction) + sortedValues[index + 1] * fraction;
    } else {
        return sortedValues[sortedValues.Count - 1];
    }
}

示例: Percentile(prices, 1.0 / 3.0)得出的價格位於按升序排序的價目表的 1/3 處。

本次測試

double[] prices = { 6.0, 10.0, 10.0, 10.0, 25.0, 30.0, 40.0, 45.0, 50.0, 55.0, 60.0, 100.0, 115.0, 250.0 };
double lowerPriceLimit = Percentile(prices, 1.0 / 3.0);
double upperPriceLimit = Percentile(prices, 2.0 / 3.0);
Console.WriteLine($"Price limits = {lowerPriceLimit:n3}, {upperPriceLimit:n3}");

印刷

Price limits = 26.667, 53.333

這些值是分數,因為列表的 1/3 和 2/3 位於實際列表位置之間。 這意味着該算法適用於任何列表大小。

通過這些計算出lowerPriceLimitupperPriceLimit ,您可以確定價格位於哪個 3rd

if (price <= lowerPriceLimit) {
    // bottom third
} else if (price <= upperPriceLimit) {
    // middle third
} else {
    // top third
}

在比較中是否使用<=<取決於您決定當價格等於其中一個限制時價格必須屬於哪個類別。

感謝您的建議,不幸的是它們不是我想要的。 我有多個問題需要解決:

  1. 循環查找柱內的所有價格。 我使用了一個 for 循環並將它們添加到一個列表中。

  2. 對列表進行排序。 MyList.Sort();

  3. 確定列表的計數,myCount = 除以 3。使用(十進制)Math.Round

  4. 將 List 分為 3 個部分:使用 3 個 for 循環,根據 myCount 在 List 中循環

    for ( double aDouble = myList[myCount - myCount]; aDouble =
    myList[TotalCount - (myCount*2))-2); aDouble += TickSize) { Bottom_List.Add(aDouble); }

5.為每個部分創建一個布爾值:

if (Bottom_List.Contains(myPrice)) BotPrice = true; 否則機器人價格=假;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM