левые котировки

Страницы: 1
RSS
левые котировки, getCandlesByIndex()
 
добрый день!

беру данные так:
Код
    local num = getNumCandles(graphId)
    local candles, num, _ = getCandlesByIndex(graphId,0,0,num)

Возникают две проблемы, которые есть суть одной.
Если вот так я хочу перебрать внутри свечки все значения с минимальным шагом инструмента (MinPriceStep), то...

Код
        for z = candles[i].low, candles[i].high, MinPriceStep do
...то:
1. candles[i].low фьючерса нефти, например, может оказаться такой: 73.270000000001 при шаге цены 0.01
2. в результате такой штуки цикл регулярно выполняется на итерацию меньше (что, в общем, понятно, когда low или high на 0.00000000001 больше или меньше допустимой

Как бы вопрос-то сформулировать...
ЧТО ЗА ФИГНЯ?! :)
 
Цитата
sergei написал:
ЧТО ЗА ФИГНЯ?! :)

это особенность типа данных с плавающей точкой.
Почитать что это такое можно в википедии
https://ru.wikipedia.org/wiki/Число_с_плавающей_запятой
 
Цитата
Sergey Gorokhov написал:
Цитата
sergei написал:
ЧТО ЗА ФИГНЯ?! :)

это особенность типа данных с плавающей точкой.
Почитать что это такое можно в википедии
https://ru.wikipedia.org/wiki/Число_с_плавающей_запятой
Сергей, как корректно округлить до нужного знака, чтобы в итоге не получить новое подобное число?
Насколько плохая идея использовать в таблицах индексы в виде чисел с плавающей точкой?
 
Цитата
sergei написал:
Сергей, как корректно округлить до нужного знака, чтобы в итоге не получить новое подобное число?
Округлять имеет смысл только при выводе данных.
Функции по округлению не раз приводились на форуме
например
https://forum.quik.ru/messages/forum10/message35034/topic4042/#message35034

Цитата
sergei написал:
Насколько плохая идея использовать в таблицах индексы в виде чисел с плавающей точкой?

Вопрос не понятен, просьба уточнить подробней что имеется ввиду, можно на примере.
 
Цитата
Sergey Gorokhov написал:

Цитата
sergei написал:
Насколько плохая идея использовать в таблицах индексы в виде чисел с плавающей точкой?

Вопрос не понятен, просьба уточнить подробней что имеется ввиду, можно на примере.
Код
        for z = candles[i].low, candles[i].high, MinPriceStep do
            ZZZ[z] = ZZZ[z] + что-то
        end
Сейчас мне кажется, что подобные конструкции совершенно непредсказуемы, т.к.

z может принимать значения на 0.000000000001 больше или меньше ожидавшегося, в результате чего вместо суммирования значений в одном ZZZ[67.55] мы можем получить до трех или более разных ZZZ: ZZZ[67.5499999999999], ZZZ[67.55], ZZZ[67.5500000000001]
 
Цитата
          for  z  =  candles[i].low, candles[i].high, MinPriceStep  do  
Код
            ZZZ[z]  =  ZZZ[z]  +  что - то
         end   
Сейчас мне кажется, что подобные конструкции совершенно непредсказуемы, т.к.

z может принимать значения на 0.000000000001 больше или меньше ожидавшегося, в результате чего вместо суммирования значений в одном ZZZ[67.55] мы можем получить до трех или более разных ZZZ: ZZZ[67.5499999999999], ZZZ[67.55], ZZZ[67.5500000000001]
Кроме того, еще и ошибки полезут, когда ZZZ[z] внезапно окажется nil вопреки ожиданиям
 
sergei,
Тогда Вы можете округлить значения перед использованием
 
Сергей, что-то даже с округлением не получается.
Код
graphId = "BRK9"
candleCount = 100
MinPriceStep = 0.01

function math.round(value, p)
    local e = 10 ^ (p or 0)
    if value >= 0 then return math.floor(tonumber(value) * e + 0.5) / e
    else return math.ceil(tonumber(value) * e - 0.5) / e end
end


local num = getNumCandles(graphId)
local candles, num, _ = getCandlesByIndex(graphId,0,0,num)
local lst = ""
ff = io.open(getScriptPath().."\\".."tst.txt", "w+t")

