Главная > Торговые стратегии, Торговый робот > Торговый робот «Parabolic SAR»

Торговый робот «Parabolic SAR»

sar_logoВы любите фокусы? «Легким движением руки, брюки превращаются...брюки превращаются... В элегантные шорты!» Эта бессмертная фраза должна быть девизом программиста, ибо каждый новый торговый робот, создается из одних и тех же основных, функциональных блоков. Разная только торговая тактика. Так и мы сегодня вспоминаем код торгового робота «Мувинг». Но об этом позже. Итак, что же представляет собой упрощенная торговая тактика игры на бирже по индикатору Parabolic SAR:

Parabolic SAR

Parabolic SAR

На графике мы видим график цены, и линию индикатора Parabolic SAR. Последнюю можно строить в виде точек, но в виде линии она наиболее информативна. Тактика же игры проста: цена выше линии индикатора — покупка, ниже — продажа. Ничего не замечаете? Правильно, точно также играем по одному обычному мувингу! Таким образом, можно взять уже готовый код старого нашего мувинга, сделать небольшую корректировку (а можно и не делать, если параболику присвоить старый идентификатор) и вуаля: элегантные шорты:)

Код на QPILE доступен только зарегистрированным пользователям.

Этой публикацией я хотел показать, что для решения новых задач, надо не бояться использовать существующие решения.

