Блог им. RusTrend

Выкладываю, как и обещал.

Итак, вечер пришел. Прошу извинение за задержку, дела.
Как и обещал выкладываю алгоритм торговли, постараюсь всё подробно описать, объяснить…
Поехали..
Вы постоянно в рынке. Алгоритм ревисный.
Вход в лонг, он же выход шорт. Вход в шорт, он же выход из лонга.
Условие ЛОНГ:
ma1:=90;
 h>=Mov(h,ma1,E)  and  h>=ref(h,-1),
т.е. пробой эксп средней по хаям периодом 90 и цена должна быть выше предыдущего максимума.
Условие ШОРТ:
ma1:=90;
 L<=Mov(L,ma1,E)  and  L<=ref(L,-1)
Текущая цена ниже предыдущего минимума и меньше средней 90 периода, расчет по лоям.
Скажете херня???? Ждали что то необыкновенно сложное???  Стакан???
Смотрим дальше.

Выкладываю, как и обещал. 

так выглядит кривая капитала с 2009 года, думаю догадались это фьючерс РТС.

Незнаю как тут вставлять файлы поэтому все желающие пишите в личку вышлю  ResultReport и  SystemReport. Пардонте — всё в метастоке. Так и не увидел преимуществ других программ.


Тест исходя из 1 контракта.
Вторая картинка тот же тест но со стопом. Стоп — предыдущий минимум для лонга и максимум для шорта.

Выкладываю, как и обещал.

Разницы особой нет. Но использование стопа даем мне возможность контролировать риск и соответственно размер позиции.
Как вы поняли на всё я не торгую, и не опытным трейдерам (99%) не рекомендую. Ещё раз Японию тряхнёт и счета нет. Все просто.

Вернемся к нашим баранам.
Считаю в пунктах, перевод в рубли *0,67, считаю грубо, округляю в худшую сторону. 
Стартовая сумма на начало каждого года 100тыс рублей. Не будем считать позицию от риска и стопа, пусть будет 3 контракта, даже в 2011г  при ГО выше 14 тыс (или около), 3 контракта это недалеко от 30% от счета.

Итоги:
2009г — 45000, = 30тыс руб*3=90 тыс,
2010 — 55000, = 36 тыс руб*3=108 тыс,
2011 — 55000, = 36 тыс руб*3=108 тыс,
2012 — 30000,= 20 тыс руб*3=60 тыс,
2013 — 30000,= 20 тыс рублей*3= 60 тыс
Надеюсь проценты к счету никого не напряжет посчитать. 
Добейте сами эту простейшую стратегию при размере позиции от стопа, будет красне сладко.

По фьючу на рубль — средняя 30. также будет вкусно.

Сотней контрактов торговать эту стратегию не особая проблема. Проскальзывание будет около нулю. Только за счет того что используется средняя считаемая по хаям и лоям, сделки часто в реале будут лучше чем на тесте. На кипеше чуть хуже, в среднем около нуля.

Обещал робот- получите.
Заранее буду крайне признателен если кто нибудь что то упростит или улучшит.
Пишите кто будет заинтересован, вышлю написанную в  Scite. Или научите как вкладывать файл. Вставлю сдесь же всё.
Далее, стоп заявки выставляю отдельным роботом. Мне так удобно.
 
Перед выкладкой проверил (т.к у меня несколько сложнее, и кривая доходности поравнее), всё работает.
Надеюсь статей о банкротстве больше на смартлабе не будет.
… НАТЕ..



1. Робот выставления заявок.
PORTFOLIO_EX ROBOTRTS;
DESCRIPTION ROBOTRTS;
CLIENTS_LIST Q00000F; ' ВПИШИТЕ СВОЙ
FIRMS_LIST TROYMFIRM; ' ВПИШИТЕ СВОЙ, МОЙ ТРОЙКА
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
' ВЕРСИЯ 20 ФЕВРАЛЯ 2014 ГОДА — ДВЕ СрЕДНИХ и ПРЕДЫДУЩИЙ HIGH AND LOW, СО СТОПАМИ И РАЗМЕРОМ ПОЗИЦИИ ОТ СТОПА, БЕЗ ПРОФИТА,
' НАСТРОЙКИ ТОЛЬКО ЗДЕСЬ!
' ВХОД В ЛОНГ, ОН ЖЕ ВЫХОД ШОРТ --h>=Mov(h,ma1,E) and h>=ref(h,-1)
' ВХОД В ШОРТ, ОН ЖЕ ВЫХОД ЛОНГ — l<=Mov(l,ma1,E) and l<=ref(l,-1)

