PFelix написал: Если есть, -- Где такие заявки "хранятся" (брокер / биржа)?
В QUIK есть свои собственные айсберг заявки, это отдельный алго-модуль Они хранятся на сервере QUIK И они работают как с ФОРТС так и с другими рынками.
PFelix написал: Есть ли в "арсенале" QLUA нечто специально "заточненное", чтобы программно "понять", что "данный" сервер какие-то нужные скрипту "параметры" НЕ транслирует?
такой возможности нет. Можно толь проверить получает ли скрипт данные или нет. Если не получает значит что то не так.
PFelix, Стопы хранятся на сервере брокера и их обрабатывает непосредственно сервер QUIK по поступающей с биржи информации. Таким образом, если забыть про то зачем в принципе созданы стопы, то по сравнению с лимитками они лучше тем что транзакция уходит до биржи сразу с сервера QUIK. Например это полезно как раз если канал от терминала до брокера слишком медленный. Если интересуют какие-то другие аспекты "обработки" готовы ответить на конкретные вопросы.
Женя Логинов написал: В ваших мануалах указывается, что для снижения нагрузок и проч, квик не передаёт отдельно каждое обновление по котировкам, а накапливает данные с одинаковыми параметрами цены, и выдаёт разом все... я так понял.
Термин "накапливает" тут неуместен, он не накапливает а передает срезами, т.е. раз в период. Это значит раз в период шлюз отправляет запрос на биржу и получает ответ в виде текущей картины стакана.
Цитата
Женя Логинов написал: В общем ключевой момент 300мс и он был в вашем мануале. Не помню с точностью до страницы, но я его не выдумал.
Речь идет про параметр таймаута между запросами, сейчас в дистрибутиве он установлен в 100мс Как оно настроено у брокера, вопрос к брокеру.
VNG_nemo написал: Это была шутка? Сергей, все осталось без изменения. В диалоговом окне редактирования линия указана дашдот, а на чарте сплошная.
Это не шутка, линия TYPE_DASHDOT масштабируется вместе с графиком. т.е. если на графике много свечек то визуально будет сплошная линия, если мало свечек то будет видно точка тире.
Цитата
VNG_nemo написал: Кроме того, прошу Вас ответить на вопрос выше - как такое может быть, что на Н4 и ниже все норм, а при переходе на дневки и выше массив перестает переиндексироваться.
VNG_nemo написал: Локализовал проблему о которой писАл выше. Если в код Init() в цикл добавить отладочные выражения, то видно, что в строке tposixByTime[tDT[k]] = k не происходит присваивания и длина массива равна нулю, хотя с массивом tDT[k] все ОК, и его длина при проверке после выхода из цикла равна количеству свечей. В чем засада? З.Ы. На ТФ Н4 все работает, на дневном - нет.
Код
for k = 0 ,NmbrOfCandles - 1 do
count = count + 1 ; if count > 100000 then break end ;
--преобразуем в POSIX-формат поле datetime
--транспонируем таблицу - индексируем по времени
tDT[k] = os.time (t[k].datetime);
tposixByTime[tDT[k]] = k;
if k = = 1 then
message ( "Init_tDT_ " .. tostring(tDT[k]))
end
if k = = NmbrOfCandles - 1 then
message ( "Init_tDT_tposixByTime_ " .. tostring( # tDT) .. " " .. tostring( # tposixByTime))
end
end
2.5.5 – The Length Operator The length operator is denoted by the unary operator #. The length of a string is its number of bytes (that is, the usual meaning of string length when each character is one byte).
The length of a table t is defined to be any integer index n such that t[n] is not nil and t[n+1] is nil; moreover, if t[1] is nil, n can be zero. For a regular array, with non-nil values from 1 to a given n, its length is exactly that n, the index of its last value. If the array has "holes" (that is, nil values between other non-nil values), then #t can be any of the indices that directly precedes a nil value (that is, it may consider any such nil value as the end of the array).
Алексей Ч написал: Если 5000 раз вызывать функцию math.random(1, 999), то какова вероятность получать одинаковые числа? Мне опять почему то сильно кажется, то вероятность будет равна 100%
Ну так ведь 5000 в ~5 раз больше чем 999, так что да 100% будут повторения. И что в этом удивительного?
zv78 написал: зачем под цифрой 1 в примере заводится функция которая не имеет имени?
она не заводится. а ВЫводится. т.е результат функции cached_EMA будет функция. По простому, это нужно для того чтобы в рамках одного кода можно было сделать сколько угодно функций расчета MA каждая со своими параметрами и чтобы они не пересекались. Например MA1 = cached_EMA() MA2 = cached_EMA() MA3 = cached_EMA() и т.д.
PFelix написал: А сам факт множественной подписки и отписки брокеру -- только "на руку", т.к. 85-90%% времени трафика именно по стаканам удается сократить?
От сервера до биржи подписка одна на всех, так что трафик до биржи не страдает, а на трафик от сервера до клиентов брокеру все равно, тем более что по стаканам он не существенный.
Цитата
PFelix написал: А сами команды подписаться/отписаться, которые по 30 инструментам следуют парами 1 раз в каждые 2-3 минуты -- для брокера "не забота"?
1 раз в каждые 2-3 минуты, это мало, скорей всего брокер даже не заметит.
Здравствуйте, Проверьте внимательней, линии должны быть описаны в Settings и функция Init() должна возвращать количество линий в Settings Если разобраться не получится выложите код индикатора.
Описанная в данном инциденте проблема проявляется из-за наличия ошибки в ПО терминала QUIK, а именно, в неверном преобразовании количества в ответах на транзакии по снятию заявок.
Данная ошибка будет исправлена в одной из очередных версия терминала QUIK.
Здравствуйте, Главное чтобы одновременно в терминале и во всех lua скриптах, заказывалось стаканов не более чем по 200 инструментов. Сразу оговорка, что заказ нескольких стаканов по одному инструменту является одним заказом, а не несколькими. 30 инструментов (как у Вас) это ничтожно мало, так что проблем не должно возникнуть, при условии что другой скрипт (или терминал) не закажет еще стаканы.
В чем основная причина отличий данных в таблице обезличенных сделок у различных брокеров, если все они получают один поток, или не один?, Количество пустых интервалов при трансформации потока обезличенных сделок в секундные свечи по одному и тому же интсрументу (в моем случае РТС срочного рынка) может отличаться почти в 2 раза за один и тот же период при обработке одной и той же программой
Михаил Сурцуков написал: Так это ясно из скрипта откуда что берется и как конфигурируется.
Давайте еще раз. Вы говорите что на разных брокерах один и тот же скрипт работает по разному, вполне логично что очень хочется выяснить чем брокера отличаются, так? Как это можно выяснить по срипту? Да никак.
Может всё таки сравните исходные данные или и дальше будем по кругу одно и тоже повторять? Исходные данные это то с чем работает скрипт. Содержимое таблицы обезличенных сделок. То что получается в txt файле при сохранении тикового графика в файл. То что непосредственно попадает в скрипт, а не то что получается после его работы. Как еще проще объяснить?
В чем основная причина отличий данных в таблице обезличенных сделок у различных брокеров, если все они получают один поток, или не один?, Количество пустых интервалов при трансформации потока обезличенных сделок в секундные свечи по одному и тому же интсрументу (в моем случае РТС срочного рынка) может отличаться почти в 2 раза за один и тот же период при обработке одной и той же программой
Михаил Сурцуков написал: Допустим. Вы сможете объяснить, почему один и тот же скрипт выдает различные результаты у различных брокеров с одной и той же версией Квика? Я Вам пришлю эту часть скрипта.
Нет, пока не будет предельно ясно о каких входных данных идет речь и в чем между ними разница.
В чем основная причина отличий данных в таблице обезличенных сделок у различных брокеров, если все они получают один поток, или не один?, Количество пустых интервалов при трансформации потока обезличенных сделок в секундные свечи по одному и тому же интсрументу (в моем случае РТС срочного рынка) может отличаться почти в 2 раза за один и тот же период при обработке одной и той же программой
Михаил Сурцуков, Да это я, и я Вам говорю что в QUIK нет и никогда небыло "секундных интервалов" В QUIK есть просто тики. НЕ секундные интервалы. Разница огромна.
Как уже было сказано, проверить надо исходные данные, а не "секундные интервалы" которые формировал скрипт. И если исходные данные одинаковые, значит проблема в скрипте а не в брокере и иного быть не может.
В чем основная причина отличий данных в таблице обезличенных сделок у различных брокеров, если все они получают один поток, или не один?, Количество пустых интервалов при трансформации потока обезличенных сделок в секундные свечи по одному и тому же интсрументу (в моем случае РТС срочного рынка) может отличаться почти в 2 раза за один и тот же период при обработке одной и той же программой
Михаил Сурцуков написал: Вы историю тиков скачивали. А мой вопрос про то, как пакуются тики в секундные интервалы в течение дня. Если Вы правы, тогда получается, что КВИК дает возможность брокерам сдвигать тики в пачки, по собственному разумению.
Извините но Вы вообще о чем? В QUIK тики не пакуются в секундные интервалы. В QUIK вообще не бывает секундных интервалов.
В чем основная причина отличий данных в таблице обезличенных сделок у различных брокеров, если все они получают один поток, или не один?, Количество пустых интервалов при трансформации потока обезличенных сделок в секундные свечи по одному и тому же интсрументу (в моем случае РТС срочного рынка) может отличаться почти в 2 раза за один и тот же период при обработке одной и той же программой
Здравствуйте, Данные транслируются с биржи и должны быть одинаковыми у всех брокеров. Если не так, значит надо разбираться, возможно в терминале включена галка "Получать информацию по обезличенным сделкам с текущего момента" или еще что-нибудь. Для начала, через контекстное меню сохраните графики в текстовые файлы и сравните, чтобы было конкретно понятно где каких данных не хватает. И если окажется что у брокера не хватает каких-то тиков, надо бы задать вопрос самому брокеру.
Здравствуйте, Нашли причину, в коде было лишнее округление в 60 и 63 строках. Приносим извинения. Правильный код ниже, в архиве на сайте поправим позже.
Скрытый текст
Код
Settings = {
Name = "*ADX (Average Directional Movement Index)",
Period = 14,
Metod = "EMA", --(SMA, MMA, EMA, WMA, SMMA, VMA)
line = {{
Name = "Horizontal line",
Type = TYPE_LINE,
Color = RGB(140, 140, 140)
},
{
Name = "ADX",
Type = TYPE_LINE,
Color = RGB(0, 162, 232)
},
{
Name = "ADX +DI",
Type = TYPE_LINE,
Color = RGB(0, 206, 0)
},
{
Name = "ADX -DI",
Type = TYPE_LINE,
Color = RGB(221, 44, 44)
}
},
Round = "off",
Multiply = 1,
Horizontal_line="off"
}
function Init()
func = ADX()
return #Settings.line
end
function OnCalculate(Index)
return tonumber(Settings.Horizontal_line),ConvertValue(Settings,func(Index, Settings))
end
function ADX() --Average Directional Movement Index ("ADX")
local pDI_MA=MA()
local mDI_MA=MA()
local ADX_MA=MA()
local f_TR=TR()
local it = {pp=0, p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 14)
local M = (Fsettings.Metod or EMA)
if (P>0) then
if I == 1 then
if (M==VMA) then M=SMA end
it = {pp=0, p=0, l=0}
end
local i_TR = f_TR(I,ds)
if CandleExist(I,ds) then
if I~=it.p then it={pp=it.p, p=I, l=it.l+1} end
if it.l > 1 then
if GetValueEX(it.p,HIGH,ds) > GetValueEX(it.pp,HIGH,ds) then
pDM = math.abs(GetValueEX(it.p,HIGH,ds)-GetValueEX(it.pp,HIGH,ds))
else pDM = 0 end
if GetValueEX(it.p,LOW,ds) < GetValueEX(it.pp,LOW,ds) then
mDM = math.abs(GetValueEX(it.pp,LOW,ds)-GetValueEX(it.p,LOW,ds))
else mDM = 0 end
if pDM > mDM then mDM=0 end
if mDM > pDM then pDM=0 end
if pDM == mDM then pDM=0 mDM = 0 end
if i_TR~=0 then pSDI = pDM / i_TR * 100 else pSDI = 0 end
if i_TR~=0 then mSDI = mDM / i_TR * 100 else mSDI = 0 end
local pDI = pDI_MA(it.l-1, {Period=P, Metod=M, VType=ANY}, {[it.l-1] = pSDI})
local mDI = mDI_MA(it.l-1, {Period=P, Metod=M, VType=ANY}, {[it.l-1] = mSDI})
if it.l>P and pDI and mDI then
return ADX_MA(it.l-P, {Period=P, Metod=M, VType=ANY}, {[it.l-P]=math.abs(pDI-mDI)/(pDI+mDI)*100}),pDI,mDI
else
return nil,pDI,mDI
end
end
end
end
return nil,nil,nil
end
end
function TR() --True Range ("TR")
local it = {pp=0, p=0, l=0}
return function (I, ds)
if I == 1 then
it = {pp=0, p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then it={pp=it.p, p=I, l=it.l+1} end
if it.l == 1 then
return math.abs(GetValueEX(it.p,DIFFERENCE, ds))
else
return math.max(math.abs(GetValueEX(it.p,DIFFERENCE, ds)),
math.abs(GetValueEX(it.p,HIGH,ds) - GetValueEX(it.pp,CLOSE,ds)),
math.abs(GetValueEX(it.pp,CLOSE,ds)-GetValueEX(it.p,LOW,ds)))
end
end
return nil
end
end
function MA() --Moving Average ("MA")
local T_MA = {[SMA]=F_SMA(),[MMA]=F_MMA(),[EMA]=F_EMA(),[VMA]=F_VMA(),[SMMA]=F_SMMA(),[WMA]=F_WMA()}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 14)
if (P > 0) then
return T_MA[string.upper(Fsettings.Metod or EMA)](I, P, (Fsettings.VType or CLOSE), ds)
end
return nil
end
end
------------------------------------------------------------------
----Moving Average SMA, MMA, EMA, WMA, SMMA, VMA
------------------------------------------------------------------
--[[Simple Moving Average (SMA)
SMA = sum(Pi) / n]]
function F_SMA()
local sum = {}
local it = {p=0, l=0}
return function (I, P, VT, ds)
if I == 1 then
sum = {}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then it={p=I, l=it.l+1} end
local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
sum[Ip] = (sum[Ipp] or 0) + GetValueEX(it.p,VT,ds)
if it.l >= P then
return (sum[Ip] - (sum[Ippp] or 0)) / P
end
end
return nil
end
end
--[[Modified Moving Average (MMA)
MMA = (MMAi-1*(n-1) + Pi) / n]]
function F_MMA()
local sum = {}
local tmp = {pp=nil, p=nil}
local it = {p=0, l=0}
return function(I, P, VT, ds)
if I == 1 then
sum = {}
tmp = {pp=nil, p=nil}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then
it = {p=I, l=it.l+1}
tmp.pp = tmp.p
end
local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
if it.l <= P + 1 then
sum[Ip] = (sum[Ipp] or 0) + GetValueEX(it.p,VT,ds)
if (it.l == P) or (it.l == P + 1) then
tmp.p = (sum[Ip] - (sum[Ippp] or 0)) / P
end
else
tmp.p = (tmp.pp*(P-1) + GetValueEX(it.p,VT,ds)) / P
end
if it.l >= P then
return tmp.p
end
end
return nil
end
end
--[[Exponential Moving Average (EMA)
EMAi = (EMAi-1*(n-1)+2*Pi) / (n+1)]]
function F_EMA()
local tmp = {pp=nil, p=nil}
local it = {p=0, l=0}
return function(I, P, VT, ds)
if I == 1 then
tmp = {pp=nil, p=nil}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then
it = {p=I, l=it.l+1}
tmp.pp = tmp.p
end
if it.l == 1 then
tmp.p = GetValueEX(it.p,VT,ds)
else
tmp.p = (tmp.pp*(P-1) + 2*GetValueEX(it.p,VT,ds)) / (P+1)
end
if it.l >= P then
return tmp.p
end
end
return nil
end
end
--[[
William Moving Average (WMA)
( Previous WILLMA * ( Period - 1 ) + Data ) / Period]]
function F_WMA()
local tmp = {pp=nil, p=nil}
local it = {p=0, l=0}
return function(I, P, VT, ds)
if I == 1 then
tmp = {pp=nil, p=nil}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then
it={p=I, l=it.l+1}
tmp.pp = tmp.p
end
if it.l == 1 then
tmp.p = GetValueEX(it.p,VT,ds)
else
tmp.p = (tmp.pp * (P-1) + GetValueEX(it.p,VT,ds)) / P
end
if it.l >= P then
return tmp.p
end
end
return nil
end
end
--[[Volume Adjusted Moving Average (VMA)
VMA = sum(Pi*Vi) / sum(Vi)]]
function F_VMA()
local sum = {}
local sum2 = {}
local it = {p=0, l=0}
return function(I, P, VT, ds)
if I == 1 then
sum = {}
sum2 = {}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then it={p=I, l=it.l+1} end
local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
sum[Ip] = (sum[Ipp] or 0) + GetValueEX(it.p,VT,ds) * GetValueEX(it.p,VOLUME,ds)
sum2[Ip] = (sum2[Ipp] or 0) + GetValueEX(it.p,VOLUME,ds)
if it.l >= P then
return (sum[Ip] - (sum[Ippp] or 0)) / (sum2[Ip] - (sum2[Ippp] or 0))
end
end
return nil
end
end
--[[Smoothed Moving Average (SMMA)
SMMAi = (sum(Pi) - SMMAi-1 + Pi) / n]]
function F_SMMA()
local sum = {}
local sum2 = {}
local it = {p=0, l=0}
return function(I, P, VT, ds)
if I == 1 then
sum = {}
sum2 = {}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
if I~=it.p then it={p=I, l=it.l+1} end
local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
sum[Ip] = (sum[Ipp] or 0) + GetValueEX(it.p,VT,ds)
if it.l >= P then
if it.l == P then
sum2[Ip] = (sum[Ip] - (sum[Ippp] or 0)) / P
else
sum2[Ip] = ((sum[Ip] - (sum[Ippp] or 0)) - (sum2[Ipp] or 0)+ GetValueEX(it.p,VT,ds)) / P
end
return sum2[Ip]
end
end
return nil
end
end
SMA,MMA,EMA,WMA,SMMA,VMA = "SMA","MMA","EMA","WMA","SMMA","VMA"
OPEN,HIGH,LOW,CLOSE,VOLUME,MEDIAN,TYPICAL,WEIGHTED,DIFFERENCE,ANY = "O","H","L","C","V","M","T","W","D","A"
function CandleExist(I,ds)
return (type(C)=="function" and C(I)~=nil) or
(type(ds)=="table" and (ds[I]~=nil or (type(ds.Size)=="function" and (I>0) and (I<=ds:Size()))))
end
function Squeeze(I,P)
return math.fmod(I-1,P+1)
end
function ConvertValue(T,...)
local function r(V, R)
if R and string.upper(R)== "ON" then R=0 end
if V and tonumber(R) then
if V >= 0 then return math.floor(V * 10^R + 0.5) / 10^R
else return math.ceil(V * 10^R - 0.5) / 10^R end
else return V end
end
if arg.n > 0 then
for i = 1, arg.n do
arg[i]=arg[i] and r(arg[i] * ((T and T.Multiply) or 1), (T and T.Round) or "off")
end
return unpack(arg)
else return nil end
end
function GetValueEX(I,VT,ds)
VT=(VT and string.upper(string.sub(VT,1,1))) or ANY
if VT == OPEN then --Open
return (O and O(I)) or (ds and ds:O(I))
elseif VT == HIGH then --High
return (H and H(I)) or (ds and ds:H(I))
elseif VT == LOW then --Low
return (L and L(I)) or (ds and ds:L(I))
elseif VT == CLOSE then --Close
return (C and C(I)) or (ds and ds:C(I))
elseif VT == VOLUME then --Volume
return (V and V(I)) or (ds and ds:V(I))
elseif VT == MEDIAN then --Median
return ((GetValueEX(I,HIGH,ds) + GetValueEX(I,LOW,ds)) / 2)
elseif VT == TYPICAL then --Typical
return ((GetValueEX(I,MEDIAN,ds) * 2 + GetValueEX(I,CLOSE,ds))/3)
elseif VT == WEIGHTED then --Weighted
return ((GetValueEX(I,TYPICAL,ds) * 3 + GetValueEX(I,OPEN,ds))/4)
elseif VT == DIFFERENCE then --Difference
return (GetValueEX(I,HIGH,ds) - GetValueEX(I,LOW,ds))
else --Any
return (ds and ds[I])
end
return nil
end
Это заранее заданная константа, которая в данном случае обозначает цену Close свечки Заранее заданные константы используются в программировании для того, чтобы при необходимости не пришлось менять значение во всем коде, а достаточно было только поменять значение константы.
Цитата
zv78 написал: видимо цена закрытия свечи. а какой свечи?
нет написал: можно ли ограничить количество последних свечей, получаемых из функции createDataSource. Мне не нужны все свечи тянуть оттуда, достаточно 100 последних свечей?
Такой возможности нет.
Цитата
нет написал: можно ли после вызова createDataSource в полученном ds оставить 100 последних свечей?
Такой возможности нет. Можно перенести данные из ds в Lua таблицу, а потом закрыть ds.
Цитата
нет написал: можно ли как-то кешировать результат работы RSI? Например, я просчитал RSI для всех свечей из ds, а потом хочу через каждую минуту получать RSI только для последней, не производя вычисления для предыдущих свечей?
Просто сохраняете данные в какую-нибудь Lua таблицу
Gridmer, Здравствуйте, К сожалению через QPILE или QLUA нет доступа к данному параметру таблицы заявок. Вариант только искать нужный номер в таблице стоп заявок. Т.е. перебрать в цикле все стоп заявки пока не будет найдена нужная стоп заявка с параметром LINKED_ORDER равным номеру заявки
Здравствуйте, getItem возвращает таблицу, везде кроме client_codes которая является исключением И об этом сказано в документации: -Функции для обращения к строкам произвольных таблиц QUIK --Таблицы, используемые в функциях «getItem», «getNumberOf» и «SearchItems» сказано
Цитата
* - функция getNumberOf("client_codes") возвращает количество доступных кодов клиента в терминале, а функция getItem("client_codes", i) - строку содержащую клиентский код с индексом i, где i может принимать значения от 0 до getNumberOf("client_codes") -1
Быть может потому что инструмент "SiH9"? для того чтобы он корректно определялся надо добавить в скрипт опцию USE_CASE_SENSITIVE_CONSTANTS
Цитата
qt написал: Известные грабли, у кого то работает у кого то нет.
Должно работать, если не работает надо разбираться.
Цитата
qt написал: А если взять из ТТП по инструменту дату торгов и сравнить ее с датой торгов из "Информационное окно"?
Дата торгов в информационном окне отображает именно дату торгов, а не текущую дату. И в ТТП ровно тоже самое. Это значит что если брокер вдруг запустит сервер в субботу на пятничных данных, то Вы увидите дату пятницы, а не субботы. В этом месте правильней сравнивать дату Вашего компьютера (с поправкой на временную зону), с датой информационного окна.
Согласно логам, заявка 4191105030 приехала на сервер в 17:46:30.650, а транзакция на выставление стопа была в 17:46:29.901, т.е. до того как сервер получил заявку. В связи с чем рекомендация в силе, ждите OnOrder
s_mike@rambler.ru написал: Считаем, что если этот номер дали нам, то сервер про эту лимитированную заявку уже все знает, она присутствует в его таблицах и т.п.
Как уже было сказано сервер не может привязать стоп заявку по исполнению к заявке если ее нет. Одного ответа на транзакцию в этом месте недостаточно.
При частичном исполнении заявки всё равно можно поставить стоп по исполнению.
Цитата
s_mike@rambler.ru написал: я же иногда получаю отказ в выставлении условной заявки с диагностикой "неверные параметры". эта диагностика не соответствует действительности, ибо параметры правильные, а отказ происходит не из за неверных параметров, а из за чего то другого. Возможно, что из за того, что по исходной лимитной заявке уже есть сделки или ещё из за чего то. Но понять невозможно из за косого ответа сервера
Как уже было сказано и еще раз повторим, попробуйте отправлять транзакцию на выставление стопа после получения OnOrder
s_mike@rambler.ru написал: 3. выставляем стоп заявку для него "по исполнению"
В каком колбеке выставляется стоп? Если в OnTransReply, возможно (но это не точно) что стоп выставляется до того как на сервер приехала заявка. Заявки и транзакции транслируются разными потоками, в связи с чем возможны ситуации когда ответ на транзакцию уже приехал, а сама заявка еще нет. При таком сценарии сервер не может привязать стоп заявку по исполнению к заявке т.к. ее просто нет. А то что с Ваших слов заявка уже существует в таблице терминала, зависит от того в какой момент смотреть, речь может идти про доли секунд. Если проблема не наблюдается после срабатывания OnOrder(), значит причина точно в этом. Если продолжает наблюдаться, к сожалению без анализа со стороны брокера нельзя однозначно определить причины, сообщите кто Ваш брокер.
VNG_nemo, Проверьте, на графике действительно есть свечка 9:55? Если нет, повторите эксперимент, указав в TIME существующее время свечки. Уточните что из себя представляет файл bmp.bmp (прикрепите к сообщению)
VNG_nemo, Задача не так решается. Вы все равно используете цикл for по всем свечкам, какая разница что в этом цикле будет t из getCandlesByIndex или T(k)? Чисто по результату разницы никакой, зато никаких идентификаторов.
VNG_nemo написал: Нужны не отдельные данные по каждой свечке, а упорядоченная (проиндексированная по номеру свечки) таблица всех значений всех свечей для дальнейшего обращения к ней.
Зачем? Если Вы в любой момент по индексу и так можете достать нужные данные без лишних функций.
Цитата
VNG_nemo написал: Функция для работы с источником данных - это усложнение кода и, соответственно, увеличение времени обработки данных.
Есть доказательства или это просто мысли? Если просто мысли тогда прошу воздержаться во избежания дезинформации других пользователей.
Цитата
VNG_nemo написал: Вы же предлагаете обработать каждую свечу отдельно в интерпретаторе, затем свести все данные в одну таблицу и уже работать с ней вместо того, чтобы обратиться единожды к оптимизированной и откомпилированной сишной функции. Мне это напоминает удаление гланд через задницу.
Что такого Вы делаете с каждой свечкой отдельно? Зачем Вам захламлять лишний кусок памяти? Вы в любой момент можете получить любой параметр нужной свечки, без предвариетельного хранения. В наших примерах, в некоторых индикаторах, тоже требуется хранение свечек, но это все легко решаемо через O, H, L, C, V, T значит и у Вас тоже этого можно избежать. И сейчас именно использование идентификаторов выглядит как