Торговый робот на QPILE (Moving Average) « Недокументированные секреты успешных трейдеров

Цена, Деньги, рынок, капитал, доход, прибыль, акции А в сегодняшнем посте я выкладываю большую «вкусняшку». Это исходный текст торгового робота на QPILE для торгового терминала QUIK, торгующий по эффективной стратегии Moving Average, которая принесла многим трейдерам ощутимую прибыль. Данного торгового робота Вы можете скачать и использовать совершенно бесплатно в своей работе на бирже.

Собственно код :

PORTFOLIO_EX Moving_Average;
DESCRIPTION Значение скользящей средней;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
PROGRAM
' ------------------функция перевода даты в текстовый формат---------------

FUNC fTextDate (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)
IF (LEN (Hour) < 2)
Hour = «0» & Hour
END IF
IF (LEN (Min) < 2)
Min = «0» & Min
END IF
result = Hour & Min & «00»
END FUNC
'-------------------------------------------------------------------------------
' функция перевода строки в цифровой формат
FUNC str2num (str)
total="«
for k from 0 to len (str) -1
if substr (str,k,1)<>» «
if substr (str,k,1)==»,"
total=total & «.»
else
total=total & substr (str,k,1)
end if
end if
end for
result=total+0
END FUNC

'-----------------------------------------Операционный модуль---------------------------

FUNC operation (trans_id,operation,price,quantity,seccode,classcode,orderkey)
new_global («trans_params», "")
new_global («trans_result», «„)
if operation=“KILL_ORDER»
trans_params = «„
trans_params = SET_VALUE (trans_params,“CLASSCODE»,classcode)
trans_params = SET_VALUE (trans_params,"SECCODE",seccode)
trans_params = SET_VALUE (trans_params,"TRANS_ID",trans_id)
trans_params = SET_VALUE (trans_params,"ACTION","KILL_ORDER")
trans_params = SET_VALUE (trans_params,"ORDER_KEY",orderkey)
trans_result = SEND_TRANSACTION (30,trans_params)
else
trans_params = "«
trans_params = set_value (trans_params, „TRANS_ID“, trans_id)
trans_params = set_value (trans_params, „ACTION“, „NEW_ORDER“)
trans_params = set_value (trans_params, „CLASSCODE“, classcode)
trans_params = set_value (trans_params, „SECCODE“,seccode)
trans_params = set_value (trans_params, „ACCOUNT“, Account)
trans_params = set_value (trans_params, „OPERATION“, operation)
trans_params = set_value (trans_params, „QUANTITY“, quantity)
trans_params = set_value (trans_params, „CLIENT_CODE“, ClientCode)
trans_params = set_value (trans_params, „TYPE“, „L“)
curr_datetime=Get_DateTime ()
trans_params = set_value (trans_params, „PRICE“, price)
trans_result=SEND_TRANSACTION (30, trans_params)
end if

END FUNC
'--------------------------------------Операционный модуль---------------------------------

Account = „xxxxxxxxx“ '  Ваш номер торгового счета
ClientCode = „xxxxx“ ' Ваш код клиента