PORTFOLIO_EX SAR;
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

  1. alex_davyd
    30 Октябрь 2010 в 00:23 | #1

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

  2. Valery
    2 Декабрь 2010 в 11:19 | #2

    Ошибка, упоминаемая в FAQ;

    при попытке загрузить программу в QUIK выдает ошибку в строке №1.

    неверно указан тип параметра.

    Действительно, 3-я строка снизу:

    PARAMETER_TYPE STRING NUMERIC (10,2);

    заменить на

    PARAMETER_TYPE NUMERIC (10,2);

    Теперь загрузка без ошибок.

    Евгений Reply:

    Спасибо за подсказку, поправил!

  3. Mechtatel
    2 Январь 2011 в 16:52 | #3

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

    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:

    Иного пути нет, я бы только добавил автоматическую подстановку даты и времени.

  4. MVG
    18 Январь 2011 в 09:31 | #4

    Добрый день, Евгений!

    Огромное спасибо Вас за столь нужную многим начинающим трейдерам просветительскую деятельность в области написания помощников и автоматизации торговли. Изучая материалы и примеры на Вашем сайте, я уже вплотную подошёл к созданию своего торгового робота по своей стратегии. Очень много почерпнул из Вашего кода, за что Вам отдельное спасибо.

    У меня возник вопрос по тому как Вы реализуете выставление ордеров в своём коде. В частности в данном роботе вы написали функцию отправки транзакции (строки 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:

    Привет.

    1. Вы правы. Эти строки в коде — атавизм :)

    2. Будет.

  5. MVG
    18 Январь 2011 в 10:48 | #5

    P.S. По пункту 3 своего предыдущего комента ответ нашёл в коментах к другим роботам, а по пунктам 1 и 2 прошу разъяснить.

  6. kas13
    10 Февраль 2011 в 10:44 | #6

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

    Евгений Reply:

    Делаете график цены с наложенными двумя параболиками, но с разными шагами последнего и разными идентификаторами. Робот для движения цены вверх и лонга соответственно смотрит на один параболик, а для шорта на второй.

    kas13 Reply:

    Этот вариант к сожалению не прокатывает, сразу об этом думал. Два независимых параболика с разными параметрами совсем не одно то же что и один параболик с разными параметрами. Точки входа-выхода в этих 2х вариантах совершенно разные. Из-за того что формула рекурсивная и при расчете значения используется прошлое значение индикатора дальше расхождение еще больше увеличивается.

    Я так понял придется в теле робота считать все-таки.

    Евгений Reply:

    Попробуйте просчитать вариант, когда стратегия работает только с лонгом, без шорта. Довольно распространенная практика.

    Евгений Reply:

    И еще, я не догнал, почему вам не нравится вариант с двумя параболиками с разными настройками?

    kas13 Reply:

    Сложно объяснить словами, на картинке все было бы видно. Но представьте, что есть параболик который вы планируете использовать на росте, пусть это будет Бычий параболик, и есть параболик на падении — Медвежий. Настройки у них совсем разные.

    Допустим рынок растет, вы используете Бычий параболик и наблюдаете за позицией. Рынок начал снижаться Бычий параболик показал переворот в короткую позу в точке Х. Вот отсюда (со свечки Х) вы становитесь в шорт, и надо бы использовать Медвежий параболик. Но в силу других настроек, он скорее всего до сих пор не показал точку переворота после роста и перевернется тоже в короткую позу в точке Х+к (тогда наша короткая позиция будет тут же бесщадно ликидирована роботом сразу после открытия). Либо же, если он более быстрый он показал переворот не вточке Х а уже в точке Х-n (наша позиция тогда не будет ликвидирована, но мы получим не те значения параболика которые хотели бы.

    В общих словах — один параболик с разыми настройками позволяет эту рассинхронизацию входов и выходов избежать. Медвежий параболик начинает рассчитываться именно в тот момент когда бычий первернулся и отрабатывает падение, а бычий начинает расчитываться только на росте в тот момент когда медвежий перевернулся. А так в принципе да — это два разных параболика, но с совмещенными точками входа.

    Евгений Reply:

    Т.е. как бы два параболика устраивают, главное разобраться в какой момент времени какой параболик принимать за рабочий? :)

    kas13 Reply:

    Ну по сути...в какой-то мере да)))

    Почему спрашивал — просто есть оттестированная стратегия с определенными параметрами, воспроизвести которую в точности двумя параболиками неполучалось, думал что сделать. Но вот почитал комменты, подумал..., может и с двумя разными, как вы говорите, еще лучше получится, надо только и вправду следить следить за рабочим параболиком чтобы он позу тутже не закрыл)) а так-то верно)) надо потестить. Спасибо)

    Евгений Reply:

    Не за что! Пишите что получится.

  7. strelec
    21 Февраль 2011 в 19:33 | #7

    Добрый вечер. Не нашел код этого робота в виде файла.

    Евгений Reply:

    Да, видимо я его не выложил. Скопируйте код робота в текстовый файл с расширением qpl.

  8. ssshu
    30 Март 2011 в 12:10 | #8

    Добрый день Евгений! Подскажите пожалуйста, все загрузил, но выдает ошибку, что неправильно указан идентификатор транкзаций и числовой параметр с датой в кавычках показывает. И следующий вопрос- этото робот работает в реверсе? Спасибо.

    Евгений Reply:

    Идентификатор поправил — в версии 5.18 его длину укоротили.

    Реверс реализован.

  9. ssshu
    6 Апрель 2011 в 19:14 | #9

    Добрый день! Подскажите, как можно в Вашем роботе оформить переключение:

    -только лонг;

    -только шорт;

    -реверс.

    Спасибо.

    Евгений Reply:

    Привет.

    Надо заводить переменную в настройках, например:

    SET_OPEN_POS=1 ' 1-ТОЛЬКО ЛОНГ, 2-ТОЛЬКО ШОРТ, 3-РЕВЕРС

    И в блоке «формирование приказа» делать дополнительную проверку этой переменной, и далее действовать в соответствии с этим условием.

    neocraft Reply:

    а как реализовать дополнительную проверку?

  10. алёша
    7 Июль 2011 в 21:28 | #10

    как я могу приобрести торгового робота параболик сар

    Евгений Reply:

    Привет.

    Именно этот вы просто можете скачать отсюда, с сайта.

  11. rasswet
    10 Июль 2011 в 11:03 | #11

    @kas13

    получилось что-нибудь из затеи с двумя параболиками?

    Евгений Reply:

    Отвечу за него: там нет ничего сложного: накладываем два параболика с разными параметрами и идентификаторами, один смотрим для шорта, второй для лонга. Изменений для кода минимум.

    rasswet Reply:

    да вот пробую... пока параметров адекватных для каждого из них подобрать не удалось. не то вижу что хотелось бы((

    не подскажете с каких надо начать?

    Евгений Reply:

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

  12. 26 Сентябрь 2011 в 22:31 | #12

    У меня в Квике 2 счёта, вот как раз на 2-й не получается настроить данный робот, если на 1-м счету он уже работает. Показывает данные с первого счёта, хотя в настройках данные счёта другие прописаны и идентификатор индикатора другой прописал. Что сделать чтобы на 2-х счетах работал, на одном инструменте?

    Евгений Reply:

    Привет.

    Рад что вы уже с нами! :)

    В первых двух строках кода указывается название робота, для второго робота измените, добавьте цифру два, например. Иначе оба кода грузятся в одно и тоже окно портфеля.

    neocraft Reply:

    Если было всё так просто... не помогает этот вариант.

    Евгений Reply:

    Тогда рассказывайте подробно, что в таблице первого что в таблице второго робота?

    neocraft Reply:

    Первый:

    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:

    Здесь все правильно. Когда оба робота загрузили — что в обеих таблицах?

    neocraft Reply:

    Когда запускаю второй, в таблице все параметры от первого, т.е. точная копия.

    Евгений Reply:

    Значит при CTRL-F12 вы выбираете не второго а первого робота два раза.

    neocraft Reply:

    Если бы...

    Сейчас всё заново передалал на фьючерс по сберу, результат тот же!!!

    Соответственно проблема не решена.

    Евгений Reply:

    1. Еще раз проверьте свой алгоритм загрузки и сами файлы. У меня на 4-х вкладках работают одинаковые роботы с разными названиями и никто никому не мешает.

    2. Во втором роботе сделайте еще одно поле в таблице, или строку:

    MESSAGE («это пишет второй робот»,1)

    и загрузите оба и посмотрите, будет ли в окне сообщений эта строка. Если нет — см.п.1 Если да — то все правильно загружено, проверяйте во втором роботе переменные, которые выводятся в таблицу. Для пущего эффекта добавьте в первого робота аналогичную строку с иным текстом.

    neocraft Reply:

    Да, сообщение появляется и всё загружаю как нужно.

    Суть в том, что 2-й работает по своим пораметрам, пока отключен 1-й, как только включаю первый, 2-й сразу же дублирует его, и ни каких сделок по своей формуле не производит.

    Евгений Reply:

    Версия квика новая?

    neocraft Reply:

    Версия: 5.23.0.124

    Евгений Reply:

    Попробуйте переустановить Квик. Или откройте новый тестовый счет и на нем попробуйте.

    neocraft Reply:

    Помогли решить проблему в нескольких строчках, сейчас всё работает.

  13. 27 Сентябрь 2011 в 15:32 | #13

    Это относиться не только к этому роботу.

    Хотелось бы чтобы выделялись зелёным/красным цветом текущие позиции в окошке робота, если прибыльная — выделялась зелёным и наоборот соответственно. Такое возможно???

    Евгений Reply:

    Да, возможно.

    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:

    Уже пол дня мучаюсь, не хватает знаний кода, чтобы определить значение переменной PROFIT. Евгений, не могли бы помочь?

    Как я понимаю нужно ОПРЕДЕЛИТЬ ЦЕНУ ПО КОТОРОЙ ЗАШЛИ (ENTERLAST)

    и далее определяем PROFIT=LAST-ENTERLAST

    Евгений Reply:

    Ммм. Вы планировали раскрашивать в зависимости от прибыли\убытка в текущей сделке? Если да, то для начала нужно, как вы правильно начали, определить цену сделки. И потом, в зависимости от направления:

    — для лонга PROFIT=LAST-ENTERLAST

    — для шорта PROFIT=ENTERLAST-LAST

    И потом раскрашиваем таблицу. Цену сделки проще всего запоминать при ее открытии в глобальной переменной.

    neocraft Reply:

    Да всё верно, цвет текущий сделки, хотелось бы настроить.

  14. ekventura
    22 Ноябрь 2011 в 14:05 | #14

    Евгений, здравствуйте! Как ограничить количество покупаемых и продаваемых лотов? К примеру, я хочу работать с инструментом в пределах 1000 лотов. Спасибо!

    Евгений Reply:

    Привет.

    Если речь идет о роботе из этой статьи — то в переменной LOTS=1000 и это и будет операционным колвом лотов.

    ekventura Reply:

    Нет, речь идет об ограничении лотов в портфеле. При испытании робота каждые 10 секунд он выставляет заявку, скажем на покупку, пока не кончатся деньги на счету.

    Евгений Reply:

    У вас в квике сколько счетом на ФОРТС открыто? В таблице «ограничения» в какой строке показываются текущие позиции?

    Дело в том, что робот не видит открытых позиций, поэтому приказы повторяются.

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