IDENTIFICATION_MovL=«MovL» ' ИДЕНТИФИКАТОР ДЛЯ ГРАФИКА СРЕДНЯЯ ПО ЛОЯМ период 90 (для рубля 30)
IDENTIFICATION_MovH=«MovH» ' ИДЕНТИФИКАТОР ДЛЯ ГРАФИКА СРЕДНЯЯ ПО ХАЯМ период 90 ( для рубля 30)
IDENTIFICATION_refH=«refH» ' ИДЕНТИФИКАТОР ДЛЯ ГРАФИКА средняя по хаям, период 1, метод simple, сдвиг графика 1
IDENTIFICATION_refL=«refL» ' ИДЕНТИФИКАТОР ДЛЯ ГРАФИКА средняя по лоям, период 1, метод simple, сдвиг графика 1
IDENTIFICATION_priS=«priS» ' ИДЕНТИФИКАТОР ДЛЯ ГРАФИКА price
CLIENTS_LIST=«Q00000F» ' ВПИШИТЕ СВОЙ
FIRMS_LIST=«TROYMFIRM» ' ВПИШИТЕ СВОЙ, МОЙ ТРОЙКА
INTERVAL=60 ' ТАЙМФРЕЙМ НА ОТКРЫТОМ ГРАФИКЕ В МИНУТАХ, МИНИМУМ 1 МАКСИМУМ 60. ВАЖНО!
ACCOUNT=«SPBFUT00000» ' ВПИСАТЬ АККАУНТ!!!
INSTRUMENT=«RTS-3.14» ' КОД БУМАГИ
BEGINSES=100000 ' СТАРТ РОБОТА
BEGINSES1=100000 ' СТАРТ РОБОТА
ENDSES=234456 ' ОКОНЧАНИЕ РАБОТЫ РОБОТА
RISK=0.03 ' в процентах 3 % от счета
GO=10000 ' ГО по фьючу, принимаю 10
KK=0.67 ' коэф-т перевода пунктов в рубли
STOPLOSS=100' ВЕЛИЧИНА СТОПА — «ТЕЙКПРОФИТА СТАНДАРТА QUIK» В ПИПСАХ. ЕСЛИ ПОСТАНОВКА СТОПА НЕ НУЖНА — ПОСТАВЬТЕ НОЛЬ
RAZNICA=100 ' ЗАЩИТНЫЙ СПРЕД В СТОПЗАЯВКЕ-ТЕЙКПРОФИТЕ (ПРОСКАЛЬЗЫВАНИЕ В СТОПЕ)
READ_MESSAGES=1 ' 1-РОБОТ ПРИ КАЖДОМ ДЕЙСТВИИ ПИШЕТ ОБ ЭТОМ СООБЩЕНИЕ, 0-НЕ ПИШЕТ. ИСПОЛЬЗУЕТСЯ ДЛЯ ДИАГНОСТИКИ
' ***************
'========= ПЕРЕМЕННЫЕ
CLASSCODE=GET_VALUE(GET_SECURITY_INFO("",INSTRUMENT),«CLASS_CODE»)&""
NEW_GLOBAL(«FLAG_END»,0)
NEW_GLOBAL(«FLAG_NEW_CANDLE_ENTER»,0)
NEW_GLOBAL(«FLAG_NEW_CANDLE_EXIT»,0)
NEW_GLOBAL(«FLAG_ENTER_LONG»,0)
NEW_GLOBAL(«FLAG_ENTER_SHORT»,0)
NEW_GLOBAL(«FLAG_EXIT_LONG»,0)
NEW_GLOBAL(«FLAG_EXIT_SHORT»,0)
NEW_GLOBAL(«NULL_COUNTER»,0)
NEW_GLOBAL(«TIMECURRENTCANDLE»,0)
NEW_GLOBAL(«TIMEPREVCANDLE»,0)
NEW_GLOBAL(«PREV_STOP»,0)
NEW_GLOBAL(«TIMEPREVCANDLE1»,0)
NEW_GLOBAL(«TIMECURRENTCANDLE1»,0)
NEW_GLOBAL(«FLAG_NEW_CANDLE_ENTER1»,0)
NEW_GLOBAL(«FLAG_NEW_CANDLE_EXIT1»,0)
NEW_GLOBAL(«MaxPozaGO»,0)
NEW_GLOBAL(«MaxPozaSchet»,0)
NEW_GLOBAL(«RISKpunct»,0)
NEW_GLOBAL(«RISKrub»,0)
NEW_GLOBAL(«RISKschet»,0)
NEW_GLOBAL(«MaxPozaSchetS»,0)
NEW_GLOBAL(«RISKpunctS»,0)
NEW_GLOBAL(«RISKrubS»,0)
NEW_GLOBAL(«RISKschetS»,0)
NEW_GLOBAL(«LOTSS»,0)
NEW_GLOBAL(«LOTSB»,0)
NEW_GLOBAL(«LOTS»,0)
'========= ДАТА И ВРЕМЯ СЕРВЕРНОЕ
SERVERTIME=GET_INFO_PARAM(«SERVERTIME»)
SERVERDATE=GET_INFO_PARAM(«TRADEDATE»)
TIMESERV=SUBSTR(SERVERTIME,0,2)&SUBSTR(SERVERTIME,3,2)&SUBSTR(SERVERTIME,6,7)
HOUR=SUBSTR(TIMESERV,0,2)+0
MIN=SUBSTR(TIMESERV,2,2)+0
SEC=SUBSTR(TIMESERV,4,2)+0
TIME=TIMESERV+0
DATE=""&SUBSTR(SERVERDATE,6,4)&SUBSTR(SERVERDATE,3,2)&SUBSTR(SERVERDATE,0,2)
TRID=TIME
marginal_info=GET_CLIENT_MARGINAL_PORTFOLIO_INFO(FIRMS_LIST,CLIENTS_LIST)
IN_ALL_ASSETS=GET_VALUE (marginal_info, «IN_ALL_ASSETS»)
ALL_ASSETS=GET_VALUE (marginal_info, «ALL_ASSETS»)
BBB=ALL_ASSETS

'========= ПОЛУЧАЕМ ДАННЫЕ ПО БУМАГЕ
LAST=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,«LAST»),«PARAM_VALUE»)+0
OPEN=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,«OPEN»),«PARAM_VALUE»)+0
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
HIGH=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,«HIGH»),«PARAM_VALUE»)+0
LOW=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,«LOW»),«PARAM_VALUE»)+0

'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ИНДИКАТОРА pris
pris=GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX(IDENTIFICATION_pris, DATE, TIME),«LINES»),0),«CLOSE»)+0
'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ИНДИКАТОРА MovL
MovL=GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX(IDENTIFICATION_MovL, DATE, TIME),«LINES»),0),«CLOSE»)+0
'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ИНДИКАТОРА MovH
MovH=GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX(IDENTIFICATION_MovH, DATE, TIME),«LINES»),0),«CLOSE»)+0
'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ИНДИКАТОРА refH
refH=GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX(IDENTIFICATION_refH, DATE, TIME),«LINES»),0),«CLOSE»)+0
'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ИНДИКАТОРА refL
refL=GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX(IDENTIFICATION_refL, DATE, TIME),«LINES»),0),«CLOSE»)+0
 
 
'========= КОНТРОЛЬ ДАННЫХ ПО БУМАГЕ
IF LAST=0 OR STEP=0 OR BID=0 OR ASK=0 OR HIGH=0 or LOW=0 or pris=0 or MovL=0 or MovH=0 or refH=0 or refL=0
NULL_COUNTER=NULL_COUNTER+1
IF NULL_COUNTER>50
'MESSAGE(TIME&" "&DATE&" "&LAST&" "&HIGH&" "&LOW&" "&STEP&" "&OPEN&" "&BID&" "&ASK&" "&MovH&" "&MovL&" "&refH&" "&refL&" "&pris&,1)
NULL_COUNTER=0
END IF
RETURN
END IF
 

'========= ТЕКУЩАЯ ПОЗИЦИЯ И КОЛ-ВО АКТИВНЫХ ЗАЯВОК
TP=0
ORDERCOUNT=0
FOR I FROM 0 TO GET_NUMBER_OF(«FUTURES_CLIENT_HOLDINGS»)
IF GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS», I), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS», I), «TRDACCID»)=ACCOUNT
TP=GET_VALUE(GET_ITEM(«FUTURES_CLIENT_HOLDINGS»,I), «TOTAL_NET»)+0
END IF
END FOR
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), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («ORDERS», I), «TRANS_ID»)+0<>0 AND GET_VALUE (GET_ITEM («ORDERS», I), «ACCOUNT»)=ACCOUNT
ORDERCOUNT=ORDERCOUNT+1
END IF
END FOR

'========= ЦЕНА НАШЕЙ ПОСЛЕДНЕЙ СДЕЛКИ
TRADEPRICE=LAST
IF TP>0
FOR I FROM 0 TO GET_NUMBER_OF(«TRADES»)
IF GET_VALUE (GET_ITEM («TRADES», I), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («TRADES», I), «OPERATION»)=«BUY» AND GET_VALUE (GET_ITEM («TRADES», I), «ACCOUNT»)=ACCOUNT
TRADEPRICE=GET_VALUE(GET_ITEM(«TRADES»,I),«PRICE»)+0
END IF
END FOR
END IF
IF TP<0
FOR I FROM 0 TO GET_NUMBER_OF(«TRADES»)
IF GET_VALUE (GET_ITEM («TRADES», I), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («TRADES», I), «OPERATION»)=«SELL»
TRADEPRICE=GET_VALUE(GET_ITEM(«TRADES»,I),«PRICE»)+0
END IF
END FOR
END IF
'========= ПОЛУЧАЕМ ИСТИННЫЙ РАЗМЕР ЛОТА для ЛОНГА
MaxPozaGO=FLOOR(BBB/GO)
RISKpunct=ABS(pris-refL)
RISKrub=RISKpunct*kk
RISKschet=BBB*RISK
MaxPozaSchet=FLOOR(RISKschet/RISKrub)
IF MaxPozaGO<MaxPozaSchet
LOTSB=MaxPozaGO
ELSE
LOTSB=MaxPozaSchet
END IF
'========= ПОЛУЧАЕМ ИСТИННЫЙ РАЗМЕР ЛОТА для ШОРТА
MaxPozaGO=FLOOR(BBB/GO)
RISKpunctS=ABS(refH-pris)
RISKrubS=RISKpunctS*kk
RISKschetS=BBB*RISK
MaxPozaSchetS=FLOOR(RISKschetS/RISKrubS)
IF MaxPozaGO<MaxPozaSchetS
LOTSS=MaxPozaGO
ELSE
LOTSS=MaxPozaSchetS
END IF
IF HIGH>MovH
LOTS=LOTSB
ELSE
LOTS=LOTSS
END IF

