Помогите разобраться, в программе выскакивает - НЕ НАЙДЕН ЛИМИТ ОТКРЫТЫХ ПОЗИЦИЙ!, (Программа по ограничению убытков), ничего не могу понять, может ошибка в блоке ДАННЫЕ ТАБЛИЦЫ ОГРАНИЧЕНИЯ ПО СЧЕТАМ.....
PORTFOLIO_EX ZAVHOZ;
DESCRIPTION ZAVHOZ;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
' НАСТРОЙКИ ТОЛЬКО ЗДЕСЬ!
ACCOUNT="SPBFUT00HFI" ' ВПИСАТЬ АККАУНТ НА ФОРТС
DRODOWN_OF_LIMITOPEN=20 ' ПРОЦЕНТ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ
BEGINSES=100000 ' НАЧАЛО РАБОТЫ
ENDSES=010000 ' ОКОНЧАНИЕ
' ***************
'========= ДАННЫЕ ТАБЛИЦЫ ОГРАНИЧЕНИЯ ПО СЧЕТАМ
I=1
LIMITOPEN=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "CBPLIMIT")+0
VARMARGIN=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "VARMARGIN")+0
ACCRUEDINT=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "ACCRUEDINT")+0
COMISSION=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "TS_COMISSION")+0
FULL_RESULT=VARMARGIN+ACCRUEDINT+COMISSION ' РАССЧИТЫВАЕМ ОБЩИЙ РЕЗУЛЬТАТ
IF LIMITOPEN=0
MESSAGE("НЕ НАЙДЕН ЛИМИТ ОТКРЫТЫХ ПОЗИЦИЙ!",1)
END IF
'========= ДАТА И ВРЕМЯ СЕРВЕРНОЕ
SERVERTIME=GET_INFO_PARAM("SERVERTIME")
TIMESERV=SUBSTR(SERVERTIME,0,2)&SUBSTR(SERVERTIME,3,2)&SUBSTR(SERVERTIME,6,7)
TIME=TIMESERV+0
TRID=TIME
'========= КОНТРОЛЬ ВРЕМЕНИ СЕССИИ И СОЕДИНЕНИЯ С СЕРВЕРОМ
IF TIME<BEGINSES OR IS_CONNECTED()<>1 OR TIME>ENDSES
RETURN
END IF
'========= ПРОВЕРКА ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ
KOEFFLIMIT=(VARMARGIN+ACCRUEDINT+COMISSION)+(LIMITOPEN*(DRODOWN_OF_LIMITOPEN/100))
IF KOEFFLIMIT<0
CLOSE_ALL_POSITION(1) ' ЗАКРЫВАЕМ ОТКРЫТЫЕ ПОЗИЦИИ
END IF
'========= ТАБЛИЦА
OUTPUT=CREATE_MAP()
OUTPUT=SET_VALUE(OUTPUT,"TIME",TIME)
OUTPUT=SET_VALUE(OUTPUT,"FULL_RESULT",FULL_RESULT)
DELETE_ALL_ITEMS()
ADD_ITEM(1,OUTPUT)
'========= ФУНКЦИИ
' CLOSE_ALL_POSITION
FUNC CLOSE_ALL_POSITION(KEY)
INSTRUMENT="" ' ОБЪЯВЛЯЕМ (ЗАОДНО ОБНУЛЯЕМ) ПЕРЕМЕННЫЕ
TP=0
IF GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS")>0
FOR PAPIR FROM 0 TO GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS")
IF GET_VALUE (GET_ITEM ("FUTURES_CLIENT_HOLDINGS", PAPIR), "TRDACCID")=ACCOUNT AND GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",PAPIR), "TOTAL_NET")+0<>0
TP=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",PAPIR), "TOTAL_NET")+0
INSTRUMENT=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",PAPIR), "SECCODE")
CLASSCODE=GET_VALUE(GET_SECURITY_INFO("",INSTRUMENT),"CLASS_CODE")&""
STEP=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,"SEC_PRICE_STEP"),"PARAM_VALUE")+0
BID=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,"BID"),"PARAM_VALUE")+0
ASK=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,"OFFER"),"PARAM_VALUE")+0
'========= ЗАКРЫВАЕМ ПОЗИЦИИ
IF TP>0
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
LOTS=ABS(TP)
KILLALLSTOP(1) ' СНИМАЕМ АКТИВНЫЕ СТОПЫ
KILLALLORDERS(1) ' СНИМАЕМ АКТИВНЫЕ ЗАЯВКИ
SELL(1)
END IF
IF TP<0
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
LOTS=ABS(TP)
KILLALLSTOP(1) ' СНИМАЕМ АКТИВНЫЕ СТОПЫ
KILLALLORDERS(1) ' СНИМАЕМ АКТИВНЫЕ ЗАЯВКИ
BUY(1)
END IF
END IF
END FOR
END IF
END FUNC
' BUY
FUNC BUY(KEYS)
PRICE=ASK+STEP*20
ORDER(PRICE,LOTS,"B")
END FUNC
' SELL
FUNC SELL(KEYS)
PRICE=BID-STEP*20
ORDER(PRICE,LOTS,"S")
END FUNC
' ORDER
FUNC ORDER(FPRICE,FLOTS,FDIRECTION)
NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TRANS_ID", TRID&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACTION", "NEW_ORDER")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TYPE", "L")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", CLASSCODE)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACCOUNT", ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "OPERATION", FDIRECTION&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "PRICE", FPRICE&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "QUANTITY", FLOTS&"")
TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION")
END FUNC
' KILLALLSTOP
FUNC KILLALLSTOP(KEY)
FOR I FROM 0 TO GET_NUMBER_OF("STOP_ORDERS")
IF (GET_VALUE (GET_ITEM ("STOP_ORDERS", I), "STATUS")="ACTIVE") AND GET_VALUE (GET_ITEM ("STOP_ORDERS", I), "ACCOUNT")=ACCOUNT
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TRANS_ID", "8"&TRID)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", CLASSCODE)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACCOUNT", ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "STOP_ORDER_KEY", GET_VALUE (GET_ITEM ("STOP_ORDERS", I), "NUMBER")&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACTION", "KILL_STOP_ORDER")
TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION")
END IF
END FOR
END FUNC
' KILLALLORDERS
FUNC KILLALLORDERS(KEY)
FOR I FROM 0 TO GET_NUMBER_OF("ORDERS")
IF GET_VALUE (GET_ITEM ("ORDERS", I), "STATUS")="ACTIVE" AND GET_VALUE (GET_ITEM ("ORDERS", I), "ACCOUNT")=ACCOUNT
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TRANS_ID", "1"&TRID)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", CLASSCOE)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACTION", "KILL_ORDER")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACCOUNT", ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ORDER_KEY", GET_VALUE (GET_ITEM ("ORDERS",I),"NUMBER")&"")
TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION")
END IF
END FOR
END FUNC
END_PROGRAM
PARAMETER TIME;
PARAMETER_TITLE ВРЕМЯ;
PARAMETER_DESCRIPTION ВРЕМЯ;
PARAMETER_TYPE STRING(30);
END
PARAMETER FULL_RESULT;
PARAMETER_TITLE ФИН.РЕЗУЛЬТАТ;
PARAMETER_DESCRIPTION ФИН.РЕЗУЛЬТАТ;
PARAMETER_TYPE NUMERIC(10,2);
END
END_PORTFOLIO_EX
PORTFOLIO_EX ZAVHOZ;
DESCRIPTION ZAVHOZ;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
' НАСТРОЙКИ ТОЛЬКО ЗДЕСЬ!
ACCOUNT="SPBFUT00HFI" ' ВПИСАТЬ АККАУНТ НА ФОРТС
DRODOWN_OF_LIMITOPEN=20 ' ПРОЦЕНТ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ
BEGINSES=100000 ' НАЧАЛО РАБОТЫ
ENDSES=010000 ' ОКОНЧАНИЕ
' ***************
'========= ДАННЫЕ ТАБЛИЦЫ ОГРАНИЧЕНИЯ ПО СЧЕТАМ
I=1
LIMITOPEN=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "CBPLIMIT")+0
VARMARGIN=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "VARMARGIN")+0
ACCRUEDINT=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "ACCRUEDINT")+0
COMISSION=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "TS_COMISSION")+0
FULL_RESULT=VARMARGIN+ACCRUEDINT+COMISSION ' РАССЧИТЫВАЕМ ОБЩИЙ РЕЗУЛЬТАТ
IF LIMITOPEN=0
MESSAGE("НЕ НАЙДЕН ЛИМИТ ОТКРЫТЫХ ПОЗИЦИЙ!",1)
END IF
'========= ДАТА И ВРЕМЯ СЕРВЕРНОЕ
SERVERTIME=GET_INFO_PARAM("SERVERTIME")
TIMESERV=SUBSTR(SERVERTIME,0,2)&SUBSTR(SERVERTIME,3,2)&SUBSTR(SERVERTIME,6,7)
TIME=TIMESERV+0
TRID=TIME
'========= КОНТРОЛЬ ВРЕМЕНИ СЕССИИ И СОЕДИНЕНИЯ С СЕРВЕРОМ
IF TIME<BEGINSES OR IS_CONNECTED()<>1 OR TIME>ENDSES
RETURN
END IF
'========= ПРОВЕРКА ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ
KOEFFLIMIT=(VARMARGIN+ACCRUEDINT+COMISSION)+(LIMITOPEN*(DRODOWN_OF_LIMITOPEN/100))
IF KOEFFLIMIT<0
CLOSE_ALL_POSITION(1) ' ЗАКРЫВАЕМ ОТКРЫТЫЕ ПОЗИЦИИ
END IF
'========= ТАБЛИЦА
OUTPUT=CREATE_MAP()
OUTPUT=SET_VALUE(OUTPUT,"TIME",TIME)
OUTPUT=SET_VALUE(OUTPUT,"FULL_RESULT",FULL_RESULT)
DELETE_ALL_ITEMS()
ADD_ITEM(1,OUTPUT)
'========= ФУНКЦИИ
' CLOSE_ALL_POSITION
FUNC CLOSE_ALL_POSITION(KEY)
INSTRUMENT="" ' ОБЪЯВЛЯЕМ (ЗАОДНО ОБНУЛЯЕМ) ПЕРЕМЕННЫЕ
TP=0
IF GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS")>0
FOR PAPIR FROM 0 TO GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS")
IF GET_VALUE (GET_ITEM ("FUTURES_CLIENT_HOLDINGS", PAPIR), "TRDACCID")=ACCOUNT AND GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",PAPIR), "TOTAL_NET")+0<>0
TP=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",PAPIR), "TOTAL_NET")+0
INSTRUMENT=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",PAPIR), "SECCODE")
CLASSCODE=GET_VALUE(GET_SECURITY_INFO("",INSTRUMENT),"CLASS_CODE")&""
STEP=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,"SEC_PRICE_STEP"),"PARAM_VALUE")+0
BID=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,"BID"),"PARAM_VALUE")+0
ASK=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,"OFFER"),"PARAM_VALUE")+0
'========= ЗАКРЫВАЕМ ПОЗИЦИИ
IF TP>0
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
LOTS=ABS(TP)
KILLALLSTOP(1) ' СНИМАЕМ АКТИВНЫЕ СТОПЫ
KILLALLORDERS(1) ' СНИМАЕМ АКТИВНЫЕ ЗАЯВКИ
SELL(1)
END IF
IF TP<0
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
LOTS=ABS(TP)
KILLALLSTOP(1) ' СНИМАЕМ АКТИВНЫЕ СТОПЫ
KILLALLORDERS(1) ' СНИМАЕМ АКТИВНЫЕ ЗАЯВКИ
BUY(1)
END IF
END IF
END FOR
END IF
END FUNC
' BUY
FUNC BUY(KEYS)
PRICE=ASK+STEP*20
ORDER(PRICE,LOTS,"B")
END FUNC
' SELL
FUNC SELL(KEYS)
PRICE=BID-STEP*20
ORDER(PRICE,LOTS,"S")
END FUNC
' ORDER
FUNC ORDER(FPRICE,FLOTS,FDIRECTION)
NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TRANS_ID", TRID&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACTION", "NEW_ORDER")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TYPE", "L")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", CLASSCODE)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACCOUNT", ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "OPERATION", FDIRECTION&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "PRICE", FPRICE&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "QUANTITY", FLOTS&"")
TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION")
END FUNC
' KILLALLSTOP
FUNC KILLALLSTOP(KEY)
FOR I FROM 0 TO GET_NUMBER_OF("STOP_ORDERS")
IF (GET_VALUE (GET_ITEM ("STOP_ORDERS", I), "STATUS")="ACTIVE") AND GET_VALUE (GET_ITEM ("STOP_ORDERS", I), "ACCOUNT")=ACCOUNT
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TRANS_ID", "8"&TRID)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", CLASSCODE)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACCOUNT", ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "STOP_ORDER_KEY", GET_VALUE (GET_ITEM ("STOP_ORDERS", I), "NUMBER")&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACTION", "KILL_STOP_ORDER")
TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION")
END IF
END FOR
END FUNC
' KILLALLORDERS
FUNC KILLALLORDERS(KEY)
FOR I FROM 0 TO GET_NUMBER_OF("ORDERS")
IF GET_VALUE (GET_ITEM ("ORDERS", I), "STATUS")="ACTIVE" AND GET_VALUE (GET_ITEM ("ORDERS", I), "ACCOUNT")=ACCOUNT
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TRANS_ID", "1"&TRID)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "CLASSCODE", CLASSCOE)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "SECCODE", INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACTION", "KILL_ORDER")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ACCOUNT", ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "ORDER_KEY", GET_VALUE (GET_ITEM ("ORDERS",I),"NUMBER")&"")
TRANS_RESULT = SEND_TRANSACTION (30, TRANS_PARAMS)
RESULT=GET_VALUE(TRANS_RESULT, "DESCRIPTION")
END IF
END FOR
END FUNC
END_PROGRAM
PARAMETER TIME;
PARAMETER_TITLE ВРЕМЯ;
PARAMETER_DESCRIPTION ВРЕМЯ;
PARAMETER_TYPE STRING(30);
END
PARAMETER FULL_RESULT;
PARAMETER_TITLE ФИН.РЕЗУЛЬТАТ;
PARAMETER_DESCRIPTION ФИН.РЕЗУЛЬТАТ;
PARAMETER_TYPE NUMERIC(10,2);
END
END_PORTFOLIO_EX