Александр
1
All posts from Александр
Александр in Poyarkov696,

Робот торговец на основе АО и Стохастика

Всем привет! Пишу робота торговца акциями сбера на основе АО и Стохастика, ниже приведу код, прошу ваши замечания и предложения! Как минимизировать ложные сигналы, когда лучше открывать и закрывать, торговать планирую на минутном графике.

1 Минутный график
2 АО 10/40
3 Стохастик 10/40
Когда оба начинают расти - покупаем, снижаются - продаем. НО, есть ложные сигналы и запаздывание. Прислушаюсь к советам, что еще добавить для фильтрации. Код робота готов выложить, как закончу. Пишу для квика.
Вот что есть сейчас:

PORTFOLIO_EX Робот SAMM_1_min;
DESCRIPTION Робот на минутном графике;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;

INCLUDE FUNC_SAMM_1_1M.txt, FUNC_SAMM_2_1M.txt, FUNC_TIME_1M.txt, FUNC_LEN_1M.txt;

PROGRAM

NEW_GLOBAL("error", 0)
NEW_GLOBAL("CANDLE_OLD"," ") ' предыдущая свеча

FILE_ID="C:\QUIK\robot\ROBOT_SAMM\ID_SAMM.txt" ' Файл чтения исходных данных
FILE_ID_TIME_1="C:\QUIK\robot\ROBOT_SAMM\1_min\ID_TIME_1.txt" ' Файл для хранения данных для первого времени
FILE_SUMM="C:\QUIK\robot\ROBOT_SAMM\1_min\FILE_SUMM.txt"
FILE_REK_SAMM="C:\QUIK\robot\ROBOT_SAMM\1_min\FILE_REK_SAMM.txt" ' Файл записи параметров рекомендации
FILE_DOHOD_SAMM="C:\QUIK\robot\ROBOT_SAMM\1_min\FILE_DOHOD_SAMM.txt" ' Файл записи дохода
VOLUME_SAMM="C:\QUIK\robot\ROBOT_SAMM\1_min\VOLUME_SAMM.txt" ' Файл для хранения данных объема

' ----- Исходные данные берутся из FILE_ID -----
CLASSCODE=READ_LINE (FILE_ID, 1*2, error)
SECCODE=READ_LINE (FILE_ID, 2*2, error)
INTERVAL=str2num(READ_LINE (FILE_ID, 12*2, error))
PROMEGUTKOV=str2num(READ_LINE (FILE_ID, 15*2, error))
' ----- Окончание ввода исходных данных -----

'------Время сервера---------
SERVERDATE = GET_INFO_PARAM("TRADEDATE")
SERVERTIME = GET_INFO_PARAM("SERVERTIME")
DATE = SUBSTR(SERVERDATE,6,4) & SUBSTR(SERVERDATE,3,2) & SUBSTR(SERVERDATE,0,2) ' Преобразует дату в формат ГГГГММДД
TIME = SUBSTR(SERVERTIME,0,2) & SUBSTR(SERVERTIME,3,2) & SUBSTR(SERVERTIME,6,7) ' Преобразует время в формат ЧЧММСС

HH=SUBSTR(SERVERTIME,0,2)
MM=SUBSTR(SERVERTIME,3,2)
SS=SUBSTR(SERVERTIME,6,7)

'-----Расчет появления новой свечи-----
FLAG=0 'флаг новой свечи
CANDLE = (GET_CANDLE_EX ("SBER_1", DATE, TIME)
IF (GET_VALUE (CANDLE,"TIME")-GET_VALUE (CANDLE_OLD,"TIME") <>0) 'свеча новая, закрытие блока в конце программы
FLAG=1 'флаг равен 1 в момент появления новой свечи на графике

DELETE_ALL_ITEMS() ' Благодаря этой функции из таблицы будут удалены старые значения
CLEAR_FILE (FILE_ID_TIME_1)
CLEAR_FILE (FILE_SUMM)

MA=0+GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE(GET_CANDLE_EX("SBER_MA_1_60", DATE, TIME), "LINES"),0),"CLOSE")

m=PROMEGUTKOV
FOR kol_int FROM 0 TO m
IF kol_int=0
TIME_1=TIME
SBER_STOH_1=APPLY_SCALE(0+GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE(GET_CANDLE_EX("SBER_STOH_1", DATE, TIME_1), "LINES"),0),"CLOSE"),3)
SBER_AO_1=APPLY_SCALE(0+GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE(GET_CANDLE_EX("SBER_AO_1", DATE, TIME_1), "LINES"),0),"CLOSE"),3)
ELSE
TIME_1=TIME()
SBER_STOH_1=APPLY_SCALE(0+GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE(GET_CANDLE_EX("SBER_STOH_1", DATE, TIME_1), "LINES"),0),"CLOSE"),3)
SBER_AO_1=APPLY_SCALE(0+GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE(GET_CANDLE_EX("SBER_AO_1", DATE, TIME_1), "LINES"),0),"CLOSE"),3)
END IF