'========= ОПРЕДЕЛЕНИЕ НОВОЙ СВЕЧИ
OHLC(0)
TIMECURRENTCANDLE=TEXTTIME+0
IF TIMECURRENTCANDLE<>TIMEPREVCANDLE
IF TP=0
FLAG_NEW_CANDLE_ENTER=1
FLAG_NEW_CANDLE_EXIT=0
IF READ_MESSAGES=1
MESSAGE(«НОВАЯ СВЕЧА БЕЗ ПОЗИЦИИ»,1)
END IF
END IF
IF TP<>0
FLAG_NEW_CANDLE_ENTER=0
FLAG_NEW_CANDLE_EXIT=1
IF READ_MESSAGES=1
MESSAGE(«НОВАЯ СВЕЧА В ПОЗИЦИИ»,1)
END IF
END IF
TIMEPREVCANDLE=TIMECURRENTCANDLE
RETURN
END IF
'========= КОНТРОЛЬ ВРЕМЕНИ СЕССИИ И СОЕДИНЕНИЯ С СЕРВЕРОМ
IF TIME<BEGINSES OR IS_CONNECTED()<>1 OR TIME>ENDSES
RETURN
END IF

'========= ОТКРЫТИЕ ПОЗИЦИИ
IF ORDERCOUNT=0 AND FLAG_NEW_CANDLE_ENTER=1
' ENTER LONG
IF TP=0 AND LOTS>0 AND HIGH>MovH AND HIGH>refH
KILLALLORDERS(5)
MESSAGE(«RTS: ОТКРЫВАЮ LONG RTS ПОЗИЦИЮ НА „&LOTS&“ ЛОТОВ »,1)
BUY(LOTS)
END IF

IF TP=0 AND LOTS>0 AND LOW<MovL AND LOW<refL
KILLALLORDERS(5)
MESSAGE(«RTS: ОТКРЫВАЮ SHORT RTS ПОЗИЦИЮ НА „&LOTS&“ ЛОТОВ »,1)
SELL(LOTS)
END IF
END IF
'========= ЗАКРЫВАЕМ ПО ОБРАТНОМУ УСЛОВИЮ
IF ORDERCOUNT=0 AND TP<0
' ENTER LONG
IF HIGH>MovH AND HIGH>refH
KILLALLSTOP(1)
KILLALLORDERS(5)
MESSAGE(«RTS: ЗАКРЫВАЮ РЕВЕРС ШОРТ RTS ПОЗИЦИЮ НА „&LOTS&“ ЛОТОВ »,1)
BUY(LOTS)
MESSAGE(«RTS: ОТКРЫВАЮ РЕВЕРС ЛОНГ RTS ПОЗИЦИЮ НА „&LOTS&“ ЛОТОВ »,1)
BUY(LOTS)
END IF

END IF
IF ORDERCOUNT=0 AND TP>0
' ENTER SHORT
IF LOW<MovL AND LOW<refL
KILLALLSTOP(1)
KILLALLORDERS(5)
MESSAGE(«RTS: ЗАКРЫВАЮ ЛОНГ РЕВЕРС RTS ПОЗИЦИЮ НА „&LOTS&“ ЛОТОВ»,1)
SELL(LOTS)
MESSAGE(«RTS: ОТКРЫВАЮ ШОРТ РЕВЕРС RTS ПОЗИЦИЮ НА „&LOTS&“ ЛОТОВ»,1)
SELL(LOTS)
END IF
END IF

'========= БОЛЬШОЙ РИСК
IF ORDERCOUNT=0
' ENTER LONG
IF TP=0 AND LOTS=0 AND HIGH>MovH AND HIGH>refH
KILLALLORDERS(5)
MESSAGE(«СЛИШКОМ БОЛЬШОЙ РИСК ЛОНГА „&RISKrub&“» ,1)

END IF

IF TP=0 AND LOTS=0 AND LOW<MovL AND LOW<refL
KILLALLORDERS(5)
MESSAGE(«СЛИШКОМ БОЛЬШОЙ РИСК ШОРТА „&RISKrubS&“» ,1)
END IF
END IF

'========= ФОРМИРОВАНИЕ ТАБЛИЦЫ
OUTPUT=CREATE_MAP()
OUTPUT=SET_VALUE(OUTPUT,«TIME»,TIME)
IF TP>0
TP_TAB=«LONG. Q=»&TP
END IF
IF TP<0
TP_TAB=«SHORT. Q=»&TP
END IF
IF TP=0
TP_TAB=0
END IF
OUTPUT=SET_VALUE(OUTPUT,«TP_TAB»,TP_TAB)
OUTPUT=SET_VALUE(OUTPUT,«BBB»,BBB)
OUTPUT=SET_VALUE(OUTPUT,«LAST»,LAST)
OUTPUT=SET_VALUE(OUTPUT,«MaxPozaGO»,MaxPozaGO)
OUTPUT=SET_VALUE(OUTPUT,«RISKrub»,RISKrub)
OUTPUT=SET_VALUE(OUTPUT,«RISKrubS»,RISKrubS)
OUTPUT=SET_VALUE(OUTPUT,«MaxPozaSchetS»,MaxPozaSchetS)
OUTPUT=SET_VALUE(OUTPUT,«RISKschet»,RISKschet)
OUTPUT=SET_VALUE(OUTPUT,«MaxPozaSchet»,MaxPozaSchet)
OUTPUT=SET_VALUE(OUTPUT,«LOTSS»,LOTSS)
OUTPUT=SET_VALUE(OUTPUT,«LOTSB»,LOTSB)
OUTPUT=SET_VALUE(OUTPUT,«LOTS»,LOTS)
DELETE_ALL_ITEMS()
ADD_ITEM(1,OUTPUT)
'========= ФУНКЦИИ
' BUY
FUNC BUY(KEYS)
PRICE=ASK+STEP*10
ORDER(PRICE,LOTS,«B»)
END FUNC
' SELL
FUNC SELL(KEYS)
PRICE=BID-STEP*10
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»)
MESSAGE(RESULT,1)
END FUNC

