У меня портфель делает некий расчет и выводит в таблицу, используя функцию:
Код
' Функция заполнить таблицу
' -----------------------------
FUNC FILL_TBL()
val1 = bar_time
val2 = signal_pos
val3 = current_pos
val4 = buy_quantity
val5 = sell_quantity
val6 = trans_id
val7 = pos_bal
val8 = status
map1=create_map()[IMG]c:\Users\ВГ\Pictures\portf.JPG[/IMG]
map1=SET_VALUE(map1,"val1",val1)
map1=SET_VALUE(map1,"val2",val2)
map1=SET_VALUE(map1,"val3",val3)
map1=SET_VALUE(map1,"val4",val4)
map1=SET_VALUE(map1,"val5",val5)
map1=SET_VALUE(map1,"val6",val6)
map1=SET_VALUE(map1,"val7",val7)
map1=SET_VALUE(map1,"val8",val8)
DELETE_ALL_ITEMS()
add_item(1,map1)
BGC = "DEFAULT_COLOR"
FC = "DEFAULT_COLOR"
if error <> 0 or check_deal >= 10 or check_frun <> 0
BGC = "RGB(250,200,150)"
end if
if status = "STOP"
BGC = "RGB(250,150,150)"
end if
if trade_on_of = "0"
FC = "RGB(50,200,50)"
end if
SET_ROW_COLOR_EX(1, BGC, "DEFAULT_COLOR", FC, "DEFAULT_COLOR")
tt = t_time(0)
WRITELN(logfile_path, signal_pos & "," & current_pos & "," & pos_bal & "," & buy_quantity & "," & sell_quantity & "," & last_price & "," & last_time & "," & best_bid & "," & best_offer & "," & status)
WRITELN(logfile_path, "END" & "," & tt)
END FUNC
То есть при каждом расчете удаляет строки и пишет ровно 1 строку. Все работало много лет. Но месяц другой назад он вдруг не с того, не с сего начинает добавлять строки не удаляя. Причем как-то хаотично, не в такт с периодом расчета, с пропусками и по две строки. Причем нумерация строк плывет. Образец в приложении.
Сначала это происходило иногда и где-то под конец вечерки. Но сегодня уже под конец основной. Хотелось бы понять, что делать.
Квик 6.14.0.12 Финам. И что любопытно точно такой же портфель нормально работает в БКС 6.16.1.15 и 7.2.1.5.
Обновлять не хочется - итак все устраивало. Может подскажете в чем может быть причина? И вообще работало, работало и вдруг... Если причина не понятна, то где гарантия, что и после обновления "вдруг" опять.
Не рекомендуем использовать устаревшие версии Рабочего места QUIK по причине наличия в них уже исправленных ошибок. Просьба пронаблюдать поведение на актуальной версии программы.
Stanislav Tvorogov написал: Не рекомендуем использовать устаревшие версии Рабочего места QUIK по причине наличия в них уже исправленных ошибок. Просьба пронаблюдать поведение на актуальной версии программы.
Не хочется говорить ничего плохого, но лично я такое заявление воспринимаю в духе "возможно вы эксплуатировали один из наших многочисленных багов, а сейчас мы его исправили, и ваш скрипт больше не работает (т.е. не поддерживается)".
Похожую ошибку наблюдаю уже более года, была и на старых версиях, и на последней (7.12.1.10 от Открытия). При работе программы без перезапусков примерно раз в 1-2 недели все запущенные qpile портфели перестают удалять строки командой DELETE_ALL_ITEMS(), выглядит это примерно как на прикрепленном скрине автора этого топика. Это вызывает переполнение оперативной памяти, приходится перезапускать QUIK.
meteop написал: Похожую ошибку наблюдаю уже более года, была и на старых версиях, и на последней (7.12.1.10 от Открытия). При работе программы без перезапусков примерно раз в 1-2 недели все запущенные qpile портфели перестают удалять строки командой DELETE_ALL_ITEMS(), выглядит это примерно как на прикрепленном скрине автора этого топика. Это вызывает переполнение оперативной памяти, приходится перезапускать QUIK.
Вообще это возникает одновременно во всех запущенных скриптах, у меня их больше десятка, показывать их код, наверное, не имеет смысла. Вот к примеру, один из них:
Скрытый текст
Код
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