Подскажите пожалуйста, почему при нажатии в столбце "покупка" не выставляется быстрая заявка на покупку через окно котировок в третьем режиме (когда отображаются параметры спроса и предложения в разных столбцах без общего столбца "цена"). При этом при нажатии в столбце "продажа" заявка на продажу выставляется. Версии QUIK 10.1.3.8 и 10.1.2.2
Как получить значение параметра "дата торгов" из таблицы сделок? Если смотреть название параметра через экспорт DDE, то он называется SESSION_DATE, но в таблице, считываемой по getItem("trades",i), такого параметра нет.
Daniil Pozdnyakov написал: Вы можете рассчитать данные показатель самостоятельно: текущее количество средств разделить на цену инструмента.
В таблице купить/продать учитываются средства, заблокированные в заявках, стоп-заявках, учитывается плечо, предоставляемое по инструменту, простым делением это расчитать.
Есть ли другой способ получить максимальное количество бумаг, доступных к покупке, как оно отображается в столбце "Покупка" таблицы "купить/продать"? Если нет, то прошу зарегистрировать это пожелание.
Почему функции getBuySellInfo и getBuySellInfoEx выдают таблицу нулевого размера на счетах СПБ биржи? Брокер Открытие, QUIK 9.1.3.11, подключен к серверу, на котором есть биржа СПБ.
Приведенный скрипт выдает одно сообщение "0", код клиента заменил иксами.
Код
class_code= "SPBXM"
sec_code = "F_SPB"
client_code = "xxxxxxSPB"
firm_id = "SPBEXFIRM"
local result = getBuySellInfoEx(firm_id, client_code, class_code, sec_code, 0)
--local result = getBuySellInfo(firm_id,client_code,class_code,sec_code,14.4)
message(tostring(#result))
for i,v in pairs(result) do
message(tostring(i).." - "..tostring(v))
end
Stanislav Tvorogov написал: Описанная в данном обращении ошибка будет исправлена в одной из очередных версий программы. Приносим извинения за причиненные неудобства.
Добрый день!
Данная ошибка до сих пор существует в версиях терминала 8.13.1.16 и 9.1.3.11, будет ли она исправлена когда-нибудь?
Уведомление о необходимости обновления торговых терминалов в связи с изменениями на срочном рынке Московской биржи, Список проблем при работе устаревших версий QUIK после обновления торговой системы срочного рынка МБ
Нельзя будет снять заявку так: kill_order(ordnum,ordSECCODE,class) Потому что вот это: ordnum=get_value(get_item("ORDERS",count-gc),"NUMBER") работать НЕ будет.
Вот ввели 19-значные заявки, и тем не менее, у меня такая конструкция работает, и потом этот ordnum можно отправить в транзакцию снятия заявки.
Главное, не преобразовывать эту переменную в число, иначе она почему-то становится немного отличающейся от исходной (плюс-минус 100).
meteop написал: Для LUA индикатора GET_CANDLE_EX вообще ничего не возвращает.
Удалил из кода индикатора
Код
{
Name = "Horizontal line",
Type = TYPE_LINE,
Color = RGB(140, 140, 140)
},
и все заработало, GET_CANDLE_EX стала возвращать данные, причем сразу в линии 0 Почему не работало, так и не понял, с остальными индикаторами работало, например с ATR, в котором есть такой же код.
Sergey Gorokhov написал: В этом и причина, они НЕ должны быть одинаковые.
Под одинаковыми я имел в виду параметры функции GET_CANDLE_EX, то есть дату и время: maline1= GET_CANDLE_EX(MAID1,currdate,SERVERTIME) Для LUA индикатора GET_CANDLE_EX вообще ничего не возвращает. Соответственно и Get_Collection_Item ничего не возвращает, даже если указать 1, а не 0 (проверил).
Sergey Gorokhov написал: Проверьте корректно ли Вы указали параметры функции.
Проверил для стандартного MA и для пользовательского, все параметры одинаковые кроме tag, на графике значение в 11:35 у обоих индикаторов есть, но скрипт получает значение только стандартного, скриншоты и код скрипта прилагаю, подскажите пожалуйста, где ошибка. Также прикрепляю скриншоты в хорошем разрешении.
Код
PORTFOLIO_EX TEST_;
DESCRIPTION TEST;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
delete_all_items()
MAID1 = "MAID1"
MAID2 = "MAID2"
currdate=20200406
SERVERTIME=113500
ADD_ROW("currdate",currdate)
ADD_ROW("SERVERTIME",SERVERTIME)
maline1= GET_CANDLE_EX(MAID1,currdate,SERVERTIME)
ADD_ROW("maline1",maline1)
line1=Get_Collection_Item (Get_Value (maline1,"LINES") , 0)
MA1=Get_Value (line1,"CLOSE")+0
ADD_ROW("MA1",MA1)
maline2= GET_CANDLE_EX(MAID2,currdate,SERVERTIME)
ADD_ROW("maline2",maline2)
line2=Get_Collection_Item (Get_Value (maline2,"LINES") , 0)
MA2=Get_Value (line2,"CLOSE")+0
ADD_ROW("MA2",MA2)
FUNC ADD_ROW(PRM, VAL)
M = CREATE_MAP()
M = SET_VALUE(M, "Param", PRM)
M = SET_VALUE(M, "Value", VAL)
ADD_ITEM(GET_NUMBER_OF("OWN") + 1, M)
END FUNC
END_PROGRAM
PARAMETER Param;
PARAMETER_TITLE Параметр;
PARAMETER_DESCRIPTION Название параметра;
PARAMETER_TYPE STRING(64);
END
PARAMETER Value;
PARAMETER_TITLE Значение;
PARAMETER_DESCRIPTION Значение параметра;
PARAMETER_TYPE STRING(200);
END
END_PORTFOLIO_EX
Есть ли возможность получить значение пользовательского индикатора (со звездочкой) в скрипт QPILE? Функция GET_CANDLE_EX ничего не выдает, хотя значение "Идентификатор" прописываю в свойствах скрипта точно так же, как при использовании встроенных индикаторов.
Вообще это возникает одновременно во всех запущенных скриптах, у меня их больше десятка, показывать их код, наверное, не имеет смысла. Вот к примеру, один из них:
Скрытый текст
Код
PORTFOLIO_EX SaveTrades;
DESCRIPTION SaveTrades;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
NEW_GLOBAL("NUM_OF_TRADES",0)
NEW_GLOBAL("ii",380)
OUT_PATH="C:\quik_open\robots\trades\"
SERVERTIME=GET_INFO_PARAM("SERVERTIME")
SERVERTIME=get_servertime(SERVERTIME)+0
td=GET_TRADEDATE()
cd=GET_DATE()
if (SERVERTIME<100000)OR(SERVERTIME>235500)OR(td<>cd)
return()
end if
CTIME = GET_DATETIME()
CYEAR = GET_VALUE(CTIME, "YEAR")
CMONTH = GET_VALUE(CTIME, "MONTH")
CDAY = GET_VALUE(CTIME, "DAY")
OUT_FILE= OUT_PATH & CYEAR & "." & PAD(CMONTH,2) & "." & PAD(CDAY,2) & ".txt"
NEW_NUM_OF_TRADES=GET_NUMBER_OF("TRADES")+0
if NEW_NUM_OF_TRADES+0>NUM_OF_TRADES+0
if NUM_OF_TRADES=0
CLEAR_FILE(OUT_FILE)
end if
FOR i FROM NUM_OF_TRADES+1 to NEW_NUM_OF_TRADES
TRADE = GET_ITEM ("TRADES", i)
if (GET_VALUE(TRADE,"DATE")+0==td)
ii=ii+1
if GET_VALUE(TRADE,"OPERATION")&""="SELL"
OPERATION="Продажа"
else
OPERATION="Купля"
end if
S=ii & ";" & GET_VALUE(TRADE,"SECCODE") & ";" & OPERATION & ";" & GET_VALUE(TRADE,"PRICE") & ";" & GET_VALUE(TRADE,"QUANTITY") & ";" & GET_VALUE(TRADE,"TIME") & ";" & GET_VALUE(TRADE,"NUMBER") & ";" & GET_VALUE(TRADE,"TS_COMISSION") & ";" & GET_VALUE(TRADE,"COMMENT")& ";" & GET_VALUE(TRADE,"ACCOUNT")
WRITELN(OUT_FILE, S)
delete_all_items()
ADD_ROW("Сохранена сделка",i)
end if
end for
NUM_OF_TRADES=NEW_NUM_OF_TRADES+0
strfile=GET_FILE_LEN(OUT_FILE)+0
delete_all_items()
ADD_ROW("Строк в файле",strfile)
ADD_ROW("Trade date",td)
ADD_ROW("Curr date",cd)
if strfile<ii
NUM_OF_TRADES=0
ii=0
end if
end if
FUNC PAD(number, length)
RESULT = number
IF LEN(number) < length
c123 = 1
FOR c123 FROM 1 TO (length - LEN(number))
RESULT = "0" & RESULT
END FOR
END IF
END FUNC
FUNC ADD_ROW(PRM, VAL)
M = CREATE_MAP()
M = SET_VALUE(M, "Param", PRM)
M = SET_VALUE(M, "Value", VAL)
ADD_ITEM(GET_NUMBER_OF("OWN") + 1, M)
END FUNC
FUNC GET_TRADEDATE()
RESULT = GET_VALUE(GET_TRADE_DATE (),"YEAR")*10000+GET_VALUE(GET_TRADE_DATE (),"MONTH")*100+GET_VALUE(GET_TRADE_DATE (),"DAY")+0
end FUNC
FUNC GET_DATE()
RESULT = GET_VALUE(GET_DATETIME (),"YEAR")*10000+GET_VALUE(GET_DATETIME (),"MONTH")*100+GET_VALUE(GET_DATETIME (),"DAY")+0
end FUNC
func get_servertime(_st)
c1=FIND(_st,0,":")
c2=FIND(_st,c1+1,":")
RESULT=substr(_st,0,c1)&substr(_st,c1+1,c2-c1-1)&substr(_st,c2+1,2)
end func
END_PROGRAM
PARAMETER Param;
PARAMETER_TITLE Параметр;
PARAMETER_DESCRIPTION Название параметра;
PARAMETER_TYPE STRING(64);
END
PARAMETER Value;
PARAMETER_TITLE Значение;
PARAMETER_DESCRIPTION Значение параметра;
PARAMETER_TYPE STRING(20);
END
END_PORTFOLIO_EX
Похожую ошибку наблюдаю уже более года, была и на старых версиях, и на последней (7.12.1.10 от Открытия). При работе программы без перезапусков примерно раз в 1-2 недели все запущенные qpile портфели перестают удалять строки командой DELETE_ALL_ITEMS(), выглядит это примерно как на прикрепленном скрине автора этого топика. Это вызывает переполнение оперативной памяти, приходится перезапускать QUIK.