ClassCode = „EQBR“ 'код класса инструмента
SecCode = „SBER03“ 'название инструмента
Interval = „5“ 'интервал
Year = GET_VALUE (GET_DATETIME (), „YEAR“)
Month = GET_VALUE (GET_DATETIME (), „MONTH“)
Day = GET_VALUE (GET_DATETIME (), „DAY“)
DATE = fTextDate (Year,Month,Day)
Hour = GET_VALUE (GET_DATETIME (), „HOUR“)
Min  = GET_VALUE (GET_DATETIME (), „MIN“)
Min = Interval*Floor (Min/Interval) 'округление минут до выбранного интервала
TIME = fTextTime (Hour,Min)
MA = GET_VALUE (GET_CANDLE (ClassCode,SecCode,»«,Interval,»MOVING AVERAGE",20100514,184500), «CLOSE»)+0
Last_price = GET_VALUE (GET_PARAM_EX («EQBR»,"SBER03","LAST"),"param_value") 'Достаем из таблицы текущих параметров цену последней сделки по инструменту
ToolQuantity = DEPO_CURRENT_BALANCE («56786», «MC0567300», «SBER03», «Y62-000098B01») +0

If ToolQuantity == 0           '(«Портфель пустой. Выполнено условие для ЛОНГа. Ставим заявку на покупку»)
If  (Last_price+0 > MA+0)
operation («1»,"B",0,33,"SBER03","EQBR","1")
End if

End if

Massiv = CREATE_MAP () 'Создали массив с названием Massiv
Last_price = GET_VALUE (GET_PARAM_EX («EQBR»,"SBER03","last"),"param_value") 'Достаем из таблицы текущих параметров цену последней сделки по инструменту
Massiv = SET_VALUE (Massiv,"SecCode","СБЕРБАНК") 'Записали в массив наименование инструмента
Massiv = SET_VALUE (Massiv,"LastPrice", Last_price) 'Записали в массив цену последней сделки по инструменту
Massiv = SET_VALUE (Massiv,"MA" , MA)

ADD_ITEM (0, Massiv)

END_PROGRAM
PARAMETER SecCode;
PARAMETER_TITLE Инструмент;
PARAMETER_DESCRIPTION Наименование инструмента;
PARAMETER_TYPE String (10);
END

PARAMETER LastPrice;
PARAMETER_TITLE Цена;
PARAMETER_DESCRIPTION Цена последней сделки по инструменту;
PARAMETER_TYPE Numeric (10,2);
END

PARAMETER MA;
PARAMETER_TITLE Скользящая средняя;
PARAMETER_DESCRIPTION Значение скользящей средней;
PARAMETER_TYPE NUMERIC (10,2);
END

Добавлено 17 мая 2010, 23:01

Всегда рад учесть конструктивные замечания.

PORTFOLIO_EX AM2_Moving_Average;
DESCRIPTION Торговый робот АМ2.1;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
PROGRAM
' ------------------функция перевода даты в текстовый формат---------------

FUNC fTextDate (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)
IF (LEN (Hour) < 2)
Hour = «0» & Hour
END IF
IF (LEN (Min) < 2)
Min = «0» & Min
END IF
result = Hour & Min & «00»
END FUNC
'-------------------------------------------------------------------------------
' ------------------функция перевода строки в цифровой формат-------------------
FUNC str2num (str)
total="«
for k from 0 to len (str) -1
if substr (str,k,1)<>» «
if substr (str,k,1)==»,"
total=total & «.»
else
total=total & substr (str,k,1)
end if
end if
end for
result=total+0
END FUNC
'---------------------------------------------------------------------------------
'-----------------------------------------Операционный модуль---------------------

FUNC operation (trans_id,operation,price,quantity,seccode,classcode,orderkey)
new_global («trans_params», "")
new_global («trans_result», «„)
if operation=“KILL_ORDER»
trans_params = «„
trans_params = SET_VALUE (trans_params,“CLASSCODE»,classcode)
trans_params = SET_VALUE (trans_params,"SECCODE",seccode)
trans_params = SET_VALUE (trans_params,"TRANS_ID",trans_id)
trans_params = SET_VALUE (trans_params,"ACTION","KILL_ORDER")
trans_params = SET_VALUE (trans_params,"ORDER_KEY",orderkey)
trans_result = SEND_TRANSACTION (30,trans_params)
else
trans_params = ""
trans_params = set_value (trans_params, «TRANS_ID», trans_id)
trans_params = set_value (trans_params, «ACTION», «NEW_ORDER»)
trans_params = set_value (trans_params, «CLASSCODE», classcode)
trans_params = set_value (trans_params, «SECCODE»,seccode)
trans_params = set_value (trans_params, «ACCOUNT», Account)
trans_params = set_value (trans_params, «OPERATION», operation)
trans_params = set_value (trans_params, «QUANTITY», quantity)
trans_params = set_value (trans_params, «CLIENT_CODE», ClientCode)
trans_params = set_value (trans_params, «TYPE», «L»)
curr_datetime=Get_DateTime ()
trans_params = set_value (trans_params, «PRICE», price)
trans_result=SEND_TRANSACTION (30, trans_params)
curr_datetime=Get_DateTime ()
WRITELN («\qpile_trans.log», get_value (curr_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“))

end if

END FUNC
'-----------------------------------------------------------------------------------------------

'Мой первый Портфель на основе скльзящей средней.
'Версия 0.1

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

Account = „000-000000000“ ' номер торгового счета
ClientCode = „00000“ ' код клиента

ClassCode = „EQBR“ 'код класса инструмента
SecCode = „SBER03“ 'название инструмента
Interval = „5“ 'интервал
Year = GET_VALUE (GET_DATETIME (), „YEAR“)
Month = GET_VALUE (GET_DATETIME (), „MONTH“)
Day = GET_VALUE (GET_DATETIME (), „DAY“)
DATE = fTextDate (Year,Month,Day)
Hour = GET_VALUE (GET_DATETIME (), „HOUR“)
Min  = GET_VALUE (GET_DATETIME (), „MIN“)
Min = Interval*Floor (Min/Interval) 'округление минут до выбранного интервала
TIME = fTextTime (Hour,Min)
MA = GET_VALUE (GET_CANDLE (ClassCode,SecCode,»«,Interval,»MOVING AVERAGE",DATE,TIME), «CLOSE»)+0 'Получаем значение скользящей средней
Last_price = GET_VALUE (GET_PARAM_EX («EQBR»,"SBER03","LAST"),"param_value") 'Достаем из таблицы текущих параметров цену последней сделки по инструменту
ToolQuantity = DEPO_CURRENT_BALANCE («00000», «000000000», «SBER03», «000-000000000») +0

If ToolQuantity == 0           'Портфель пустой. Выполнено условие для ЛОНГа. Ставим заявку на покупку
If  (Last_price+0 > MA+0)  ' Если бумага торгуется выше своей скользящей средней покупаем
WRITELN («logfile.log»,"Портфель пустой. Выполнено условие для ЛОНГа. Ставим заявку на покупку")
operation («1»,"B",0,33,"SBER03","EQBR","1")

End if
If  (Last_price+0 < MA+0)   ' Если бумага торгуется ниже своей скользящей средней продаем
WRITELN («logfile.log»,"Портфель пустой. Выполнено условие для ШОРТа. Ставим заявку на продажу")
operation («1»,"S",0,33,"SBER03","EQBR","1")  ' Ставим заявку на продажу"
End if
Else
If (ToolQuantity>0) and (Last_price+0 < MA+0)    ' Если бумага торгуется ниже своей скользящей средней продаем
WRITELN («logfile.log»,"Открыта позиция ЛОНГ. Выполнено условие для закрытия позиции. Ставим заявку на продажу")
operation («1»,"S",0,33,"SBER03","EQBR","1") 'Открыта позиция ЛОНГ. Выполнено условие для закрытия позиции. Ставим заявку на продажу
End if
If (ToolQuantity<0) and (Last_price+0 > MA+0)  ' Если бумага торгуется выше своей скользящей средней покупаем
WRITELN («logfile.log»,"Открыта позиция ШОРТ. Выполнено условие для закрытия позиции. Ставим заявку на покупку")
operation («1»,"B",0,33,"SBER03","EQBR","1") 'Открыта позиция ШОРТ. Выполнено условие для закрытия позиции. Ставим заявку на покупку
End if

End if

Massiv = CREATE_MAP () 'Создали массив с названием Massiv
Last_price = GET_VALUE (GET_PARAM_EX («EQBR»,"SBER03","last"),"param_value") 'Достаем из таблицы текущих параметров цену последней сделки по инструменту
Massiv = SET_VALUE (Massiv,"SecCode","СБЕРБАНК") 'Записали в массив наименование инструмента
Massiv = SET_VALUE (Massiv,"LastPrice", Last_price) 'Записали в массив цену последней сделки по инструменту
Massiv = SET_VALUE (Massiv,"MA" , MA) 'Записали в массив значение скользящей средней

ADD_ITEM (0, Massiv)

END_PROGRAM
PARAMETER SecCode;
PARAMETER_TITLE Инструмент;
PARAMETER_DESCRIPTION Наименование инструмента;
PARAMETER_TYPE String (10);
END

PARAMETER LastPrice;
PARAMETER_TITLE Цена;
PARAMETER_DESCRIPTION Цена последней сделки по инструменту;
PARAMETER_TYPE Numeric (10,2);
END

PARAMETER MA;
PARAMETER_TITLE Скользящая средняя;
PARAMETER_DESCRIPTION Значение скользящей средней;
PARAMETER_TYPE NUMERIC (10,2);
END

Ну и конечно же хочу Вас предупредить, что за результаты использования Вами данного торгового робота я не несу никакой ответственности. Данный торговый робот выложен как есть. Претензии по  его работе и торговой стратегии не принимаются. Для доработки данного торгового робота, его модификации и подгонки под Ваши требования, обращайтесь ко мне в личку. Доработаю за умеренную плату в полном соответствии с Вашими алгоритмами.

Забьет ли Илья Ковальчук гол на Чемпионате Мира 2011?

Другие мои статьи можно почитать тут.

Торговый робот на QPILE (Moving Average)

Рубрика: Торговые роботы | Метки: , , , , ,

17 комментариев


  1. Костик

    Крутил-вертел, так и не смог добиться работы.

    Постоянно какие-то ошибки вылазят.

    Неверный формат описания портфелей, строка 127

    ошибка синтаксиса

    либо загружается, но в момент запуска выводит ошибку. Помогите!

  2. Pleks

    Дословно приведите описание ошибки.

  3. Maxim

    Если я планирую на фьюче (SPBFUT) играть какие параметры менять надо? SBER03, EQBR, ещё что-то?

  4. Pleks

    Номер счета, номер клиента, а так же поиграться временным интервалом.

  5. Maxim

    никак не получается.

    «Неверный формат файла описания портфелей — Ошибка синтаксиса /.../ Строка 125»

    в строке 125 только «END»

    Это лечится?

  6. Pleks

    Конечно лечиться. Почему же нет.

  7. Maxim

    и как?

  8. Pleks

    Элементарной отладкой кода.

  9. Константин

    У вас в блоге выложен код ТОРГОВЫЙ РОБОТ НА QPILE (MOVING AVERAGE) возможна ли его адаптировать для фьючерс на ртс, если да то сколько это будет стоить. я начинающий сижу на терминале транзак с кивиком ещё не работал но большую часть счета уже слил и опыт больше отрицательный.

  10. Pleks

    Адаптировать конечно же можно. Но я на Вашем месте не слишком бы доверял торговле данным роботом. Он показывает хорошие результаты на ярко выраженных трендах, а в боковике совершенно неэффективен. Для боковика нужен робот, который использует совершенно другую стратегию......

  11. Minocqua

    Хорошая информация 😉 Спасибо за ваше время ... 😉 отношении

  12. oleg

    НУ А КАК КАЧАТЬ-ТО,А?

  13. oleg

    НУ КАК КАЧАТЬ?

  14. Pleks

    Да просто исходник файла копипастите себе в файл.

  15. Pleks

    Уже ответил Вам.

  16. peppi

    Можно ли синхронизировать робота с графиками QUIK,то есть нужно,что бы при задании порфеля указать период рассчета 450сек. График 15мин. ,а время запуска QUIK не влияло.

  17. Сергей

    Добрый день.

    Я адаптировал его под фортс, но этот робот дает только 1 значение МА.

    Я пробовал добавить еще одну МА, но у меня не получилось, такое чувство, что имя «Moving Average» в строке

    MA = GET_VALUE (GET_CANDLE (ClassCode,SecCode,»«,Interval,»MOVING AVERAGE",DATE,TIME), «CLOSE»)+0

    выдает данные только для одной линии, а вот другие МА, которые добавляешь в график не видит.

    Подскажите как описать еще одну МА.

Комментировать

Вам необходимо войти, чтобы оставлять комментарии.