STOH_1=SBER_STOH_1()
AO_1=SBER_AO_1()

writeln(FILE_ID_TIME_1,TIME_1&" " &STOH_1&" " &AO_1)

END FOR

strok=GET_FILE_LEN (FILE_ID_TIME_1)-1

summ_stoh_1=0
summ_ao_1=0

FOR i FROM 1 TO strok
j=i+1
READ_STOH_1_1= SUBSTR (READ_LINE (FILE_ID_TIME_1, i, error),7,6)
READ_STOH_1_2= SUBSTR (READ_LINE (FILE_ID_TIME_1, j, error),7,6)

READ_AO_1_1= SUBSTR (READ_LINE (FILE_ID_TIME_1, i, error),14,6)
READ_AO_1_2= SUBSTR (READ_LINE (FILE_ID_TIME_1, j, error),14,6)

summ_stoh_1=READ_STOH_1_1-READ_STOH_1_2+summ_stoh_1
summ_ao_1=READ_AO_1_1-READ_AO_1_2+summ_ao_1

END FOR

LAST =0+GET_VALUE(GET_PARAM_EX(CLASSCODE,SECCODE,"LAST"),"PARAM_VALUE") ' Цена последней сделки
BID=0+GET_VALUE(GET_PARAM_EX("SPBFUT","SRM2","BID"),"PARAM_VALUE") ' Лучшая цена спроса
OFFER=0+GET_VALUE(GET_PARAM_EX("SPBFUT","SRM2","OFFER"), "PARAM_VALUE") ' Лучшая цена предложения

WriteSumm(FILE_SUMM, summ_stoh_1, summ_ao_1, MA)

IND_1_1=str2num(READ_LINE (FILE_SUMM, 1*2, error))
IND_1_2=str2num(READ_LINE (FILE_SUMM, 2*2, error))
IND_1_3=str2num(READ_LINE (FILE_SUMM, 3*2, error))
S_VOL=str2num(READ_LINE (VOLUME_SAMM, 1, error))
S_AVG=str2num(READ_LINE (VOLUME_SAMM, 2, error))

IF IND_1_1>0 and IND_1_2>0 and LAST>S_AVG and S_VOL>0
REK_1=1
ELSE
IF IND_1_10
T_POZ="LONG"&" " &READ_PRICE_T
ELSE
T_POZ="SHORT"&" " &READ_PRICE_T
END IF

Massiv = CREATE_MAP() ' Создали массив
Massiv = SET_VALUE(Massiv,"S_VOL",S_VOL)
Massiv = SET_VALUE(Massiv,"REK_1",REK_1)
Massiv = SET_VALUE(Massiv,"DOHOD",DOHOD)
Massiv = SET_VALUE(Massiv,"LAST",LAST)
Massiv = SET_VALUE(Massiv,"BID",BID)
Massiv = SET_VALUE(Massiv,"OFFER",OFFER)
Massiv = SET_VALUE(Massiv,"T_POZ",T_POZ)
ADD_ITEM(0, Massiv) ' Добавление новой строки в таблицу

'----- Конец расчета новой свечи -----
END IF 
IF (FLAG=1) 'запоминаем новую свечу
CANDLE_OLD=CANDLE
END IF

END_PROGRAM
PARAMETER REK_1;
PARAMETER_TITLE REK_1;
PARAMETER_DESCRIPTION REK_1;
PARAMETER_TYPE NUMERIC(8,0);
END
PARAMETER DOHOD;
PARAMETER_TITLE Доход;
PARAMETER_DESCRIPTION Доход;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER LAST;
PARAMETER_TITLE LAST;
PARAMETER_DESCRIPTION LAST;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER BID;
PARAMETER_TITLE BID;
PARAMETER_DESCRIPTION BID;
PARAMETER_TYPE NUMERIC(8,0);
END
PARAMETER OFFER;
PARAMETER_TITLE OFFER;
PARAMETER_DESCRIPTION OFFER;
PARAMETER_TYPE NUMERIC(8,0);
END 
PARAMETER S_VOL;
PARAMETER_TITLE Сум.объём;
PARAMETER_DESCRIPTION S_VOL;
PARAMETER_TYPE NUMERIC(10,0);
END 
PARAMETER T_POZ;
PARAMETER_TITLE Позиция;
PARAMETER_DESCRIPTION T_POZ;
PARAMETER_TYPE STRING(20);
END 
END_PORTFOLIO_EX