1. Все кто сталкивался с купайлом знают, что там нет возможности получения свечи по номеру. Поэтому первым делом понадобится функция, получить предыдущую свечу.
'*********************************** ФУНКЦИЯ ДЛЯ ПОЛУЧЕНИЯ ПРЕДЫДУЩЕЙ СВЕЧИ **************************************************** FUNC Get_Previous_Candle(tTextData, tTextTime)
for i from 1 to (DayToFind*24)*(Floor(60/Interval)) IF CANDL_FOUND <> 0 break END IF ' откат на "интервал" назад tMin=tMin-Interval if tMin < 0 tMin = 60 + tMin tHour = tHour - 1 if tHour < 0 tHour = 23 tDay = tDay - 1 if tDay < 1 tDay = 31 tMonth = tMonth - 1 if tMonth < 1 tMonth = 12 tYear = tYear - 1 if tYear < 0 message ("Котировка не найдена",1) end if end if end if end if end if '======================================================================= tTextData=fTextData(tYear,tMonth,tDay) &"" tTextTime=fTextTime(tHour,tMin) & "" '======================================================================= PREV_CANDLE = (GET_CANDLE_EX (SecCode, tTextData, tTextTime) IF Len(GET_VALUE(PREV_CANDLE, "TIME")) > 0 CANDL_FOUND = 1 CANDL_DATA = tTextData END IF '======================================================================= end for
2. Канал Дончиана, он же хай и лой за последние N свечей.
Вспомогательные функции получения ОХЛС по заданной свече '***********************************ФУНКЦИИ ДЛЯ ВОЗВРАТА ОХЛС ПО ТЕКУЩЕЙ СВЕЧЕ************************************************* FUNC GET_CANDLE_OPEN (GetTextData, GetTextTime) TCandleData = GET_CANDLE(ClassCode, SecCode, "", Interval, "PRICE", GetTextData, GetTextTime) result = get_value(TCandleData, "OPEN") END FUNC
FUNC GET_CANDLE_HIGH (GetTextData, GetTextTime) TCandleData = GET_CANDLE(ClassCode, SecCode, "", Interval, "PRICE", GetTextData, GetTextTime) result = get_value(TCandleData, "HIGH") END FUNC
FUNC GET_CANDLE_LOW (GetTextData, GetTextTime) TCandleData = GET_CANDLE(ClassCode, SecCode, "", Interval, "PRICE", GetTextData, GetTextTime) result = get_value(TCandleData, "LOW") END FUNC
FUNC GET_CANDLE_CLOSE (GetTextData, GetTextTime) TCandleData = GET_CANDLE(ClassCode, SecCode, "", Interval, "PRICE", GetTextData, GetTextTime) result = get_value(TCandleData, "CLOSE") END FUNC
FUNC Get_Parabolik(GetTextData, GetTextTime) TCandleData = GET_CANDLE(ClassCode, SecCode, "", Interval, "PARABOLIC SAR", GetTextData, GetTextTime) result = get_value(TCandleData, "OPEN") END FUNC '*******************************************************************************************************************************
Сама функция получения хая и лоя '****************************** НАХОДИМ ПОСЛЕДНИЙ ХАЙ И ЛОЙ ЗА N СВЕЧЕЙ ******************************************************** FUNC GET_CHANEL_HIGH_AND_LOW (barsCount)
' CANDLE_LAST_DATA и CANDLE_LAST_TIME дата и время свечи с которой начинает отсчет CHANEL_LAST_CANDLE_DATA = CANDLE_LAST_DATA CHANEL_LAST_CANDLE_TIME = CANDLE_LAST_TIME
FOR K FROM 0 TO barsCount - 1 'получаем последнюю полную сформированную свечу CHANEL_CANDLE_ARR = Get_Previous_Candle(CHANEL_LAST_CANDLE_DATA, CHANEL_LAST_CANDLE_TIME)
The MOST important function (данный вариант берет "по рынку", но оегко меняется на лимитированную): FUNC trade(class, security, operation, volume, id,code,depo) trans_params="" trans_result="" trans_params=SET_VALUE(trans_params,"TRANS_ID",""&makeid()) trans_params=SET_VALUE(trans_params,"ACTION","NEW_ORDER") trans_params=SET_VALUE(trans_params,"CLASSCODE",""&class) trans_params=SET_VALUE(trans_params,"CLIENT_CODE",""&code) trans_params=SET_VALUE(trans_params,"SECCODE",""&security) trans_params=SET_VALUE(trans_params,"ACCOUNT",""&depo) trans_params=SET_VALUE(trans_params,"OPERATION",""&operation) trans_params=SET_VALUE(trans_params,"TYPE","M") IF class=="FUTUX" IF operation=="B" trans_params=SET_VALUE(trans_params,"PRICE",""&GET_PARAM("FUTUX",""&security,"PRICEMAX")) ELSE trans_params=SET_VALUE(trans_params,"PRICE",""&GET_PARAM("FUTUX",""&security,"PRICEMIN")) END IF ELSE trans_params=SET_VALUE(trans_params,"PRICE","0") END IF trans_params=SET_VALUE(trans_params,"QUANTITY",""&volume) trans_result=SEND_TRANSACTION(5,trans_params) WRITELN(log,GET_VALUE(GET_DATETIME(),"DATETIME")&" : "&"Result: "&GET_VALUE(trans_result,"RESULT")&" ,Result_ex: "&GET_VALUE(trans_result,"RESULT_EX")&" , OrderNum: "&GET_VALUE(trans_result,"ORDER_NUMBER")&" , Description: "&GET_VALUE(trans_result,"DESCRIPTION")) IF GET_VALUE(trans_result,"RESULT_EX")!="3" MESSAGE("Can`t send transaction !"&GET_VALUE(trans_result,"DESCRIPTION"),2) ELSE WRITELN(log,GET_VALUE(GET_DATETIME(),"DATETIME")&"Transaction done") END IF END FUNC
Солошенко Юра Digital Sky
Стаж: 13 лет 10 месяцев Откуда: www.ds-ua.com, www.qlua.org Сообщений: 80
Удобное конвертирование времени в строку (секунды тоже можно добавить): FUNC get_cur_time() f_time=GET_INFO_PARAM("SERVERTIME") curhour=""&SUBSTR(f_time,0,2) curmin=""&SUBSTR(f_time,3,2) RESULT=curhour&curmin END FUNC
trans_result = SEND_TRANSACTION (300, trans_params) ' Отправляет заявку с параметрами, указанными в массиве trans_params и ожидает ответа торговой системы в течение 300 секунд, данная функция также возвращает ассоциативный массив, содержащий результаты обработки заявки, поэтому далее мы должны проверить выполнилась ли она.
FOR while FROM 0 TO 1 ' открываем цикл проверки выполнения заявки while = 0 ' обнуляем счетчик пока не получим подтверждение выполнения заявки IF GET_VALUE (trans_result, "RESULT_EX") == "3" 'если транзакция выполнена message ("Стоп заявка выставлена",1) RETURN 'выходим из функции отправки заявок END IF message ("Стоп заявка не выставлена " & GET_VALUE (trans_result, "DESCRIPTION"),1) SoundMessageOrderError() RETURN END FOR END FUNC '*******************************************************************************************************************************
'******************************** ФУНКЦИЯ ДЛЯ СНЯТИЯ СТОП ЗАЯВОК *************************************************************** FUNC kill_stop_orders (FClassCode, FTransID, FSecCode, FAccount)
message("Снятие стоп заявок", 1) n = 0 + GET_NUMBER_OF("STOP_ORDERS") FOR i FROM 0 to n StopOrder = GET_ITEM("STOP_ORDERS", i) Status="" & GET_VALUE(StopOrder, "STATUS") SC = "" & GET_VALUE(StopOrder, "SECCODE") OrderNumber = GET_VALUE(StopOrder, "NUMBER") if (Status == "ACTIVE") and (SC == FSecCode) TransParams = create_map() TransParams = set_value(TransParams, "ACTION", "KILL_STOP_ORDER") TransParams = set_value(TransParams, "TRANS_ID", FTransID) TransParams = set_value(TransParams, "CLASSCODE", FClassCode) TransParams = set_value(TransParams, "SECCODE", SC) TransParams = set_value(TransParams, "STOP_ORDER_KEY", OrderNumber) TransResult = SEND_TRANSACTION (3, TransParams) ss = get_value(TransResult, "DESCRIPTION") message(ss, 1) message("Снятие стоп заявки", 1) end if END FOR END FUNC '*******************************************************************************************************************************
'ищем максимум из 3-х величин IF abs(ATR_CANDLE_HIGH - ATR_CANDLE_LOW) > abs(ATR_CANDLE_HIGH - ATR_CANDLE_PREV_CLOSE) res = 0 + abs (ATR_CANDLE_HIGH - ATR_CANDLE_LOW) ELSE res = 0 + abs(ATR_CANDLE_HIGH - ATR_CANDLE_PREV_CLOSE) END IF IF abs(ATR_CANDLE_LOW - ATR_CANDLE_PREV_CLOSE) > res res = 0 + abs(ATR_CANDLE_LOW - ATR_CANDLE_PREV_CLOSE) END IF
'считаем АТР IF ATRINDEX == 0 avr_res=res ELSE avr_res=(avr_res*(atrperiod-1)+res)/atrperiod END IF END FOR
result = 0 + avr_res END FUNC '*******************************************************************************************************************************
Если за сегодня, то это легко: get_param("FUTUX","UXM1","high")
А если за другой день, то можно попробовать функции для работы с графиками. Сначала построить график с нужным интервалом, например 1 день, присвоить ему имя (tag). А потом через функцию get_candle_ex("MyChart", 20110615, 170000) получить доступ к данным свечки за 15 июня 2011 на 17:00. И из этих данных уже выдернуть максимум этой свечки. В мануале к qpile есть подробный пример как вытаскивать данные с графиков.
спасибо, попытаюсь А как-то без графика вчерашний high and low можно получить?
Насколько я знаю - нет. Квик интрадейная система и исторические данные, кроме как на графиках, не хранит. Посмотрите функции в первом посте этой ветки + на форуме Квика (http://quik.ru/forum/) масса информации (как правило, все проблемы с которыми вы сталкиваетесь там уже обсуждались.)
'*********************************** ФУНКЦИЯ ДЛЯ ПОЛУЧЕНИЯ ПРЕДЫДУЩЕЙ СВЕЧИ **************************************************** FUNC Get_Previous_Candle(tTextData, tTextTime)
... for i from 1 to (DayToFind*24)*(Floor(60/Interval)) ... ' откат на "интервал" назад tMin=tMin-Interval if tMin < 0 tMin = 60 + tMin ....
END FUNC '*******************************************************************************************************************************
Функция не работает с интервалами больше часа. А также совершает лишние движения в несуществующие дни типа 31-га февраля. Когда проверю свой вариант - выложу
Последний раз редактировалось автором 03.08.2011 00:50, всего редактировалось 2 раза
' функция перевода даты в текстовый формат func fTextData(Year,Month,Day) if (LEN(Month) < 2) Month = "0" & Month end if if (LEN(Day) < 2) Day = "0" & Day end if result = Year & Month & Day end func
' функция перевода времени в текстовый формат func fTextTime(Hour,Min,Sec) if (LEN(Hour) < 2) Hour = "0" & Hour end if if (LEN(Min) < 2) Min = "0" & Min end if result = Hour & Min & "00" end func
trans_result = SEND_TRANSACTION (300, trans_params) ' Отправляет заявку с параметрами, указанными в массиве trans_params и ожидает ответа торговой системы в течение 300 секунд, данная функция также возвращает ассоциативный массив, содержащий результаты обработки заявки, поэтому далее мы должны проверить выполнилась ли она.
FOR while FROM 0 TO 1 ' открываем цикл проверки выполнения заявки while = 0 ' обнуляем счетчик пока не получим подтверждение выполнения заявки IF GET_VALUE (trans_result, "RESULT_EX") == "3" 'если транзакция выполнена message ("Заявка выполнена ",1) RETURN 'выходим из функции отправки заявок END IF message ("Заявка не выполнена " & GET_VALUE (trans_result, "DESCRIPTION"),1) RETURN END FOR END FUNC '*******************************************************************************************************************************
'****************************** ФУНКЦИЯ ДЛЯ ПОЛУЧЕНИЯ ТЕКУЩИХ ПОЗИЦИЙ ПО ФЬЮЧЕРСУ ********************************************************** FUNC Get_Current_Pos() total_net = "" open_buys = "" open_sells = ""
tt = GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS") N = 0 + GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS") IF N>0 FOR I FROM 1 TO N TRDACCID = GET_VALUE (GET_ITEM ("FUTURES_CLIENT_HOLDINGS", I), "TRDACCID") IF TRDACCID == ClientCode total_net = GET_VALUE(GET_ITEM ("FUTURES_CLIENT_HOLDINGS",I), "TOTAL_NET") 'получаем текущие позиции
open_buys = GET_VALUE(GET_ITEM ("FUTURES_CLIENT_HOLDINGS",I), "OPEN_BUYS") 'получаем текущие позиции open_sells = GET_VALUE(GET_ITEM ("FUTURES_CLIENT_HOLDINGS",I), "OPEN_SELLS") 'получаем текущие позиции END IF END FOR END IF