Торговый робот «Parabolic SAR»
Вы любите фокусы? «Легким движением руки, брюки превращаются...брюки превращаются... В элегантные шорты!» Эта бессмертная фраза должна быть девизом программиста, ибо каждый новый торговый робот, создается из одних и тех же основных, функциональных блоков. Разная только торговая тактика. Так и мы сегодня вспоминаем код торгового робота «Мувинг». Но об этом позже. Итак, что же представляет собой упрощенная торговая тактика игры на бирже по индикатору Parabolic SAR:
На графике мы видим график цены, и линию индикатора Parabolic SAR. Последнюю можно строить в виде точек, но в виде линии она наиболее информативна. Тактика же игры проста: цена выше линии индикатора — покупка, ниже — продажа. Ничего не замечаете? Правильно, точно также играем по одному обычному мувингу! Таким образом, можно взять уже готовый код старого нашего мувинга, сделать небольшую корректировку (а можно и не делать, если параболику присвоить старый идентификатор) и вуаля: элегантные шорты:)
Код на QPILE доступен только зарегистрированным пользователям.
Этой публикацией я хотел показать, что для решения новых задач, надо не бояться использовать существующие решения.
DESCRIPTION SAR;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
' запускаем квик, строим график инструмента, накладываем на него индикатор PARABOLIC SAR, и в настройках индикатора во вкладке «дополнительно» прописываем его идентификатор, какой указан в настройках. выводим таблицы «позиции по клиентским счетам», «ограничения по клиентским счетам»,"таблица заявок","таблица сделок". в меню связь-списки настраиваем получение данных ПО НУЖНОМУ ИНСТРУМЕНТУ.
'========= НАСТРОЙКИ
INSTRUMENT="RIZ0"
IDENTIFICATOR="SAR"
' INSTRUMENT="RTS-3.10" ' ЭТОТ ВАРИАНТ НАИМЕНОВАНИЯ КОДА БУМАГИ ИСПОЗЬУЮТ НЕКОТОРЫЕ БРОКЕРЫ, НАПРИМЕР БК"ОТКРЫТИЕ" НА УЧЕБНЫХ СЧЕТАХ.
ACCOUNT="SPBFUT00XXX" ' ПРОПИСЫВАЕМ АККАУНТ НА ФОРТС
LOTS=1 ' ОПЕРАЦИОННОЕ КОЛИЧЕСТВО ЛОТОВ
' *********************
'========= ПЕРЕМЕННЫЕ
NEW_GLOBAL («FLAGSELL»,1) ' ФЛАГ РАЗРЕШЕНИЯ НА ПРОДАЖУ
NEW_GLOBAL («FLAGBYE»,1) ' ФЛАГ РАЗРЕШЕНИЯ НА ПОКУПКУ
'========= ПОЛУЧАЕМ ЗНАЧЕНИЕ ЦЕНЫ ПОСЛЕДНЕЙ СДЕЛКИ
LAST=GET_VALUE (GET_PARAM_EX («SPBFUT»,INSTRUMENT,"LAST"),"PARAM_VALUE")+0
'========= ДАТА И ВРЕМЯ СЕРВЕРНОЕ
SERVERTIME=GET_INFO_PARAM («SERVERTIME»)
SERVERDATE=GET_INFO_PARAM («TRADEDATE»)
TIMESERV=SUBSTR (SERVERTIME,0,2)&SUBSTR (SERVERTIME,3,2)&SUBSTR (SERVERTIME,6,7)
TIME=TIMESERV+0
DATE=SUBSTR (SERVERDATE,6,4)&SUBSTR (SERVERDATE,3,2)&SUBSTR (SERVERDATE,0,2)
TRID=TIME&DATE
'========= ТЕКУЩАЯ ПОЗИЦИЯ И КОЛ-ВО АКТИВНЫХ ЗАЯВОК
TP=0
ORDERCOUNTBUY=0
ORDERCOUNTSELL=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
TP=GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS»,I), «TOTAL_NET»)+0
ORDERCOUNTBUY=GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS»,I), «OPEN_BUYS»)+0
ORDERCOUNTSELL=GET_VALUE (GET_ITEM («FUTURES_CLIENT_HOLDINGS»,I), «OPEN_SELLS»)+0
ORDERCOUNT=ORDERCOUNTBUY+ORDERCOUNTSELL
END IF
END FOR
'========= ОБНУЛЕНИЕ ПЕРЕМЕННЫХ ПРИ ОТСУТСТВИИ ОТКРЫТЫХ ПОЗИЦИЙ
IF TP=0 AND ORDERCOUNT=0
FLAGSELL=1
FLAGBYE=1
END IF
'========= ПРОВЕРКА СОЕДИНЕНИЯ С СЕРВЕРОМ
IF IS_CONNECTED ()<>1
RETURN
END IF
'========= ПОЛУЧЕНИЕ ДАННЫХ ИНДИКАТОРА
INDICATOR=GET_VALUE (GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX (IDENTIFICATOR, DATE, TIME),"LINES"),0),"OPEN") +0
IF INDICATOR=0
RETURN
END IF
'========= ФОРМИРОВАНИЕ ПРИКАЗА НА ОТКРЫТИЕ ПОЗИЦИИ
OP="«
IF TP=0
IF LAST>INDICATOR AND ORDERCOUNT=0 AND FLAGBYE=1
OP=»B"
FLAGBYE=0
FLAGSELL=1
END IF
IF LAST<INDICATOR AND ORDERCOUNT=0 AND FLAGSELL=1
OP="S"
FLAGSELL=0
FLAGBYE=1
END IF
END IF
'========= ФОРМИРОВАНИЕ ПРИКАЗА НА РЕВЕРС ПОЗИЦИИ
IF TP<0 AND LAST>INDICATOR
IF ORDERCOUNT=0 AND FLAGBYE=1
LOTS=ABS (TP)*2 ' УДВОЕНИЕ ЛОТОВ ДЛЯ РЕВЕРСА
OP="B"
FLAGBYE=0
FLAGSELL=1
END IF
END IF
IF TP>0 AND LAST<INDICATOR
IF ORDERCOUNT=0 AND FLAGSELL=1
LOTS=ABS (TP)*2 ' УДВОЕНИЕ ЛОТОВ ДЛЯ РЕВЕРСА
OP="S"
FLAGSELL=0
FLAGBYE=1
END IF
END IF
'========= ВЫЗОВ ФУНКЦИИ ОТПРАВКИ ТРАНЗАЦИИ
IF OP="B"
PRICEFORORDER=LAST+100 ' УВЕЛИЧЕНИЕ ЦЕНЫ ПОКУПКИ ДЛЯ ПСЕВДОРЫНОЧНОЙ СДЕЛКИ
ORDER (PRICEFORORDER,LOTS,OP)
END IF
IF OP="S"
PRICEFORORDER=LAST-100 ' УМЕНЬШЕНИЕ ЦЕНЫ ПРОДАЖИ ДЛЯ ПСЕВДОРЫНОЧНОЙ СДЕЛКИ
ORDER (PRICEFORORDER,LOTS,OP)
END IF
'========= ФУНКЦИЯ ПАУЗА
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
'========= ФУНКЦИЯ ОТПРАВКИ ТРАНЗАЦИИ
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, «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», FDIRECTION&"«)
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, „PRICE“, FPRICE&»")
TRANS_PARAMS = SET_VALUE (TRANS_PARAMS, «QUANTITY», FLOTS&"«)
TRANS_RESULT = SEND_TRANSACTION (300, TRANS_PARAMS)
RESULT=GET_VALUE (TRANS_RESULT, „DESCRIPTION“)
MESSAGE (RESULT,1)
PAUSE (1)
END FUNC
'========= ВЫВОД ДАННЫХ В ТАБЛИЦУ
OUTPUT=CREATE_MAP ()
OUTPUT=SET_VALUE (OUTPUT,»DATE",DATE)
OUTPUT=SET_VALUE (OUTPUT,"TIME",TIME)
OUTPUT=SET_VALUE (OUTPUT,"INDICATOR",INDICATOR)
OUTPUT=SET_VALUE (OUTPUT,"TP",TP)
OUTPUT=SET_VALUE (OUTPUT,"LAST",LAST)
DELETE_ALL_ITEMS ()
ADD_ITEM (1,OUTPUT)
END_PROGRAM
PARAMETER DATE;
PARAMETER_TITLE ДАТА;
PARAMETER_DESCRIPTION ДАТА;
PARAMETER_TYPE STRING (30);
END
PARAMETER TIME;
PARAMETER_TITLE ВРЕМЯ;
PARAMETER_DESCRIPTION ВРЕМЯ;
PARAMETER_TYPE STRING (30);
END
PARAMETER INDICATOR;
PARAMETER_TITLE ИНДИКАТОР;
PARAMETER_DESCRIPTION ИНДИКАТОР;
PARAMETER_TYPE NUMERIC (10,2);
END
PARAMETER TP;
PARAMETER_TITLE ТЕКЧИСТПОЗ;
PARAMETER_DESCRIPTION ТЕКЧИСТПОЗ;
PARAMETER_TYPE NUMERIC (10,0);
END
PARAMETER LAST;
PARAMETER_TITLE ТЕКУЩАЯ КОТИРОВКА;
PARAMETER_DESCRIPTION ТЕКУЩАЯ КОТИРОВКА;
PARAMETER_TYPE NUMERIC (10,2);
END
END_PORTFOLIO_EX

Полностью с вами согласен,лично я когда делаю что то свое использую ваши готовые блоки,просматриваю регулярно все ваши новые статьи,и комментарии,и выбираю все что мне полезно или решения элегантней чем у меня,язык развивается но как правло все функции ,и решения остаются прежними, внимательно прочитывая ваш сайт, используя нарезки из ваших кодов можно описать практическую любую стратегию,только по арбитражу нет публикаций пару советов в комментах,Евгений огромное спасибо за ресурс,как говарится респект и уважение.
Ошибка, упоминаемая в FAQ;
при попытке загрузить программу в QUIK выдает ошибку в строке №1.
неверно указан тип параметра.
Действительно, 3-я строка снизу:
PARAMETER_TYPE STRING NUMERIC (10,2);
заменить на
PARAMETER_TYPE NUMERIC (10,2);
Теперь загрузка без ошибок.
Евгений Reply:
декабря 2, 2010 at 19:36
Спасибо за подсказку, поправил!
Приведённые в пример индикаторы работают на пересечении либо двух линий индикатора, либо линии индикатора с графиком цены. Мне бы хотелось не ограничиваться только лишь пересечением, а добавить в качестве фильтра ложных пересечений индикатор, работающий на сравнении показания индикатора текущего бара с показанием индикатора предыдущего.
MOVING1=GET_VALUE (GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX («SBEREMA9», 20101228, 184000),"LINES"),0),"CLOSE") +0
MOVING2=GET_VALUE (GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX («SBEREMA25», 20101228, 184000),"LINES"),0),"CLOSE") +0
AC_C=GET_VALUE (GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX («SBERAC», 20101228, 184000),"LINES"),0),"CLOSE") +0
AC_C_1=GET_VALUE (GET_COLLECTION_ITEM (GET_VALUE (GET_CANDLE_EX («SBERAC», 20101228, 183500),"LINES"),0),"CLOSE") +0
Эта часть кода на отладке исполняется за счёт разницы во времени (184000 и 183500) и работает правильно, далее реализуем задумку: 2 мувинга пересекаются и если при этом АС текущего бара больше (меньше), чем АС предыдущего, то принимается то или иное решение на транзакцию.
Но я всё же думаю, что эта часть кода слишком громоздка, наверняка есть решение попроще. Подскажите, если есть идеи.
Евгений Reply:
января 2, 2011 at 16:59
Иного пути нет, я бы только добавил автоматическую подстановку даты и времени.
Добрый день, Евгений!
Огромное спасибо Вас за столь нужную многим начинающим трейдерам просветительскую деятельность в области написания помощников и автоматизации торговли. Изучая материалы и примеры на Вашем сайте, я уже вплотную подошёл к созданию своего торгового робота по своей стратегии. Очень много почерпнул из Вашего кода, за что Вам отдельное спасибо.
У меня возник вопрос по тому как Вы реализуете выставление ордеров в своём коде. В частности в данном роботе вы написали функцию отправки транзакции (строки 122-139) по которой у меня возник ряд вопросов.
1. В руководстве по QPILE сказано, что передача транзакций серверу реализована посредством функции SEND_TRANSACTION (DOUBLE wait_timeout_for_replay, MAP trans_params), где trans_params имеет структуру массива, у Вас же эта переменная объявляется как строковая и зачем то 2 раза присваивается пустая строка (строки 124 и 126), после чего Вы начинаете обращаться с ней как с массивом. Я конечно понимаю, что код рабочий, но не логичнее ли было использовать TRANS_PARAMS=CREATE_MAP () и для чего нужно объявлять эту переменную глобальной, ведь при каждом проходе поля этого массива будут заполняться текущими параметрами?
2. Для чего в строке 135 при отправки транзакции на сервер задаётся такое большое время ожидания ответа от сервера аж целых 5мин. В предыдущих роботах у Вас я встречал 30 сек., но и это мне кажется слишком много. При ожтдании ответа от сервера будет ли происходить переход выполнения следующей строки программы если ответ ещё не получен?
3. Каков тайный смысл в использовании функции PAUSE (1) в строке 138? Для чего нужна эта задержка?
Евгений Reply:
января 18, 2011 at 17:02
Привет.
1. Вы правы. Эти строки в коде — атавизм
2. Будет.
P.S. По пункту 3 своего предыдущего комента ответ нашёл в коментах к другим роботам, а по пунктам 1 и 2 прошу разъяснить.
Добрый день. Скажите а как можно реализовать параболик с разными шагами при движении цены вверх и вниз? Такая стратегия дает намного более лучшие результаты на истории чем один и то же шаг. Но в Квике нельзя задать разные шаги вниз и вверх, и ничего лучше чем в коде робота самостоятельно вычислять параболики я не нашел, получается громоздко и неудобно.
Евгений Reply:
февраля 10, 2011 at 14:53
Делаете график цены с наложенными двумя параболиками, но с разными шагами последнего и разными идентификаторами. Робот для движения цены вверх и лонга соответственно смотрит на один параболик, а для шорта на второй.
kas13 Reply:
февраля 10, 2011 at 15:02
Этот вариант к сожалению не прокатывает, сразу об этом думал. Два независимых параболика с разными параметрами совсем не одно то же что и один параболик с разными параметрами. Точки входа-выхода в этих 2х вариантах совершенно разные. Из-за того что формула рекурсивная и при расчете значения используется прошлое значение индикатора дальше расхождение еще больше увеличивается.
Я так понял придется в теле робота считать все-таки.
Евгений Reply:
февраля 12, 2011 at 0:45
Попробуйте просчитать вариант, когда стратегия работает только с лонгом, без шорта. Довольно распространенная практика.
Евгений Reply:
февраля 12, 2011 at 0:57
И еще, я не догнал, почему вам не нравится вариант с двумя параболиками с разными настройками?
kas13 Reply:
февраля 12, 2011 at 17:18
Сложно объяснить словами, на картинке все было бы видно. Но представьте, что есть параболик который вы планируете использовать на росте, пусть это будет Бычий параболик, и есть параболик на падении — Медвежий. Настройки у них совсем разные.
Допустим рынок растет, вы используете Бычий параболик и наблюдаете за позицией. Рынок начал снижаться Бычий параболик показал переворот в короткую позу в точке Х. Вот отсюда (со свечки Х) вы становитесь в шорт, и надо бы использовать Медвежий параболик. Но в силу других настроек, он скорее всего до сих пор не показал точку переворота после роста и перевернется тоже в короткую позу в точке Х+к (тогда наша короткая позиция будет тут же бесщадно ликидирована роботом сразу после открытия). Либо же, если он более быстрый он показал переворот не вточке Х а уже в точке Х-n (наша позиция тогда не будет ликвидирована, но мы получим не те значения параболика которые хотели бы.
В общих словах — один параболик с разыми настройками позволяет эту рассинхронизацию входов и выходов избежать. Медвежий параболик начинает рассчитываться именно в тот момент когда бычий первернулся и отрабатывает падение, а бычий начинает расчитываться только на росте в тот момент когда медвежий перевернулся. А так в принципе да — это два разных параболика, но с совмещенными точками входа.
Евгений Reply:
февраля 12, 2011 at 19:44
Т.е. как бы два параболика устраивают, главное разобраться в какой момент времени какой параболик принимать за рабочий?
kas13 Reply:
февраля 12, 2011 at 20:09
Ну по сути...в какой-то мере да)))
Почему спрашивал — просто есть оттестированная стратегия с определенными параметрами, воспроизвести которую в точности двумя параболиками неполучалось, думал что сделать. Но вот почитал комменты, подумал..., может и с двумя разными, как вы говорите, еще лучше получится, надо только и вправду следить следить за рабочим параболиком чтобы он позу тутже не закрыл)) а так-то верно)) надо потестить. Спасибо)
Евгений Reply:
февраля 12, 2011 at 21:25
Не за что! Пишите что получится.
Добрый вечер. Не нашел код этого робота в виде файла.
Евгений Reply:
февраля 21, 2011 at 19:49
Да, видимо я его не выложил. Скопируйте код робота в текстовый файл с расширением qpl.
Добрый день Евгений! Подскажите пожалуйста, все загрузил, но выдает ошибку, что неправильно указан идентификатор транкзаций и числовой параметр с датой в кавычках показывает. И следующий вопрос- этото робот работает в реверсе? Спасибо.
Евгений Reply:
апреля 1, 2011 at 19:07
Идентификатор поправил — в версии 5.18 его длину укоротили.
Реверс реализован.
Добрый день! Подскажите, как можно в Вашем роботе оформить переключение:
-только лонг;
-только шорт;
-реверс.
Спасибо.
Евгений Reply:
апреля 6, 2011 at 22:36
Привет.
Надо заводить переменную в настройках, например:
SET_OPEN_POS=1 ' 1-ТОЛЬКО ЛОНГ, 2-ТОЛЬКО ШОРТ, 3-РЕВЕРС
И в блоке «формирование приказа» делать дополнительную проверку этой переменной, и далее действовать в соответствии с этим условием.
neocraft Reply:
сентября 26, 2011 at 22:16
а как реализовать дополнительную проверку?
как я могу приобрести торгового робота параболик сар
Евгений Reply:
июля 7, 2011 at 22:45
Привет.
Именно этот вы просто можете скачать отсюда, с сайта.
@kas13
получилось что-нибудь из затеи с двумя параболиками?
Евгений Reply:
июля 10, 2011 at 11:09
Отвечу за него: там нет ничего сложного: накладываем два параболика с разными параметрами и идентификаторами, один смотрим для шорта, второй для лонга. Изменений для кода минимум.
rasswet Reply:
июля 10, 2011 at 11:11
да вот пробую... пока параметров адекватных для каждого из них подобрать не удалось. не то вижу что хотелось бы((
не подскажете с каких надо начать?
Евгений Reply:
июля 10, 2011 at 11:14
Параметры — это сугубо индивидуально. Сотни инструментов, десяток таймфреймов, столько же параметров — тысячи вариантов. Теханализ на истории вам поможет.
У меня в Квике 2 счёта, вот как раз на 2-й не получается настроить данный робот, если на 1-м счету он уже работает. Показывает данные с первого счёта, хотя в настройках данные счёта другие прописаны и идентификатор индикатора другой прописал. Что сделать чтобы на 2-х счетах работал, на одном инструменте?
Евгений Reply:
сентября 27, 2011 at 19:19
Привет.
Рад что вы уже с нами!
В первых двух строках кода указывается название робота, для второго робота измените, добавьте цифру два, например. Иначе оба кода грузятся в одно и тоже окно портфеля.
neocraft Reply:
сентября 28, 2011 at 23:34
Если было всё так просто... не помогает этот вариант.
Евгений Reply:
сентября 29, 2011 at 18:56
Тогда рассказывайте подробно, что в таблице первого что в таблице второго робота?
neocraft Reply:
октября 3, 2011 at 13:38
Первый:
PORTFOLIO_EX SAR-1;
DESCRIPTION SAR-1;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
'========= НАСТРОЙКИ
INSTRUMENT="RIZ1"
IDENTIFICATOR="SAR"
ACCOUNT="SPBFUT00X..." ' ПРОПИСЫВАЕМ АККАУНТ НА ФОРТС
и т.д.
__________________________________________________
Второй:
PORTFOLIO_EX SAR-2;
DESCRIPTION SAR-2;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
'========= НАСТРОЙКИ
INSTRUMENT="RIZ1"
IDENTIFICATOR="SAR2"
ACCOUNT="SPBFUT002..." ' ПРОПИСЫВАЕМ АККАУНТ НА ФОРТС
и т.д.
Евгений Reply:
октября 3, 2011 at 19:10
Здесь все правильно. Когда оба робота загрузили — что в обеих таблицах?
neocraft Reply:
октября 3, 2011 at 19:43
Когда запускаю второй, в таблице все параметры от первого, т.е. точная копия.
Евгений Reply:
октября 3, 2011 at 19:48
Значит при CTRL-F12 вы выбираете не второго а первого робота два раза.
neocraft Reply:
октября 3, 2011 at 22:12
Если бы...
Сейчас всё заново передалал на фьючерс по сберу, результат тот же!!!
Соответственно проблема не решена.
Евгений Reply:
октября 3, 2011 at 23:02
1. Еще раз проверьте свой алгоритм загрузки и сами файлы. У меня на 4-х вкладках работают одинаковые роботы с разными названиями и никто никому не мешает.
2. Во втором роботе сделайте еще одно поле в таблице, или строку:
MESSAGE («это пишет второй робот»,1)
и загрузите оба и посмотрите, будет ли в окне сообщений эта строка. Если нет — см.п.1 Если да — то все правильно загружено, проверяйте во втором роботе переменные, которые выводятся в таблицу. Для пущего эффекта добавьте в первого робота аналогичную строку с иным текстом.
neocraft Reply:
октября 5, 2011 at 13:14
Да, сообщение появляется и всё загружаю как нужно.
Суть в том, что 2-й работает по своим пораметрам, пока отключен 1-й, как только включаю первый, 2-й сразу же дублирует его, и ни каких сделок по своей формуле не производит.
Евгений Reply:
октября 5, 2011 at 22:16
Версия квика новая?
neocraft Reply:
октября 6, 2011 at 0:24
Версия: 5.23.0.124
Евгений Reply:
октября 6, 2011 at 18:37
Попробуйте переустановить Квик. Или откройте новый тестовый счет и на нем попробуйте.
neocraft Reply:
ноября 8, 2011 at 16:14
Помогли решить проблему в нескольких строчках, сейчас всё работает.
Это относиться не только к этому роботу.
Хотелось бы чтобы выделялись зелёным/красным цветом текущие позиции в окошке робота, если прибыльная — выделялась зелёным и наоборот соответственно. Такое возможно???
Евгений Reply:
сентября 27, 2011 at 19:21
Да, возможно.
IF PROFIT>0
SET_ROW_COLOR_EX (1,"RGB (0,255,0)", «RGB (0,255,0)», «DEFAULT_COLOR», «DEFAULT_COLOR»)
END IF
IF PROFIT=0
SET_ROW_COLOR_EX (1,"DEFAULT_COLOR", «DEFAULT_COLOR», «DEFAULT_COLOR», «DEFAULT_COLOR»)
END IF
IF PROFIT<0
SET_ROW_COLOR_EX (1,"RGB (255,0,0)", «RGB (255,0,0)», «DEFAULT_COLOR», «DEFAULT_COLOR»)
END IF
Естественно перед этим получаем значение переменной PROFIT
neocraft Reply:
сентября 28, 2011 at 16:50
Уже пол дня мучаюсь, не хватает знаний кода, чтобы определить значение переменной PROFIT. Евгений, не могли бы помочь?
Как я понимаю нужно ОПРЕДЕЛИТЬ ЦЕНУ ПО КОТОРОЙ ЗАШЛИ (ENTERLAST)
и далее определяем PROFIT=LAST-ENTERLAST
Евгений Reply:
сентября 28, 2011 at 22:26
Ммм. Вы планировали раскрашивать в зависимости от прибыли\убытка в текущей сделке? Если да, то для начала нужно, как вы правильно начали, определить цену сделки. И потом, в зависимости от направления:
— для лонга PROFIT=LAST-ENTERLAST
— для шорта PROFIT=ENTERLAST-LAST
И потом раскрашиваем таблицу. Цену сделки проще всего запоминать при ее открытии в глобальной переменной.
neocraft Reply:
сентября 28, 2011 at 23:37
Да всё верно, цвет текущий сделки, хотелось бы настроить.
Евгений, здравствуйте! Как ограничить количество покупаемых и продаваемых лотов? К примеру, я хочу работать с инструментом в пределах 1000 лотов. Спасибо!
Евгений Reply:
ноября 23, 2011 at 22:34
Привет.
Если речь идет о роботе из этой статьи — то в переменной LOTS=1000 и это и будет операционным колвом лотов.
ekventura Reply:
ноября 24, 2011 at 7:27
Нет, речь идет об ограничении лотов в портфеле. При испытании робота каждые 10 секунд он выставляет заявку, скажем на покупку, пока не кончатся деньги на счету.
Евгений Reply:
ноября 26, 2011 at 18:11
У вас в квике сколько счетом на ФОРТС открыто? В таблице «ограничения» в какой строке показываются текущие позиции?
Дело в том, что робот не видит открытых позиций, поэтому приказы повторяются.