Итак, вечер пришел. Прошу извинение за задержку, дела.
Как и обещал выкладываю алгоритм торговли, постараюсь всё подробно описать, объяснить…
Поехали..
Вы постоянно в рынке. Алгоритм ревисный.
Вход в лонг, он же выход шорт. Вход в шорт, он же выход из лонга.
Условие ЛОНГ:
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
Будут вопросы, пишите. Всем отвечу.
Некоторые строки выводятся не корректно. Сброшу.
Удачи!!
спасибо
Не «ревисный», а реверсный.
a181aa@outlook.com
Спасибо!
не владею.
недавно увидел www.set50.com/cgi-bin/formula.asp#P
пожалуй самый объемный сайт по наличию формул и стратегий. много муры, но всегда приятно что то стырить!!! чем писать самому.
Попробуйте метатрейдер. Ваша стратегия уместится в 300 строк максимум вместо текущих 900.
2)если да то за какой период оптимизировал, и на каком периоде прогонял?
ПЕРИОД 2009 ПО НАШЕ ВРЕМЯ
где освоить язык (руководство, обучалка, сайт) и как ты подключал MetaTrader к бирже?
Я в этом полный чайник, возможно что-то не так написал :)
Но, что то не хочет тестер программ Метастока 7.2 воспринимать
формулу в написанном тобой виде.
Если можно то напиши в формате тестера метастока.
Там вот есть формула типа Mov(C,1,E)> Mov(C,2,E)…
Можно переделать твою формулу так, что бы можно было протестировать в Метастоке 7.2?
Enter long
Enter short
Close long
Close short
я не программер, но условия задачи свучали слишком просто, а вот код почему-то слишком сложный :(
knyazevslavka@yandex.ru
спасибо большое
iz-nino@yandex.ru
В реале алгоритм сольет.
Скиньте пожалуйста на — den5958@mail.ru
В вашем блоге в разделе «контакты»- ничего нет, так что пишу здесь. С уважением.
Спасибо!
Мы-то знаем что именно такие простые вещи и работают, но зачем палить их?
ma1:=90;
h>=Mov(h,ma1,E) and h>=ref(h,-1)… никогда не торговал по машкам! Как мне в моем MT4, для торговля на хворексе, их воткнуть? Благодарю за ответ!!! )
и подобных роботов у меня штук 5 или 10 и не приносят они того что хотелось бы, а если приносят за год то просадка дикая… страшно торговать…
Николай, хай больше машки 90 периодной експоненциальной и предыдущий хай меньше текущего
Условие ЛОНГ:
ma1:=90;
h>=Mov(h,ma1,E) and h>=ref(h,-1),
например если 1 часе, у меня стоит Moving Everage Eponential, период 21, применить к Close… Что нужно мне поменять у себя?
Спасибо… до этого торговал по звездам, ща решил с машкой попробовать), только с хорошими параметрами никто не может подсказать(
Я бы такое не стал торговать.
На других рынках не пробовал проверять?