for i = num-1, num-candleCount, -1 do
    for ii = math.round(candles[i].low, 2), math.round(candles[i].high, 2), math.round(MinPriceStep, 2) do
        lst = lst..i.." --- "..ii.." --- "..candles[i].low..", "..candles[i].high.."\n"
    end
end

ff:write("============\n\n"..lst)
ff:flush()
ff:close()

Результат на текущий момент на фьючерсе BRK9:
Цитата
7044 --- 73.66 --- 73.66, 73.71
7044 --- 73.67 --- 73.66, 73.71
7044 --- 73.68 --- 73.66, 73.71
7044 --- 73.69 --- 73.66, 73.71
7044 --- 73.7 --- 73.66, 73.71
нет шага для 73.71
7043 --- 73.58 --- 73.58, 73.7
7043 --- 73.59 --- 73.58, 73.7
7043 --- 73.6 --- 73.58, 73.7
7043 --- 73.61 --- 73.58, 73.7
7043 --- 73.62 --- 73.58, 73.7
7043 --- 73.63 --- 73.58, 73.7
7043 --- 73.64 --- 73.58, 73.7
7043 --- 73.65 --- 73.58, 73.7
7043 --- 73.66 --- 73.58, 73.7
7043 --- 73.67 --- 73.58, 73.7
7043 --- 73.68 --- 73.58, 73.7
7043 --- 73.69 --- 73.58, 73.7
нет шага для 73.70
7042 --- 73.56 --- 73.56, 73.67
7042 --- 73.57 --- 73.56, 73.67
7042 --- 73.58 --- 73.56, 73.67
7042 --- 73.59 --- 73.56, 73.67
7042 --- 73.6 --- 73.56, 73.67
7042 --- 73.61 --- 73.56, 73.67
...