' OHLC
FUNC OHLC(NUMBER)
NUMBER=NUMBER+1
M=0
CURYEAR=GET_VALUE(GET_DATETIME(), «YEAR»)
CURMONTH=GET_VALUE(GET_DATETIME(), «MONTH»)
CURDAY=GET_VALUE(GET_DATETIME(), «DAY»)
CURHOUR = GET_VALUE(GET_DATETIME(), «HOUR»)
CURMIN = GET_VALUE(GET_DATETIME(), «MIN»)
CURMIN = INTERVAL*FLOOR(CURMIN/INTERVAL)
N=(5*24)*(FLOOR(60/INTERVAL))
FOR I FROM 1 TO N
TEXTDATA=FTEXTDATA(CURYEAR,CURMONTH,CURDAY) &""
TEXTTIME=FTEXTTIME(CURHOUR,CURMIN) & ""
CANDLE=GET_CANDLE(«SPBFUT»,INSTRUMENT, "", INTERVAL & "", «PRICE», TEXTDATA, TEXTTIME)
OPEN=GET_VALUE (CANDLE, «OPEN»)+0
IF OPEN>0
M=M+1
IF M=NUMBER
' DATE=TEXTDATA
' TIME=TEXTTIME
OPEN=GET_VALUE (CANDLE, «OPEN»)+0
HIGH=GET_VALUE (CANDLE, «HIGH»)+0
LOW=GET_VALUE (CANDLE, «LOW»)+0
CLOSE=GET_VALUE (CANDLE, «CLOSE»)+0
I=N
END IF
END IF
CURMIN=CURMIN-INTERVAL
IF CURMIN<0
CURMIN=60+CURMIN
CURHOUR=CURHOUR-1
IF CURHOUR<0
CURHOUR=23
CURDAY=CURDAY-1
IF CURDAY<1
CURDAY=31
CURMONTH=CURMONTH-1
IF CURMONTH<1
CURMONTH=12
CURYEAR=CURYEAR-1
IF CURYEAR<0
MESSAGE («NO DATA»,1)
END IF
END IF
END IF
END IF
END IF
END FOR
END FUNC
' ФУНКЦИЯ ПЕРЕВОДА ДАТЫ В ТЕКСТОВЫЙ ФОРМАТ
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
' 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), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («ORDERS», I), «TRANS_ID»)+0<>0
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», «SPBFUT»)
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
' 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), «SECCODE»)=INSTRUMENT
NEW_GLOBAL(«TRANS_PARAMS», "")
NEW_GLOBAL(«TRANS_RESULT», "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «TRANS_ID», «8»&TIME)
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

END_PROGRAM

PARAMETER TP_TAB;
PARAMETER_TITLE ПОЗA;
PARAMETER_DESCRIPTION ПОЗA;
PARAMETER_TYPE STRING(30);
END
PARAMETER BBB;
PARAMETER_TITLE СЧЕТ;
PARAMETER_DESCRIPTION СЧЕТ;
PARAMETER_TYPE NUMERIC(10,2);
END
PARAMETER LAST;
PARAMETER_TITLE LAST;
PARAMETER_DESCRIPTION LAST;
PARAMETER_TYPE NUMERIC(10,2);
END
PARAMETER MaxPozaGO;
PARAMETER_TITLE MaxPozaGO;
PARAMETER_DESCRIPTION MaxPozaGO;
PARAMETER_TYPE NUMERIC(10,2);
END
PARAMETER RISKrub;
PARAMETER_TITLE RISKrub;
PARAMETER_DESCRIPTION RISKrub;
PARAMETER_TYPE NUMERIC(10,2);
END
PARAMETER RISKrubS;
PARAMETER_TITLE RISKrubS;
PARAMETER_DESCRIPTION RISKrubS;
PARAMETER_TYPE NUMERIC(10,2);
END
PARAMETER RISKschet;
PARAMETER_TITLE RISKschet;
PARAMETER_DESCRIPTION RISKschet;
PARAMETER_TYPE NUMERIC(10,2);
END
PARAMETER MaxPozaSchet;
PARAMETER_TITLE MaxPozaSchet;
PARAMETER_DESCRIPTION MaxPozaSchet;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER MaxPozaSchetS;
PARAMETER_TITLE MaxPozaSchetS;
PARAMETER_DESCRIPTION MaxPozaSchetS;
PARAMETER_TYPE NUMERIC(10,2);
END
PARAMETER LOTSS;
PARAMETER_TITLE LOTSS;
PARAMETER_DESCRIPTION LOTSS;
PARAMETER_TYPE NUMERIC(10,2);
END
PARAMETER LOTSB;
PARAMETER_TITLE LOTSB;
PARAMETER_DESCRIPTION LOTSB;
PARAMETER_TYPE NUMERIC(10,2);
END
PARAMETER LOTS;
PARAMETER_TITLE LOTS;
PARAMETER_DESCRIPTION LOTS;
PARAMETER_TYPE NUMERIC(10,2);
END
PARAMETER TIME;
PARAMETER_TITLE ВРЕМЯ;
PARAMETER_DESCRIPTION ВРЕМЯ;
PARAMETER_TYPE STRING(30);
END
END_PORTFOLIO_EX
2. Робот выставления стопов.


PORTFOLIO_EX ROBOTRTS;
DESCRIPTION ROBOTRTS;
CLIENTS_LIST Q00000F; ' ВПИШИТЕ СВОЙ
FIRMS_LIST TROYMFIRM; ' ВПИШИТЕ СВОЙ, МОЙ ТРОЙКА
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
' ВЕРСИЯ 20 ФЕВРАЛЯ 2014 ГОДА — ДВЕ СВЕДНИХ и ПРЕДЫДУЩИЙ HIGH AND LOW, СО СТОПАМИ И РАЗМЕРОМ ПОЗИЦИИ ОТ СТОПА, БЕЗ ПРОФИТА,
' НАСТРОЙКИ ТОЛЬКО ЗДЕСЬ!
' ВХОД В ЛОНГ, ОН ЖЕ ВЫХОД ШОРТ --h>=Mov(h,ma1,E) and h>=ref(h,-1)
' ВХОД В ШОРТ, ОН ЖЕ ВЫХОД ЛОНГ — l<=Mov(l,ma1,E) and l<=ref(l,-1)

IDENTIFICATION_MovL=«MovL» ' ИДЕНТИФИКАТОР ДЛЯ ГРАФИКА СРЕДНЯЯ ПО ЛОЯМ
IDENTIFICATION_MovH=«MovH» ' ИДЕНТИФИКАТОР ДЛЯ ГРАФИКА СРЕДНЯЯ ПО ХАЯМ
IDENTIFICATION_refH=«refH» ' ИДЕНТИФИКАТОР ДЛЯ ГРАФИКА ПРЕДЫДУЩИЙ ХАЙ
IDENTIFICATION_refL=«refL» ' ИДЕНТИФИКАТОР ДЛЯ ГРАФИКА ПРЕДЫДУЩИЙ ЛОУ
IDENTIFICATION_priS=«priS» ' ИДЕНТИФИКАТОР ДЛЯ ГРАФИКА ЦЕНА
CLIENTS_LIST=«Q00000F» ' ВПИШИТЕ СВОЙ
FIRMS_LIST=«TROYMFIRM» ' ВПИШИТЕ СВОЙ, МОЙ ТРОЙКА
INTERVAL=60 ' ТАЙМФРЕЙМ НА ОТКРЫТОМ ГРАФИКЕ В МИНУТАХ, МИНИМУМ 1 МАКСИМУМ 60. ВАЖНО!
ACCOUNT=«SPBFUT00000» ' ВПИСАТЬ АККАУНТ!!!
INSTRUMENT=«RTS-3.14» ' КОД БУМАГИ
BEGINSES=100000 ' СТАРТ РОБОТА
BEGINSES1=100000 ' СТАРТ РОБОТА
ENDSES=234456 ' ОКОНЧАНИЕ РАБОТЫ РОБОТА
RISK=0.03 ' в процентах 3 % от счета
GO=10000 ' ГО по фьючу, принимаю 10
KK=0.67 ' коэф-т перевода пунктов в рубли
STOPLOSS=100' ВЕЛИЧИНА СТОПА — «ТЕЙКПРОФИТА СТАНДАРТА QUIK» В ПИПСАХ. ЕСЛИ ПОСТАНОВКА СТОПА НЕ НУЖНА — ПОСТАВЬТЕ НОЛЬ
RAZNICA=100 ' ЗАЩИТНЫЙ СПРЕД В СТОПЗАЯВКЕ-ТЕЙКПРОФИТЕ (ПРОСКАЛЬЗЫВАНИЕ В СТОПЕ)
READ_MESSAGES=1 ' 1-РОБОТ ПРИ КАЖДОМ ДЕЙСТВИИ ПИШЕТ ОБ ЭТОМ СООБЩЕНИЕ, 0-НЕ ПИШЕТ. ИСПОЛЬЗУЕТСЯ ДЛЯ ДИАГНОСТИКИ
' ***************
'========= ПЕРЕМЕННЫЕ
CLASSCODE=GET_VALUE(GET_SECURITY_INFO("",INSTRUMENT),«CLASS_CODE»)&""
NEW_GLOBAL(«FLAG_END»,0)
NEW_GLOBAL(«FLAG_NEW_CANDLE_ENTER»,0)
NEW_GLOBAL(«FLAG_NEW_CANDLE_EXIT»,0)
NEW_GLOBAL(«FLAG_ENTER_LONG»,0)
NEW_GLOBAL(«FLAG_ENTER_SHORT»,0)
NEW_GLOBAL(«FLAG_EXIT_LONG»,0)
NEW_GLOBAL(«FLAG_EXIT_SHORT»,0)
NEW_GLOBAL(«NULL_COUNTER»,0)
NEW_GLOBAL(«TIMECURRENTCANDLE»,0)
NEW_GLOBAL(«TIMEPREVCANDLE»,0)
NEW_GLOBAL(«PREV_STOP»,0)
NEW_GLOBAL(«TIMEPREVCANDLE1»,0)
NEW_GLOBAL(«TIMECURRENTCANDLE1»,0)
NEW_GLOBAL(«FLAG_NEW_CANDLE_ENTER1»,0)
NEW_GLOBAL(«FLAG_NEW_CANDLE_EXIT1»,0)
NEW_GLOBAL(«MaxPozaGO»,0)
NEW_GLOBAL(«MaxPozaSchet»,0)
NEW_GLOBAL(«RISKpunct»,0)
NEW_GLOBAL(«RISKrub»,0)
NEW_GLOBAL(«RISKschet»,0)
NEW_GLOBAL(«MaxPozaSchetS»,0)
NEW_GLOBAL(«RISKpunctS»,0)
NEW_GLOBAL(«RISKrubS»,0)
NEW_GLOBAL(«RISKschetS»,0)
NEW_GLOBAL(«LOTSS»,0)
NEW_GLOBAL(«LOTSB»,0)
NEW_GLOBAL(«LOTS»,0)
'========= ДАТА И ВРЕМЯ СЕРВЕРНОЕ
SERVERTIME=GET_INFO_PARAM(«SERVERTIME»)
SERVERDATE=GET_INFO_PARAM(«TRADEDATE»)
TIMESERV=SUBSTR(SERVERTIME,0,2)&SUBSTR(SERVERTIME,3,2)&SUBSTR(SERVERTIME,6,7)
HOUR=SUBSTR(TIMESERV,0,2)+0
MIN=SUBSTR(TIMESERV,2,2)+0
SEC=SUBSTR(TIMESERV,4,2)+0
TIME=TIMESERV+0
DATE=""&SUBSTR(SERVERDATE,6,4)&SUBSTR(SERVERDATE,3,2)&SUBSTR(SERVERDATE,0,2)
TRID=TIME
marginal_info=GET_CLIENT_MARGINAL_PORTFOLIO_INFO(FIRMS_LIST,CLIENTS_LIST)
IN_ALL_ASSETS=GET_VALUE (marginal_info, «IN_ALL_ASSETS»)
ALL_ASSETS=GET_VALUE (marginal_info, «ALL_ASSETS»)
BBB=ALL_ASSETS

'========= ПОЛУЧАЕМ ДАННЫЕ ПО БУМАГЕ
LAST=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,«LAST»),«PARAM_VALUE»)+0
OPEN=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,«OPEN»),«PARAM_VALUE»)+0
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
HIGH=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,«HIGH»),«PARAM_VALUE»)+0
LOW=GET_VALUE(GET_PARAM_EX(CLASSCODE,INSTRUMENT,«LOW»),«PARAM_VALUE»)+0

