Глобальный стоплосс и тейкпрофит. Торговый робот «Завхоз»
Еще был вариант как назвать статью: «Ограничитель жадности»
Под глобальными тейкпрофитом и стоплоссом я подразумеваю суммарную прибыль и убыток по счету, при достижении которых позиции закрываются и торговля на эту сессию останавливается. Полезность сего, спросите вы? Подобный механизм может применяться как непредвзятый контроль за состоянием счета какого-то трейдера, так и действительно ограничитель жадности: заработал робот N рублей — хватит испытывать судьбу. Кстати, это распространенный прием у скальперов: остановиться когда заработал определенную сумму денег.
Механизм представляю в виде отдельных кусков кода, готовых для встройки в ваши системы. Все увязано с теми блоками, которые на сайте часто используются, например закрытие позиций по времени, который мы уже рассматривали тут.
'========= НАСТРОЙКИ
QUANT=2 ' ОПЕРАЦИОННОЕ КОЛИЧЕСТВО ЛОТОВ
GLOBAL_TAKEPROFIT=2000 ' В РУБЛЯХ НА ЛОТ
GLOBAL_STOPLOSS=-2000
BEGINSES=100100
ENDSES=234530
'========= ПЕРЕМЕННЫЕ
NEW_GLOBAL("FLAGEND",0)
'========= ПОЛУЧАЕМ ОБЩИЕ ЗНАЧЕНИЯ
GLOBAL_TAKEPROFIT=GLOBAL_TAKEPROFIT*QUANT
GLOBAL_STOPLOSS=GLOBAL_STOPLOSS*QUANT
'========= ДАТА И ВРЕМЯ СЕРВЕРНОЕ
SERVERTIME=GET_INFO_PARAM("SERVERTIME")
TIMESERV=SUBSTR(SERVERTIME,0,2)&SUBSTR(SERVERTIME,3,2)&SUBSTR(SERVERTIME,6,7)
TIME=TIMESERV+0
TRID=TIME ' В КВИКЕ 5.18 ИЗМЕНЕНА РАЗРЯДНОСТЬ ID ТРАНЗАКЦИИ, В РАННИХ ВЕРСИЯХ РОБОТОВ Я ВСЕГДА УКАЗЫВАЛ ТАК: TRID=TIME&DATE, ТЕПЕРЬ ТАКОЕ НЕ ПРОХОДИТ..
'========= ДАННЫЕ ТАБЛИЦЫ ОГРАНИЧЕНИЯ ПО СЧЕТАМ
I=1 ' ЭТО НОМЕР СТРОКИ В ТАБЛИЦЕ "ОГРАНИЧЕНИЯ ПО СЧЕТАМ", ИЗ КОТОРОЙ МЫ БЕРЕМ ДАННЫЕ ПО ДЕНЬГАМ. КАК ПРАВИЛО ЭТО ПЕРВАЯ СТРОКА
VARMARGIN=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "VARMARGIN")+0 ' ВАРМАРЖА
ACCRUEDINT=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "ACCRUEDINT")+0 ' НАКОПЛЕННЫЙ ДОХОД
COMISSION=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "TS_COMISSION")+0 ' КОМИССИЯ
FULL_RESULT=VARMARGIN+ACCRUEDINT+COMISSION ' ОБРАТИТЕ ВНИМАНИЕ. КОМИССИЮ ТОЖЕ ПРИБАВЛЯЕМ, Т.К. ОНА ОТРИЦАТЕЛЬНАЯ
'========= КОНТРОЛЬ ОБЩЕГО ФИНРЕЗУЛЬТАТА
IF FULL_RESULT>GLOBAL_TAKEPROFIT OR FULL_RESULT<GLOBAL_STOPLOSS
ENDSES=BEGINSES ' ПРОСТО МЕНЯЕМ ВРЕМЯ ОКОНЧАНИЯ СЕССИИ!!
END IF
'========= ЗАКРЫТИЕ ПОЗИЦИЙ В КОНЦЕ СЕССИИ
IF TIME>ENDSES AND FLAGEND=0
FLAGEND=1 ' УСТАНАВЛИВАЕМ ФЛАГ = 1, ЧТОБ БЛОК РАБОТАЛ ОДИН РАЗ
MESSAGE("ЗАКРЫВАЮ ПОЗИЦИИ. РЕЗУЛЬТАТ="&FULL_RESULT,1)
IF TP>0
LOTS=ABS(TP) ' КОЛ-ВО ЛОТОВ РАВНО ОТКРЫТОЙ ПОЗИЦИИ
SELL(1)
END IF
IF TP<0
LOTS=ABS(TP)
BUY(1)
END IF
END IF
Конечно нужно использовать наши основные функции, например такие как получение колва активных заявок, функции BUY и SELL. Т.е. для применения этот код нужно вставлять в ваших роботов. Здесь я привел сам механизм реализации, для примера. Главное надо стараться не городить излишних функций, которые так или иначе скажутся на времени исполнения робота, здесь я постарался элегантно решить задачу, используя существующие блоки.
В этом примере я показал как использовать абсолютные уровни общей прибыли и убытка, а вот код робота, который отслеживает просадку по счету в %, и не дает дальше торговать вручную: снимает заявки, закрывает позиции, как только уровень просадки превышает заданный уровень. Робот выложен в бесплатном доступе, я назвал его «Завхоз». Enjoy!!
PORTFOLIO_EX ZAVHOZ;
DESCRIPTION ZAVHOZ;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
' НАСТРОЙКИ ТОЛЬКО ЗДЕСЬ!
ACCOUNT="SPBFUT00XXX" ' ВПИСАТЬ АККАУНТ НА ФОРТС
DRODOWN_OF_LIMITOPEN=3 ' ПРОЦЕНТ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ
BEGINSES=100000 ' НАЧАЛО РАБОТЫ
ENDSES=234500 ' ОКОНЧАНИЕ
' ***************
'========= ДАННЫЕ ТАБЛИЦЫ ОГРАНИЧЕНИЯ ПО СЧЕТАМ
I=1
LIMITOPEN=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "CBPLIMIT")+0
VARMARGIN=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "VARMARGIN")+0
ACCRUEDINT=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "ACCRUEDINT")+0
COMISSION=GET_VALUE (GET_ITEM ("FUTURES_CLIENT_LIMITS", I), "TS_COMISSION")+0
FULL_RESULT=VARMARGIN+ACCRUEDINT+COMISSION ' РАССЧИТЫВАЕМ ОБЩИЙ РЕЗУЛЬТАТ
IF LIMITOPEN=0
MESSAGE("НЕ НАЙДЕН ЛИМИТ ОТКРЫТЫХ ПОЗИЦИЙ!",1)
END IF
'========= ДАТА И ВРЕМЯ СЕРВЕРНОЕ
SERVERTIME=GET_INFO_PARAM("SERVERTIME")
TIMESERV=SUBSTR(SERVERTIME,0,2)&SUBSTR(SERVERTIME,3,2)&SUBSTR(SERVERTIME,6,7)
TIME=TIMESERV+0
TRID=TIME
'========= КОНТРОЛЬ ВРЕМЕНИ СЕССИИ И СОЕДИНЕНИЯ С СЕРВЕРОМ
IF TIME<BEGINSES OR IS_CONNECTED()<>1 OR TIME>ENDSES
RETURN
END IF
'========= ПРОВЕРКА ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ
KOEFFLIMIT=(VARMARGIN+ACCRUEDINT+COMISSION)+(LIMITOPEN*(DRODOWN_OF_LIMITOPEN/100))
IF KOEFFLIMIT<0
CLOSE_ALL_POSITION(1) ' ЗАКРЫВАЕМ ОТКРЫТЫЕ ПОЗИЦИИ
END IF
'========= ТАБЛИЦА
OUTPUT=CREATE_MAP()
OUTPUT=SET_VALUE(OUTPUT,"TIME",TIME)
OUTPUT=SET_VALUE(OUTPUT,"FULL_RESULT",FULL_RESULT)
DELETE_ALL_ITEMS()
ADD_ITEM(1,OUTPUT)
'========= ФУНКЦИИ
' CLOSE_ALL_POSITION
FUNC CLOSE_ALL_POSITION(KEY)
INSTRUMENT="" ' ОБЪЯВЛЯЕМ (ЗАОДНО ОБНУЛЯЕМ) ПЕРЕМЕННЫЕ
TP=0
IF GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS")>0
FOR PAPIR FROM 0 TO GET_NUMBER_OF("FUTURES_CLIENT_HOLDINGS")
IF GET_VALUE (GET_ITEM ("FUTURES_CLIENT_HOLDINGS", PAPIR), "TRDACCID")=ACCOUNT AND GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",PAPIR), "TOTAL_NET")+0<>0
TP=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",PAPIR), "TOTAL_NET")+0
INSTRUMENT=GET_VALUE(GET_ITEM("FUTURES_CLIENT_HOLDINGS",PAPIR), "SECCODE")
CLASSCODE=GET_VALUE(GET_SECURITY_INFO("",INSTRUMENT),"CLASS_CODE")&""
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
'========= ЗАКРЫВАЕМ ПОЗИЦИИ
IF TP>0
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
LOTS=ABS(TP)
KILLALLSTOP(1) ' СНИМАЕМ АКТИВНЫЕ СТОПЫ
KILLALLORDERS(1) ' СНИМАЕМ АКТИВНЫЕ ЗАЯВКИ
SELL(1)
END IF
IF TP<0
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
LOTS=ABS(TP)
KILLALLSTOP(1) ' СНИМАЕМ АКТИВНЫЕ СТОПЫ
KILLALLORDERS(1) ' СНИМАЕМ АКТИВНЫЕ ЗАЯВКИ
BUY(1)
END IF
END IF
END FOR
END IF
END FUNC
' BUY
FUNC BUY(KEYS)
PRICE=ASK+STEP*20
ORDER(PRICE,LOTS,"B")
END FUNC
' SELL
FUNC SELL(KEYS)
PRICE=BID-STEP*20
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")
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), "ACCOUNT")=ACCOUNT
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
NEW_GLOBAL("TRANS_PARAMS", "")
NEW_GLOBAL("TRANS_RESULT", "")
TRANS_PARAMS = ""
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, "TRANS_ID", "8"&TRID)
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
' 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), "ACCOUNT")=ACCOUNT
MESSAGE("ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ОТ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО!",1)
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", CLASSCODE)
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
END_PROGRAM
PARAMETER TIME;
PARAMETER_TITLE ВРЕМЯ;
PARAMETER_DESCRIPTION ВРЕМЯ;
PARAMETER_TYPE STRING(30);
END
PARAMETER FULL_RESULT;
PARAMETER_TITLE ФИН.РЕЗУЛЬТАТ;
PARAMETER_DESCRIPTION ФИН.РЕЗУЛЬТАТ;
PARAMETER_TYPE NUMERIC(10,2);
END
END_PORTFOLIO_EX
Обратите внимание! В роботе использован модуль определения открытых позиций по автоматически определяемому инструменту на ФОРТС по настроенному аккаунту. Таким образом, если допустим что этот робот установлен у человека, который превысил заданный % убытка от счета, при выставлении этим человеком заявок, стопзаявок, либо открытия им позиций — робот будет все закрывать и стращать страшными сообщениями.
Вот такая сегодня большая публикация, которой я хотел показать, что нужно и важно постоянно экспериментировать и развиваться! Да, QPILE одновременно громоздкий язык и способ автоматизации, но тем не менее на сегодня это самый НАДЕЖНЫЙ способ автоматизации. И более того, позволяет делать абсолютно любые вещи!
Ищите и обрящите!
Полезная вещь,ограничитель жадности.И в финансовых спекуляциях и вдругих жизненых ситуациях.А разработчики QPILE вам вобщее должны приплачивать за элегантные и нестандартные решенния и за то-что вы делаете из громоздкого и мало понятного языка,понятный и доступный QPILE
Евгений, спасибо за пост.
В функции KILLALLORDERS делаете проход по всем заявкам
FOR I FROM 0 TO GET_NUMBER_OF («ORDERS»)
но если нумерация с 0 начинается не делается ли лишняя итерация?
Напрашивается, либо FOR I FROM 1 TO GET_NUMBER_OF («ORDERS»)
либо FOR I FROM 0 TO GET_NUMBER_OF («ORDERS») -1
в документации quik они бегут FOR'ом начиная с индекса 1, правда по таблице ALL_TRADES:
n=GET_NUMBER_OF (“ALL_TRADES”)
value=0
FOR i FROM 1 to n
trade = GET_ITEM ("ALL_TRADES ", i)
value = value + GET_VALUE (trade, «VALUE»)
END FOR
Евгений Reply:
ноября 29, 2010 at 11:48
Привет.
Спросил у разработчиков, вот ответ:
«Для функции GET_ITEM при обращении к таблицам номера строк начинаются с 1.
С уважением,
Олег Хуснутдинов
ARQA Technologies»
Насколько я помнил, раньше таблицы начинались с нулевой строки, видимо поменяли. В коллекциях точно первый элемент нулевой...
Меняем ноль на единицу!
Евгений, добрый день!
помогите пожалуйста разобраться... робот выдает сообщение НЕ НАЙДЕН ЛИМИТ ОТКРЫТЫХ ПОЗИЦИЙ!
с чем это может быть связано? все соответствующие таблицы у меня загружены. Версия QUIK 5.18.0.386
Спасибо!
Евгений Reply:
февраля 15, 2011 at 10:07
Привет.
В блоке «ДАННЫЕ ТАБЛИЦЫ ОГРАНИЧЕНИЯ ПО СЧЕТАМ» есть переменная I=1, это значит что данные из таблицы ограничений берутся из первой строки. попробуйте I=2. А также внимательно рассмотрите свою эту таблицу, в какой строке записаны данные.
DimS Reply:
февраля 19, 2011 at 14:36
Евгений,
перепробовал все... и в самом теле робота менял, и в квике положение в таблице менял... результат тот же. что еще может причиной быть???
и еще вопрос... не втречал ли ты когда-нибудь программу которая целиком блокирует доступ к любой активности в терминале или к самому терминалу при достижения определенного уровня убытка??? или может подскажешь с кем пообщаться можно на эту тему...
Спасибо!
Евгений Reply:
февраля 21, 2011 at 18:26
Привет.
1. Напишите мне в личку любое сообщение с вашей почтой.
2. Таких программ не встречал, но этот робот «Завхоз» почти то. о чем вы спрашиваете. единственное отличие — он не может физически ограничить доступ к терминалу.
Евгений, добрый день! у меня сегодня возникла ситуация когда при достижении тейкпрофита робот закрыл позицию,но не добрал 5 пунктов цены , после чего открыл позицию заново, это связонно с замедленным рассчетом В ТАБЛИЦЕ «ОГРАНИЧЕНИЯ ПО СЧЕТАМ», ИЗ КОТОРОЙ МЫ БЕРЕМ ДАННЫЕ ПО ДЕНЬГАМ. то есть цена после достижения уровня заданого тейкпрофета уже пошла в обратную сторону а в ТАБЛИЦЕ «ОГРАНИЧЕНИЯ ПО СЧЕТАМ» только отабразильсь данные с задержкой и была выстовлена заявка на закрытия позиции ,после закрытия позиции робот пересчитал FULL_RESULT а он меньше GLOBAL_TAKEPROFIT и открыл позицию заново. Евгений,как сделать чтобы если позиция закрыта то повторно она больше не открывалась
Евгений Reply:
марта 18, 2011 at 21:36
Привет.
1. Где то в настройках кивка есть период обновления данных, проверьте, может у вас можно уменьшить.
2. Сделайте глобальную переменную, и присваивайте ей значение=1 когда отработал механизм закрытия позиций. А этот механизм проверяет эту переменную, и если она=1 то не работает. Это защита от повторных срабатываний. Этот алгоритм есть в этой публикации выше.
Евгений, добрый день!
Подскажите что нужно добавить в код робота, чтобы в таблице отражался дополнительный параметр прибыль/убыток в процентах.
Я тут попробовал это сделать по своему разумению, добавли строки в код в соответствующих местах, но результат только пустое место в таблице(сразу говорю не силен я в этом):
DAYSTARTMONEY=GET_VALUE (GET_ITEM («FUTURES_CLIENT_LIMITS», I), «CBPLIMIT»)+0
PLPERSENT=(VARMARGIN+ACCRUEDINT+COMISSION)/DAYSTARTMONEY
OUTPUT=SET_VALUE (OUTPUT,"PLPERSENT",PLPERSENT)
PARAMETER PLPERSENT;
PARAMETER_TITLE %;
PARAMETER_DESCRIPTION %;
PARAMETER_TYPE NUMERIC (10,2);
END
Прошу помочь с этим! Заранее благодарен! С уважением, Дмитрий.
Евгений Reply:
октября 1, 2011 at 23:54
Точно на ноль не делите? Проверьте код с такой строкой:
PLPERSENT=(VARMARGIN+ACCRUEDINT+COMISSION)
И проверьте чтоб строка OUTPUT=SET_VALUE (OUTPUT,"PLPERSENT",PLPERSENT) была выше чем
DELETE_ALL_ITEMS ()
ADD_ITEM (1,OUTPUT)
а как робот будет выглядеть для ммвб?
Евгений Reply:
ноября 10, 2011 at 14:15
Основное — тоже самое. Только получаем данные прибыли/убытка из соответствующих ММВБ таблиц.
Здравствуйте, Евгений! Подскажите, пожалуйста: когда происходит блокировка выставления заявок «Завхозом» и в окне сообщений появляется надпись: ДОПУСТИМОЕ ЗНАЧЕНИЕ ПРОСАДКИ ЛИМИТА ОТКРЫТЫХ ПОЗИЦИЙ ИСЧЕРПАНО", то когда произойдет разблокировка и можно будет снова торговать?
Евгений Reply:
ноября 30, 2011 at 22:37
Привет.
Блокировки как раз нет, просто робот автоматически снимает выставляемые стопы и заявки, закрывает позиции. т.е. не дает торговать. Перестанет он это делать если:
1. Остановить или удалить робота
2. На следующую сессию, когда лимит открытых позиций и вармаржа обновятся.
Большое спасибо! А не подскажите как остановить робота? И еще один вопрос, если можно, есть ли история использования робота на реальном счете и какова она, т.е. насколько надежен робот во времени, не давал ли он каких либо сбоев в каких то штатных и нештатных ситуациях.Вообще: чего нужно опасаться, используя этого робота?
Еще раз спасибо.
Евгений Reply:
декабря 4, 2011 at 22:07
Правой кнопкой по таблице робота — приостановить.
Робот оттестирован. Главное условие — правильные настройки и наличие связи с сервером. Если время в роботе тикает — значит он работает.
Здравствуйте, Евгений. Спасибо за ответы. Робот работает и помогает. Сегодня, правда, произошла «Ошибка расчета портфеля»- робот остановился. Не поясните, почему это произошло, что это значит и что нужно сделать, что бы это не повторялось?
Евгений Reply:
декабря 21, 2011 at 8:41
Привет.
Когда появляется такое сообщение — там написано в какой строке и что не нравится квику. Вот это нужно знать чтоб понять что не так.
Здравствуйте, Евгений. C Новым Годом, Вас! Спасибо за ответы. С этой проблемой я, кажется, то же разобрался. Посмотрю дальше, если повторяться не будет, значит вопрос закрыт. Еще раз спасибо. Всего самого наилучшего в новом году!
Евгений Reply:
января 10, 2012 at 17:51
Спасибо, Вас тоже с праздниками!
Обращайтесь.
Здравствуйте, Евгений. Воспользуюсь Вашей любезностью и обращусь еще раз. Вот такое сообщение появляется иногда в тот момент, когда убыток достигает запрограммированного порога:" Произошла ошибка при расчете портфеля"ZAVHOZ", идентификатор организации «ALL_FIRMS», сообщение об ошибке"File:Копия zavxoz.qpl, line:143. Unknown identifier CLASSCODE [ TRANS_PARAMS= SET_VALUE (TRANS_PARAMS, "CLASSCODE", CLASSCODE)]"
В принципе, поскольку сообщение возникает при достижении заданной просадки, то можно самому закрывать все позиции и прекращать торговлю в этот момент, но психологически это сделать труднее. В идеале было бы, если бы робот все таки срабатывал, т.е. приводил бы счет в номинальное состояние, блокировал торговлю, плюс к этому не давал бы себя перегружать и выгружать, скажем, до конца текущей сессии. Чтобы доступа к торгам, гарантированно не было какое то время, пока психика не придет в норму.
Евгений Reply:
февраля 12, 2012 at 9:42
Привет.
Поправил код, пробуйте. Отпишитесь по результатам.
Спасибо! Обязательно отпишусь.
Здравствуйте, Евгений. Не думал, что так скоро буду писать Вам, но обещал «отписаться»- так вот: робот сработал как надо- закрал, снял, заблокировал торговлю. Я подумав, выгрузил робота и продолжил торговать, в результате чего мой убыток утроился. Всвязи с этим, хочу спросить: а нельзя ли сделать так, что бы его невозможно было выгрузить или перезагрузить, что бы он «железно» отстранял от торгов на какое то время?
Евгений Reply:
февраля 20, 2012 at 20:15
Нет, от такого откровенного саботажа человека робот не спасет.