7019 --- 73.95 --- 73.71, 73.96
7018 --- 72.1 --- 72.1, 73.95
7018 --- 72.11 --- 72.1, 73.95
7018 --- 72.12 --- 72.1, 73.95
7018 --- 72.13 --- 72.1, 73.95
7018 --- 72.14 --- 72.1, 73.95
7018 --- 72.15 --- 72.1, 73.95
7018 --- 72.16 --- 72.1, 73.95
7018 --- 72.17 --- 72.1, 73.95
7018 --- 72.18 --- 72.1, 73.95
7018 --- 72.19 --- 72.1, 73.95
7018 --- 72.2 --- 72.1, 73.95
7018 --- 72.21 --- 72.1, 73.95
7018 --- 72.22 --- 72.1, 73.95
7018 --- 72.23 --- 72.1, 73.95
7018 --- 72.24 --- 72.1, 73.95
7018 --- 72.25 --- 72.1, 73.95
7018 --- 72.26 --- 72.1, 73.95
7018 --- 72.27 --- 72.1, 73.95
7018 --- 72.28 --- 72.1, 73.95
7018 --- 72.29 --- 72.1, 73.95
7018 --- 72.3 --- 72.1, 73.95
7018 --- 72.31 --- 72.1, 73.95
7018 --- 72.32 --- 72.1, 73.95
7018 --- 72.33 --- 72.1, 73.95
7018 --- 72.34 --- 72.1, 73.95
7018 --- 72.35 --- 72.1, 73.95
7018 --- 72.36 --- 72.1, 73.95
7018 --- 72.37 --- 72.1, 73.95
7018 --- 72.38 --- 72.1, 73.95
7018 --- 72.39 --- 72.1, 73.95
7018 --- 72.4 --- 72.1, 73.95
7018 --- 72.41 --- 72.1, 73.95
7018 --- 72.42 --- 72.1, 73.95
7018 --- 72.43 --- 72.1, 73.95
7018 --- 72.44 --- 72.1, 73.95
7018 --- 72.45 --- 72.1, 73.95
7018 --- 72.46 --- 72.1, 73.95
7018 --- 72.47 --- 72.1, 73.95
7018 --- 72.48 --- 72.1, 73.95
7018 --- 72.49 --- 72.1, 73.95
7018 --- 72.5 --- 72.1, 73.95
7018 --- 72.51 --- 72.1, 73.95
7018 --- 72.52 --- 72.1, 73.95
7018 --- 72.53 --- 72.1, 73.95
7018 --- 72.54 --- 72.1, 73.95
7018 --- 72.55 --- 72.1, 73.95
7018 --- 72.56 --- 72.1, 73.95
7018 --- 72.57 --- 72.1, 73.95
7018 --- 72.58 --- 72.1, 73.95
7018 --- 72.59 --- 72.1, 73.95
7018 --- 72.6 --- 72.1, 73.95
7018 --- 72.61 --- 72.1, 73.95
7018 --- 72.62 --- 72.1, 73.95
7018 --- 72.63 --- 72.1, 73.95
7018 --- 72.64 --- 72.1, 73.95
7018 --- 72.65 --- 72.1, 73.95
7018 --- 72.66 --- 72.1, 73.95
7018 --- 72.67 --- 72.1, 73.95
7018 --- 72.68 --- 72.1, 73.95
7018 --- 72.69 --- 72.1, 73.95
7018 --- 72.7 --- 72.1, 73.95
7018 --- 72.71 --- 72.1, 73.95
7018 --- 72.72 --- 72.1, 73.95
7018 --- 72.73 --- 72.1, 73.95
7018 --- 72.74 --- 72.1, 73.95
7018 --- 72.75 --- 72.1, 73.95
7018 --- 72.76 --- 72.1, 73.95
7018 --- 72.77 --- 72.1, 73.95
7018 --- 72.78 --- 72.1, 73.95
7018 --- 72.79 --- 72.1, 73.95
7018 --- 72.8 --- 72.1, 73.95
7018 --- 72.81 --- 72.1, 73.95
7018 --- 72.82 --- 72.1, 73.95
7018 --- 72.83 --- 72.1, 73.95
7018 --- 72.84 --- 72.1, 73.95
7018 --- 72.85 --- 72.1, 73.95
7018 --- 72.86 --- 72.1, 73.95
7018 --- 72.87 --- 72.1, 73.95
7018 --- 72.88 --- 72.1, 73.95
7018 --- 72.89 --- 72.1, 73.95
7018 --- 72.9 --- 72.1, 73.95
7018 --- 72.91 --- 72.1, 73.95
7018 --- 72.92 --- 72.1, 73.95
7018 --- 72.93 --- 72.1, 73.95
7018 --- 72.94 --- 72.1, 73.95
7018 --- 72.95 --- 72.1, 73.95
7018 --- 72.96 --- 72.1, 73.95
7018 --- 72.97 --- 72.1, 73.95
7018 --- 72.98 --- 72.1, 73.95
7018 --- 72.99 --- 72.1, 73.95
7018 --- 73 --- 72.1, 73.95
7018 --- 73.01 --- 72.1, 73.95
7018 --- 73.02 --- 72.1, 73.95
7018 --- 73.03 --- 72.1, 73.95
7018 --- 73.04 --- 72.1, 73.95
7018 --- 73.05 --- 72.1, 73.95
7018 --- 73.06 --- 72.1, 73.95
7018 --- 73.07 --- 72.1, 73.95
7018 --- 73.08 --- 72.1, 73.95
7018 --- 73.090000000001 --- 72.1, 73.95
7018 --- 73.100000000001 --- 72.1, 73.95
7018 --- 73.110000000001 --- 72.1, 73.95
7018 --- 73.120000000001 --- 72.1, 73.95
7018 --- 73.130000000001 --- 72.1, 73.95
7018 --- 73.140000000001 --- 72.1, 73.95
7018 --- 73.150000000001 --- 72.1, 73.95
7018 --- 73.160000000001 --- 72.1, 73.95
7018 --- 73.170000000001 --- 72.1, 73.95
7018 --- 73.180000000001 --- 72.1, 73.95
7018 --- 73.190000000001 --- 72.1, 73.95
7018 --- 73.200000000001 --- 72.1, 73.95
7018 --- 73.210000000001 --- 72.1, 73.95
7018 --- 73.220000000001 --- 72.1, 73.95
7018 --- 73.230000000001 --- 72.1, 73.95
7018 --- 73.240000000001 --- 72.1, 73.95
7018 --- 73.250000000001 --- 72.1, 73.95
7018 --- 73.260000000001 --- 72.1, 73.95
7018 --- 73.270000000001 --- 72.1, 73.95
7018 --- 73.280000000001 --- 72.1, 73.95
7018 --- 73.290000000001 --- 72.1, 73.95
7018 --- 73.300000000001 --- 72.1, 73.95
7018 --- 73.310000000001 --- 72.1, 73.95
7018 --- 73.320000000001 --- 72.1, 73.95
7018 --- 73.330000000001 --- 72.1, 73.95
7018 --- 73.340000000001 --- 72.1, 73.95
7018 --- 73.350000000001 --- 72.1, 73.95
7018 --- 73.360000000001 --- 72.1, 73.95
7018 --- 73.370000000001 --- 72.1, 73.95
7018 --- 73.380000000001 --- 72.1, 73.95
7018 --- 73.390000000001 --- 72.1, 73.95
7018 --- 73.400000000001 --- 72.1, 73.95
7018 --- 73.410000000001 --- 72.1, 73.95
7018 --- 73.420000000001 --- 72.1, 73.95
7018 --- 73.430000000001 --- 72.1, 73.95
7018 --- 73.440000000001 --- 72.1, 73.95
7018 --- 73.450000000001 --- 72.1, 73.95
7018 --- 73.460000000001 --- 72.1, 73.95
7018 --- 73.470000000001 --- 72.1, 73.95
7018 --- 73.480000000001 --- 72.1, 73.95
7018 --- 73.490000000001 --- 72.1, 73.95
7018 --- 73.500000000001 --- 72.1, 73.95
7018 --- 73.510000000001 --- 72.1, 73.95
7018 --- 73.520000000001 --- 72.1, 73.95
7018 --- 73.530000000001 --- 72.1, 73.95
7018 --- 73.540000000001 --- 72.1, 73.95
7018 --- 73.550000000001 --- 72.1, 73.95
7018 --- 73.560000000001 --- 72.1, 73.95
7018 --- 73.570000000001 --- 72.1, 73.95
7018 --- 73.580000000001 --- 72.1, 73.95
7018 --- 73.590000000001 --- 72.1, 73.95
7018 --- 73.600000000001 --- 72.1, 73.95
7018 --- 73.610000000001 --- 72.1, 73.95
7018 --- 73.620000000001 --- 72.1, 73.95
7018 --- 73.630000000001 --- 72.1, 73.95
7018 --- 73.640000000001 --- 72.1, 73.95
7018 --- 73.650000000001 --- 72.1, 73.95
7018 --- 73.660000000001 --- 72.1, 73.95
7018 --- 73.670000000001 --- 72.1, 73.95
7018 --- 73.680000000001 --- 72.1, 73.95
7018 --- 73.690000000001 --- 72.1, 73.95
7018 --- 73.700000000001 --- 72.1, 73.95
7018 --- 73.710000000001 --- 72.1, 73.95
7018 --- 73.720000000001 --- 72.1, 73.95
7018 --- 73.730000000001 --- 72.1, 73.95
7018 --- 73.740000000001 --- 72.1, 73.95
7018 --- 73.750000000001 --- 72.1, 73.95
7018 --- 73.760000000001 --- 72.1, 73.95
7018 --- 73.770000000001 --- 72.1, 73.95
7018 --- 73.780000000001 --- 72.1, 73.95
7018 --- 73.790000000001 --- 72.1, 73.95
7018 --- 73.800000000001 --- 72.1, 73.95
7018 --- 73.810000000001 --- 72.1, 73.95
7018 --- 73.820000000001 --- 72.1, 73.95
7018 --- 73.830000000001 --- 72.1, 73.95
7018 --- 73.840000000001 --- 72.1, 73.95
7018 --- 73.850000000001 --- 72.1, 73.95
7018 --- 73.860000000001 --- 72.1, 73.95
7018 --- 73.870000000001 --- 72.1, 73.95
7018 --- 73.880000000001 --- 72.1, 73.95
7018 --- 73.890000000001 --- 72.1, 73.95
7018 --- 73.900000000001 --- 72.1, 73.95
7018 --- 73.910000000001 --- 72.1, 73.95
7018 --- 73.920000000001 --- 72.1, 73.95
7018 --- 73.930000000001 --- 72.1, 73.95
7018 --- 73.940000000001 --- 72.1, 73.95
7017 --- 72.06 --- 72.06, 72.09
7017 --- 72.07 --- 72.06, 72.09
7017 --- 72.08 --- 72.06, 72.09
7016 --- 72.07 --- 72.07, 72.09
7016 --- 72.08 --- 72.07, 72.09
7016 --- 72.09 --- 72.07, 72.09
7015 --- 72.07 --- 72.07, 72.08
7015 --- 72.08 --- 72.07, 72.08
7014 --- 72.07 --- 72.07, 72.09
7014 --- 72.08 --- 72.07, 72.09
 