'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ИНДИКАТОРА pris
pris=GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX(IDENTIFICATION_pris, DATE, TIME),«LINES»),0),«CLOSE»)+0
'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ИНДИКАТОРА MovL
MovL=GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX(IDENTIFICATION_MovL, DATE, TIME),«LINES»),0),«CLOSE»)+0
'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ИНДИКАТОРА MovH
MovH=GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX(IDENTIFICATION_MovH, DATE, TIME),«LINES»),0),«CLOSE»)+0
'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ИНДИКАТОРА refH
refH=GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX(IDENTIFICATION_refH, DATE, TIME),«LINES»),0),«CLOSE»)+0
'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ИНДИКАТОРА refL
refL=GET_VALUE(GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX(IDENTIFICATION_refL, DATE, TIME),«LINES»),0),«CLOSE»)+0
 
 
'========= КОНТРОЛЬ ДАННЫХ ПО БУМАГЕ
IF LAST=0 OR STEP=0 OR BID=0 OR ASK=0 OR HIGH=0 or LOW=0 or pris=0 or MovL=0 or MovH=0 or refH=0 or refL=0
NULL_COUNTER=NULL_COUNTER+1
IF NULL_COUNTER>50
'MESSAGE(TIME&" "&DATE&" "&LAST&" "&HIGH&" "&LOW&" "&STEP&" "&OPEN&" "&BID&" "&ASK&" "&MovH&" "&MovL&" "&refH&" "&refL&" "&pris&,1)
NULL_COUNTER=0
END IF
RETURN
END IF
 

'========= ТЕКУЩАЯ ПОЗИЦИЯ И КОЛ-ВО АКТИВНЫХ ЗАЯВОК
TP=0
ORDERCOUNT=0
FOR I FROM 0 TO GET_NUMBER_OF(«FUTURES_CLIENT_HOLDINGS»)
IF GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS», I), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS», I), «TRDACCID»)=ACCOUNT
TP=GET_VALUE(GET_ITEM(«FUTURES_CLIENT_HOLDINGS»,I), «TOTAL_NET»)+0
END IF
END FOR
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), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («ORDERS», I), «TRANS_ID»)+0<>0 AND GET_VALUE (GET_ITEM («ORDERS», I), «ACCOUNT»)=ACCOUNT
ORDERCOUNT=ORDERCOUNT+1
END IF
END FOR
'========= КОЛ-ВО АКТИВНЫХ СТОПОВ
STOPORDERCOUNT=0
STOPORDERDIR=""
STOPORDERQ=0
STOPORDERPRICE=0
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), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («STOP_ORDERS», I), «TRANS_ID»)+0<>0 AND GET_VALUE (GET_ITEM («STOP_ORDERS», I), «ACCOUNT»)=ACCOUNT
STOPORDERCOUNT=STOPORDERCOUNT+1
STOPORDERPRICE=GET_VALUE(GET_ITEM(«STOP_ORDERS»,I),«CONDITION_PRICE»)+0
STOPORDERDIR=GET_VALUE(GET_ITEM(«STOP_ORDERS»,I),«OPERATION»)
STOPORDERQ=GET_VALUE(GET_ITEM(«STOP_ORDERS»,I),«QUANTITY»)+0
END IF
END FOR
'========= ЦЕНА НАШЕЙ ПОСЛЕДНЕЙ СДЕЛКИ
TRADEPRICE=LAST
IF TP>0
FOR I FROM 0 TO GET_NUMBER_OF(«TRADES»)
IF GET_VALUE (GET_ITEM («TRADES», I), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («TRADES», I), «OPERATION»)=«BUY» AND GET_VALUE (GET_ITEM («TRADES», I), «ACCOUNT»)=ACCOUNT
TRADEPRICE=GET_VALUE(GET_ITEM(«TRADES»,I),«PRICE»)+0
END IF
END FOR
END IF
IF TP<0
FOR I FROM 0 TO GET_NUMBER_OF(«TRADES»)
IF GET_VALUE (GET_ITEM («TRADES», I), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («TRADES», I), «OPERATION»)=«SELL»
TRADEPRICE=GET_VALUE(GET_ITEM(«TRADES»,I),«PRICE»)+0
END IF
END FOR
END IF
'========= ПОЛУЧАЕМ ИСТИННЫЙ РАЗМЕР ЛОТА для ЛОНГА
MaxPozaGO=FLOOR(BBB/GO)
RISKpunct=ABS(pris-refL)
RISKrub=RISKpunct*kk
RISKschet=BBB*RISK
MaxPozaSchet=FLOOR(RISKschet/RISKrub)
IF MaxPozaGO<MaxPozaSchet
LOTSB=MaxPozaGO
ELSE
LOTSB=MaxPozaSchet
END IF
'========= ПОЛУЧАЕМ ИСТИННЫЙ РАЗМЕР ЛОТА для ШОРТА
MaxPozaGO=FLOOR(BBB/GO)
RISKpunctS=ABS(refH-pris)
RISKrubS=RISKpunctS*kk
RISKschetS=BBB*RISK
MaxPozaSchetS=FLOOR(RISKschetS/RISKrubS)
IF MaxPozaGO<MaxPozaSchetS
LOTSS=MaxPozaGO
ELSE
LOTSS=MaxPozaSchetS
END IF
IF HIGH>MovH
LOTS=LOTSB
ELSE
LOTS=LOTSS
END IF
 
'========= КОНТРОЛЬ КОЛИЧЕСТВА И КАЧЕСТВА СТОПЗАЯВОК
IF STOPORDERCOUNT>1
KILLALLSTOP(1)
RETURN
END IF
IF STOPORDERCOUNT>0 AND TP=0
KILLALLSTOP(2)
RETURN
END IF
IF STOPORDERCOUNT>0 AND TP>0 AND STOPORDERDIR=«BUY»
KILLALLSTOP(3)
RETURN
END IF
IF STOPORDERCOUNT>0 AND TP<0 AND STOPORDERDIR=«SELL»
KILLALLSTOP(4)
RETURN
END IF
IF STOPORDERCOUNT>0 AND STOPORDERQ<>ABS(TP)
KILLALLSTOP(5)
RETURN
END IF


'========= КОНТРОЛЬ СТОПОВ
IF TP<>0 AND STOPORDERCOUNT=0
PAUSE(3)
END IF

'========= ПОСТАНОВКА СТОПОВ
IF STOPLOSS>0
IF TP>0 AND STOPORDERCOUNT=0 AND ORDERCOUNT=0
STOPPRICE=refL
LOTS=ABS(TP)
DIRECTION=«S»
IF READ_MESSAGES=1
MESSAGE(«RTS: ПОСТАНОВКА СТОП-ТЕЙКПРОФИТА НА ПРОДАЖУ „&LOTS&“ ЛОТОВ»,1)
END IF
STOPORDER(STOPPRICE,LOTS,DIRECTION)
END IF
IF TP<0 AND STOPORDERCOUNT=0 AND ORDERCOUNT=0
STOPPRICE=refH
LOTS=ABS(TP)
DIRECTION=«B»
IF READ_MESSAGES=1
MESSAGE(«RTS: ПОСТАНОВКА СТОП-ТЕЙКПРОФИТА НА ПОКУПКУ „&LOTS&“ ЛОТОВ»,1)
END IF
STOPORDER(STOPPRICE,LOTS,DIRECTION)
END IF
END IF

'========= КОНТРОЛЬ ВРЕМЕНИ СЕССИИ И СОЕДИНЕНИЯ С СЕРВЕРОМ
IF TIME<BEGINSES OR IS_CONNECTED()<>1 OR TIME>ENDSES
RETURN
END IF

'========= ФОРМИРОВАНИЕ ТАБЛИЦЫ
OUTPUT=CREATE_MAP()
OUTPUT=SET_VALUE(OUTPUT,«TIME»,TIME)
IF TP>0
TP_TAB=«LONG. Q=»&TP
END IF
IF TP<0
TP_TAB=«SHORT. Q=»&TP
END IF
IF TP=0
TP_TAB=0
END IF
OUTPUT=SET_VALUE(OUTPUT,«TP_TAB»,TP_TAB)
DELETE_ALL_ITEMS()
ADD_ITEM(1,OUTPUT)
'========= ФУНКЦИИ
' BUY
FUNC BUY(KEYS)
PRICE=ASK+STEP*10
ORDER(PRICE,LOTS,«B»)
END FUNC
' SELL
FUNC SELL(KEYS)
PRICE=BID-STEP*10
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»)
MESSAGE(RESULT,1)
END FUNC
' PAUSE
FUNC PAUSE(PAUSE_TIME)
PST = GET_DATETIME()
FIRST_SYS_TIME = 0+GET_VALUE(PST, «HOUR»)*3600000 + GET_VALUE(PST, «MIN»)*60000 + GET_VALUE(PST, «SEC»)*1000 + GET_VALUE(PST, «MILLISEC»)
FOR PST_FLAG FROM 0 TO 1
PST = GET_DATETIME()
SECOND_SYS_TIME = 0+GET_VALUE(PST, «HOUR»)*3600000 + GET_VALUE(PST, «MIN»)*60000 + GET_VALUE(PST, «SEC»)*1000 + GET_VALUE(PST, «MILLISEC»)
DIFF_TIME=(SECOND_SYS_TIME-FIRST_SYS_TIME)
IF DIFF_TIME<= PAUSE_TIME*1000
PST_FLAG = -1
END IF
END FOR
END FUNC
' OHLC
FUNC OHLC(NUMBER)
NUMBER=NUMBER+1
M=0
CURYEAR=GET_VALUE(GET_DATETIME(), «YEAR»)
CURMONTH=GET_VALUE(GET_DATETIME(), «MONTH»)
CURDAY=GET_VALUE(GET_DATETIME(), «DAY»)
CURHOUR = GET_VALUE(GET_DATETIME(), «HOUR»)
CURMIN = GET_VALUE(GET_DATETIME(), «MIN»)
CURMIN = INTERVAL*FLOOR(CURMIN/INTERVAL)
N=(5*24)*(FLOOR(60/INTERVAL))
FOR I FROM 1 TO N
TEXTDATA=FTEXTDATA(CURYEAR,CURMONTH,CURDAY) &""
TEXTTIME=FTEXTTIME(CURHOUR,CURMIN) & ""
CANDLE=GET_CANDLE(«SPBFUT»,INSTRUMENT, "", INTERVAL & "", «PRICE», TEXTDATA, TEXTTIME)
OPEN=GET_VALUE (CANDLE, «OPEN»)+0
IF OPEN>0
M=M+1
IF M=NUMBER
' DATE=TEXTDATA
' TIME=TEXTTIME
OPEN=GET_VALUE (CANDLE, «OPEN»)+0
HIGH=GET_VALUE (CANDLE, «HIGH»)+0
LOW=GET_VALUE (CANDLE, «LOW»)+0
CLOSE=GET_VALUE (CANDLE, «CLOSE»)+0
I=N
END IF
END IF
CURMIN=CURMIN-INTERVAL
IF CURMIN<0
CURMIN=60+CURMIN
CURHOUR=CURHOUR-1
IF CURHOUR<0
CURHOUR=23
CURDAY=CURDAY-1
IF CURDAY<1
CURDAY=31
CURMONTH=CURMONTH-1
IF CURMONTH<1
CURMONTH=12
CURYEAR=CURYEAR-1
IF CURYEAR<0
MESSAGE («NO DATA»,1)
END IF
END IF
END IF
END IF
END IF
END FOR
END FUNC
' ФУНКЦИЯ ПЕРЕВОДА ДАТЫ В ТЕКСТОВЫЙ ФОРМАТ
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
' 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), «SECCODE»)=INSTRUMENT AND GET_VALUE (GET_ITEM («ORDERS», I), «TRANS_ID»)+0<>0
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», «SPBFUT»)
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
' 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), «SECCODE»)=INSTRUMENT
NEW_GLOBAL(«TRANS_PARAMS», "")
NEW_GLOBAL(«TRANS_RESULT», "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «TRANS_ID», «8»&TIME)
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
'========= ФУНКЦИЯ ПОСТАНОВКИ СТОППРИКАЗА
FUNC STOPORDER(PRICE,LOTS,DIRECTION)
NEW_GLOBAL(«TRANS_PARAMS», "")
NEW_GLOBAL(«TRANS_RESULT», "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «EXPIRY_DATE», «TODAY»)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «TRANS_ID», TRID&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «ACTION», «NEW_STOP_ORDER»)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «CLASSCODE», «SPBFUT»)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «SECCODE», INSTRUMENT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «ACCOUNT», ACCOUNT)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «OPERATION», DIRECTION&"")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «STOPPRICE», PRICE&"")
IF TP>0
PRICE=MAL1-RAZNICA
END IF
IF TP<0
PRICE=MAH1+RAZNICA
END IF
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «PRICE», PRICE&"") ' СТОПЗАЯВКА ВЫСТАВЛЯЕТСЯ С ОДИНАКОВЫМИ СТОПЦЕНОЙ И ЦЕНОЙ.
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «QUANTITY», LOTS&"")
TRANS_RESULT = SEND_TRANSACTION (300, TRANS_PARAMS)
RESULT=GET_VALUE(TRANS_RESULT, «DESCRIPTION»)
MESSAGE (RESULT,1)
END FUNC