Цитата
sergei написал:
Сергей, что-то даже с округлением не получается.

Значения округляются там где Вы их округляете.
Вы округляете в for, а не там где происходит передача данных в lst
 
Цитата
Sergey Gorokhov написал:
Цитата
sergei написал:
Сергей, что-то даже с округлением не получается.

Значения округляются там где Вы их округляете.
Вы округляете в for, а не там где происходит передача данных в lst
Я не понимаю, как внутри цикла ii может не быть округлено.

Да, я пытался делать так:

Код
        lst = lst..i.." --- "..math.round(ii,2).." --- "..candles[i].low..", "..candles[i].high.."\n"

...и тогда пишет округленное в файл, но, блин, мне при любом использовании ii писать его через функцию округления?!
Как это - округление работает только в момент округления? :)
 
Кроме того, вот на первых свечках вообще не видно проблемы с 000000001, но цикл не доходит одну итерацию. Почему?
 
Цитата
sergei написал:
...и тогда пишет округленное в файл, но, блин, мне при любом использовании ii писать его через функцию округления?!Как это - округление работает только в момент округления? :)

Что именно не понятно?
Вы округляли только стартовое значение ii, а не все которые рождаются при переборе цикла.
Кто сказал что округлив самое первое значение цикла все остальные тоже округлятся? нигде такого в программировании нет, и LUA не исключение.
Хотите видеть округленное значение так и округляйте это значение, а не первую цифру в цикле.
И кто мешает один раз округлить полученную цифру и сохранить ее в переменной?
   for ii = candles[i].low, candles[i].high, MinPriceStep do
       local round_ii = math.round(ii,2)
       lst = lst..i.." --- "..round_ii.." --- "..candles[i].low..", "..candles[i].high.."\n"
   end