END_PROGRAM

PARAMETER TP_TAB;
PARAMETER_TITLE ПОЗA;
PARAMETER_DESCRIPTION ПОЗA;
PARAMETER_TYPE STRING(30);
END

PARAMETER TIME;
PARAMETER_TITLE ВРЕМЯ;
PARAMETER_DESCRIPTION ВРЕМЯ;
PARAMETER_TYPE STRING(30);
END
END_PORTFOLIO_EX

Будут вопросы, пишите. Всем отвечу.

Некоторые строки выводятся не корректно. Сброшу.
Удачи!!
 
★147
90 комментариев
Спасибо! Тестировал нечто подобное(более сложный алгоритм с фильтром), хорошо работает даже в простом варианте.
avatar
robogwlor, в роботах ничего не понимаю, и, глядя на алгоритм, глаза становятся в форме вопросительных знаков)))
avatar
robogwlor, и где твой майбах?
avatar
Леха Майтрейд, а твой где? )))
avatar
Zuccer0/Андрей, майбах не в моем вкусе)
avatar
годный код! ;) +
avatar
нормально идет и на S&P
avatar
"… Руслан..", если не тяжело на [email protected] скиньте пожалуйста,
спасибо
avatar
krasoffka, ок
avatar
"… Руслан..", результат этого — красный график или зеленый? спасибо
avatar
MasterDm, красный график доходности. зелёный — фьючерс ртс
avatar
"… Руслан..", обалденно+++++ молодец
avatar
вещь+++++!!! круто +++++
avatar
Спасибо!
avatar
++
avatar
Маленькая поправочка :)
Не «ревисный», а реверсный.
avatar
это пять
avatar
А на QLlua можно?
[email protected]
Спасибо!
avatar
A181AA, сори, нет.
не владею.
avatar
Вы сами его написали?
avatar
Sergey_gt, Не совсем. Когда то, пару лет назад, основную болванку покупал на www.hirobot.ru/about/, лично мои только отдельные блоки.
avatar
"… Руслан..", да, неплохой сайт сам там был когда начинал изучать Qpile
avatar
Это на часах? Хочу в экселе руками прогнать.
avatar
FGH, да
avatar
привет всем, я тут недавно, хотелось бы попробовать этот рынок, думаю это полезная статья, но есть вопросы, для начала, как тут поднять рейтинг хотя бы, что б в личку писать?
avatar
Очевидный путь улучшения — искать моменты, когда нужно находиться вне рынка. В целом пост лаконичный и вместе с тем информативный. Ни отнять ни прибавить ) Круто
avatar
FGH, достаточно посчитать с фиксированным риском. За счет размера позиции будет лучше раза в три.
avatar
Подскажите вы тестирование проводите в MetaStock, а язык там сложный и, что посоветуете почитать для изучения?
avatar
Sergey_gt, тестирую в метастоке. я изучал по форумам на примерах, а синтаксис банальный.
недавно увидел www.set50.com/cgi-bin/formula.asp#P
пожалуй самый объемный сайт по наличию формул и стратегий. много муры, но всегда приятно что то стырить!!! чем писать самому.
avatar
"… Руслан..", я вообщем-то все сам все сам :-) Недавно начал изучать MQL (очень хороший язык), но тестер оставляет желать лучшего. Все стратегии тестирую в TSLab. Там все проще пареной репы.
avatar
«Пардонте — всё в метастоке. Так и не увидел преимуществ других программ.»
Попробуйте метатрейдер. Ваша стратегия уместится в 300 строк максимум вместо текущих 900.
avatar
beast, это да, но как торговать. Qpile внутренний язык для самой известной платформы на рынке ММВБ, Фортс
avatar
Sergey_gt, есть метатрейдер для фортса. единственный его недостаток — там нет ленты. ну и ещё негоден само собой для hft, т.к. задержки порядка 70 мс
avatar
beast, робот написан на Qpile. В метастоке, по старинке тестирую, хотя многие перешли на вестлаб. Пока никто не сформулировал плюсы. а учить новый язык уже лень. До весны настрою торговлю из метастока напрямую в квик и найн проблем с количеством строк. на метатрейдере тоже собираюсь купить болванку с блоками ввода-вывода, стопами. хотя форекс не моё.
avatar
"… Руслан..", вопрос 1 это оптимизированный результат?
2)если да то за какой период оптимизировал, и на каком периоде прогонял?
avatar
SMA, ДАВАЙ Я ТЕБЕ СКИНУ СКРИН МЕТАСТОКА, ДАЛЬШЕ САМ.
ПЕРИОД 2009 ПО НАШЕ ВРЕМЯ
avatar
"… Руслан..", я хочу начать писать торговые алгоритмы, я так понимаю, что ты работаешь на MetaTrader, подскажи пожалуйста с чего стоит начать:
где освоить язык (руководство, обучалка, сайт) и как ты подключал MetaTrader к бирже?
Я в этом полный чайник, возможно что-то не так написал :)
avatar
"… Руслан..", по поводу «из метастока напрямую в квик» — это будет самописный адаптер или есть уже штатный MetaStock адаптер?
avatar
Ради такого дела даже Метасток нашел в просторах интернета)))
Но, что то не хочет тестер программ Метастока 7.2 воспринимать
формулу в написанном тобой виде.
Если можно то напиши в формате тестера метастока.

Там вот есть формула типа Mov(C,1,E)> Mov(C,2,E)…
Можно переделать твою формулу так, что бы можно было протестировать в Метастоке 7.2?
Enter long
Enter short
Close long
Close short
avatar
FEARLESS, у меня 10 версия но синтаксис простой возможно можно и на 7,2.
avatar
"… Руслан..", скажите а куда вставлять идентификатор предидущий хай и лоу(если я правильно потимаю нужно 3 графика цены открыть) и еще пишет ошибку Unknown lexema (IDINTIFICATION_MOVL=«MOVL». и так В обоих роботах
avatar
это точно грааль!!!
avatar
Пришлите пожалуйста файл на [email protected], может получится что то упростить.
avatar
это что, 100% годовых?????
я не программер, но условия задачи свучали слишком просто, а вот код почему-то слишком сложный :(
avatar
если не сложно сбросьте и мне)))
[email protected]
спасибо большое
avatar
и мне сбросьте пожалуйста [email protected] заранее Спасибо!!!
avatar
Здравствуйте! И мне сбросьте) [email protected]. Спасибо!
avatar
Приветствую! Ну, и мне сбросьте на [email protected]. И спасибо, что поделились!
avatar
Здравствуйте. Можно и мне на почту [email protected] Спасибо!
Добрый день, если не затруднит на [email protected] Спасибо!!!
avatar
и мне скинь пожалуйста на почту. заранее спасибо!
[email protected]
а тайм фрейм какой использовали в тесте?
avatar
MasterDm, час
avatar
Вроде всем выслал, если кого пропустил или не дошел, пишите в личку — скину
avatar
"… Руслан..", пришли пожалуйста файл я кое что добавлю по проще [email protected] Спасибо.
avatar
за код поставил +, хоть и не понимаю что это такое.
В реале алгоритм сольет.
avatar
Stanislao, нет. буду спорить. Например на следующем корпоративе смартлаба или на новый 2015год, проигравший оплатит спиртное, ну или частично хотябы.
avatar
Если можно, мне тоже скиньте — [email protected]
avatar
Здравствуйте!
Скиньте пожалуйста на — [email protected]
В вашем блоге в разделе «контакты»- ничего нет, так что пишу здесь. С уважением.
avatar
С такими условиями слив 100%, может еще есть какие то мелочи которые сильно влияют на результат.
avatar
День добрый! Мне можно на [email protected]
Спасибо!
avatar
Пожалуйста, объясните мне, почему проскалзывание около 0 и почему цены возможно лучше в реале???
avatar
а если поставить не 90 и не 30 скользящую? потому что это чистая подгонка как мне кажется протестируйте с параметрами окно которых процентов 20% и все станет грустнее. т.е. поставит не 90 а +- 15. Устойчивость системы именно так можно определить! и если конечно код работает на нескольких инструментах с одними параметрами то он устойчив.
avatar
Андрей Киселев, странная теория если учесть что всего два параметра. нет?? зачем менять период, лучше поменять второй параметр — будет ещё хуже. сделки совершать не на пробой а по закрытию свечи или открытию следующей, будет ещё хуже. а цель какая? слить депозит? даже в таком виде она работает в том числе на S&P. тестирование на других рынках, скорее это проверка на устойчивость.
avatar
"… Руслан..", а я про два параметра не говорил параметр 90 это на одной бумаге написано было, а 30 на долларе про это речь. А работает на сп500 тоже параметры подогнали? В общем такие системы не рабочие не ставте в реал или если ставить то надо 100 сделок в реале потом сравнить с 100 сделаок на бек тесте за тот же период. В общем удачи! это важно в такой системе, но на нее никто не поставит большой капитал точно, если конечно понимает в роботостроении.
avatar
[email protected], попробую. Спасибо
avatar
Не знаю зачем ты это делаешь дружище, но спасибо. Всяк успешный опыт на пользу.
Мы-то знаем что именно такие простые вещи и работают, но зачем палить их?
avatar
Руслан, хочу попробовать смоделировать эту стратегию в Трейдматике. Максимумы/минимумы за какой период берете?
avatar
Руслан, скинь пожалуйста на [email protected]
avatar
Мужики объясните жителю колхоза ужопинск… что это за значения, Условие ЛОНГ:
ma1:=90;
h>=Mov(h,ma1,E) and h>=ref(h,-1)… никогда не торговал по машкам! Как мне в моем MT4, для торговля на хворексе, их воткнуть? Благодарю за ответ!!! )
avatar
Данный алгоритм накидал за 5 минут на тслабе, там такие ЛОСИ!!!
и подобных роботов у меня штук 5 или 10 и не приносят они того что хотелось бы, а если приносят за год то просадка дикая… страшно торговать…

Николай, хай больше машки 90 периодной експоненциальной и предыдущий хай меньше текущего
Дмитрий Черников, или вы накидали не правильно или у тслаба проблемы. насчет лосей. сам робот всем скинул со стопами. второй график поста тоже со стопами. ну, чем мог тем помог. дальше сами.
avatar
Руслан, скинь пожалуйста на [email protected]
avatar
ждем посты «юных трейдеров», когда они поднимут бабло по этой схеме
avatar
Идущий по воде, и поднимут и не потеряют. Главное чтобы размер риска не ставили 100% и стопы не двигали. тупо дисциплина и без эмоций
avatar
"… Руслан..", в этом и фишка. сам торгую простую прибыльную систему. нарушения дисциплины-2-3 раза в мес.
avatar
да, забыл написать, если ещё кому надо будет пишите в личку.
avatar
"… Руслан..", Уважаемый Руслан, скажите пожалуйста для МТ4 для ручной торговли, какие мне параметры выставлять, я не могу понять что значат эти параметры у вас
Условие ЛОНГ:
ma1:=90;
h>=Mov(h,ma1,E) and h>=ref(h,-1),

например если 1 часе, у меня стоит Moving Everage Eponential, период 21, применить к Close… Что нужно мне поменять у себя?
Спасибо… до этого торговал по звездам, ща решил с машкой попробовать), только с хорошими параметрами никто не может подсказать(
avatar
abbat777, могу поделиться хорошими параметрами для машки) работает для любого таймфрейма… период 9 и 19 Moving Everage Eponential
avatar
побольше бы таких постов на смартлабе
avatar
Письмо с роботом не пришло, вышлите еще раз пожалуйста на [email protected], может быть получится что то улучшить, Спасибо.
avatar
Многие роботы резко сдулись после 05.2012. И на этой эквити тоже нечто подобное наблюдается. И в последнее время восстановления не видно.
Я бы такое не стал торговать.
avatar
я так и не догоняю выше каких максимумов должна быть цена, предидущей свечи 1H,4H,Dayli или определенное кол-во баров, или каких нибудь локальных макс. Извините может я такой тугой нарисуйте или покажите скрин кто нибудь.
avatar
Что бы долго не вникать в код, лучше спрошу. Защита от повторных входов на реалтайме есть? Или расчитываетесь один раз по клоусу бара? Ибо на истории это краисво, а на реале без этого будет слив.
avatar
и мне вышлите [email protected]
avatar
Привет, спасибо за пост, если не сложно, пришли ResultReport, SystemReport и сам робот со стопами на [email protected]
На других рынках не пробовал проверять?
avatar
Ничего не понимаю ни в торговле бумагами, ни в паскалеподобных языках, но большой респект за постЪ!
avatar

теги блога Ruslan_Loginov

....все тэги



UPDONW
Новый дизайн