Цитата
sergei написал:
Кроме того, вот на первых свечках вообще не видно проблемы с 000000001
Это не имеет значения, появление 000000001 может произойти при любой арифметической операции.
Например:
message(tostring(124.4 - 124.3))
выдаст 0.10000000000001

Цитата
sergei написал:
но цикл не доходит одну итерацию. Почему?
не понятно что имеется ввиду.
 
Цитата
появление 000000001 может произойти при любой арифметической операции.

Этого не хватало для понимания проблемы. Спасибо!

Наличие погрешности при простом запросе свечки в виде candles[i].low без необходимости каких-либо операций даже внутри функции
getCandlesByIndex все равно выглядит странно как-то. Эта функция же просто стат. данные выдает. Как там эти эффекты от плавающей точки появляются - загадка для меня :)


Цитата
Цитата
sergei написал:
но цикл не доходит одну итерацию. Почему?
не понятно что имеется ввиду.
Вот в этом цикле:
Код
        for z = candles[i].low, candles[i].high, MinPriceStep do
Последняя итерация должна бы проходить для z == candles[i].high, а фактически последней является z == candles[i].high - MinPriceStep
 
Цитата
sergei написал:
Наличие погрешности при простом запросе свечки в виде candles.low без необходимости каких-либо операций даже внутри функции
getCandlesByIndex все равно выглядит странно как-то. Эта функция же просто стат. данные выдает.
Так она просто стат. данные и выдает. У вас значения типа 73.940000000001 возникают при исполнении оператора for, где выполняется вычитание шага (Руководство 3.3.5).
Попробуйте сперва вычислять количество уровней свечи: local qty_levels = math.round ((candles[i].high - candles[i].low) / MinPriceStep), а затем уже выполняйте цикл for ii = 1, qty_levels  do block end.
Страницы: 1
Читают тему
Наверх