Перейти к содержимому


Фото
* * * * - 9 голосов

Конструктор роботов TradeSсript


1090 ответов в этой теме

#41 Agnostik

Agnostik

    Участник

  • Moderators
  • 152 сообщений

Отправлено 21 May 2012 - 02:10 PM

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


Я проверял на часовом графике акций Газпрома

#42 Сигурд

Сигурд

    Участник

  • Трейдеры
  • PipPip
  • 153 сообщений

Отправлено 21 May 2012 - 02:22 PM

Я проверял на часовом графике акций Газпрома

Поясню, почему я сейчас не хочу зацикливаться на конкретном инструменте (в качестве тестового использую RIM2).
У меня есть достаточно сложный алгоритм, который я хочу протестировать в конструкторе.
в нем используются:
set
ref
maxof
minof
sumif
if
and (причем более, чем два, поэтому один из вопросов выше был о возможности вложенного использования этого логического оператора)
вектора цен
volume

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

И чуть не забыл - использование результатов арифметических операций в операциях сравнения.
Примеры приводил выше, могу продублировать.
В частности maxof мне нужен не сам по себе, а в виде разности с хаем периода. то есть, если я правильно понимаю синтаксис, нужен результат формулы:
high-maxof(open,close)

#43 Sidor

Sidor

    Гуру нашего муравейника

  • Moderators
  • 3794 сообщений

Отправлено 21 May 2012 - 02:34 PM

Коллеги, почитал вашу переписку тут на форуме. Все проблемы, конечно, от незнания нами правил и несоблюдения синтаксиса.
В России, насколько я понимаю, языка TradeScript пока ни у кого нет. Так что мы с вами первые его изучаем.
Поскольку это не наш язык, но все-таки язык, давайте относиться к нему с уважением. Как и любой язык, TradeScript имеет свой синтаксис и семантику. Это как данность. Глупо, ведь приходя в языковую школу, просить изменить язык так, чтоб нам было удобнее им пользоваться.
Касательно сходства языков Метасток и Трейдскрипт. Никто не заставляет искать 10 отличий между Украинским и Русским языками. Но тем кто изучал русский язык - легче учить украинский. Только и всего.

То что я написал это не попытка уйти от ответа, это данность. Я считаю, что даже примитивным языком можно выразить многие мысли, была бы цель и желание.
Для того чтобы писать как Шекспир недостаточно знаний английского языка. Для этого нужно быть Шекспиром. Но это не значит, что если вы не Шекспир, то только поэтому не надо учить английский язык.

Короче, предлагаю завести новую ветку: язык TradeScript и торговые алгоритмы. Туда будем писать все что касается языка и не касается непосредственно самого терминала SmartX.
Если поддерживаете, то я организую такую ветку и аккуратно перенесу туда все касающиеся темы сообщения.

#44 Agnostik

Agnostik

    Участник

  • Moderators
  • 152 сообщений

Отправлено 21 May 2012 - 02:37 PM

Поясню, почему я сейчас не хочу зацикливаться на конкретном инструменте (в качестве тестового использую RIM2).
У меня есть достаточно сложный алгоритм, который я хочу протестировать в конструкторе.
в нем используются:
set
ref
maxof
minof
sumif
if
and (причем более, чем два, поэтому один из вопросов выше был о возможности вложенного использования этого логического оператора)
вектора цен
volume

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

И чуть не забыл - использование результатов арифметических операций в операциях сравнения.
Примеры приводил выше, могу продублировать.
В частности maxof мне нужен не сам по себе, а в виде разности с хаем периода. то есть, если я правильно понимаю синтаксис, нужен результат формулы:
high-maxof(open,close)


Перечисленные вами функции работают исправно
Что касается логических операторов их вложений можно проверить
Только давайте на простых примерах
В чапстности я не совсем понял смысл который вы вкладываете в скрипт
high-maxof(open,close)
Эта величина всегда больше нуля и определяет расстояния от хая до close или open
в зависимости от того что из них больше
"nj bvtyyj nj xnj dfv ye;yj&

#45 Agnostik

Agnostik

    Участник

  • Moderators
  • 152 сообщений

Отправлено 21 May 2012 - 02:39 PM

Это именно то что вам нужно или вы что другое хотели запрограммировать?

#46 Сигурд

Сигурд

    Участник

  • Трейдеры
  • PipPip
  • 153 сообщений

Отправлено 21 May 2012 - 02:48 PM

Это именно то что вам нужно или вы что другое хотели запрограммировать?

Именно то что, что нужно! То есть это верхний хвост свечи. И его потом, мне надо сравнить на больше-меньше с нижним хвостом свечи, который вычисляется по аналогичному алгоритму, но с использованием minof.
то есть в итоге получается неравенство
high-maxof(open,close)>minof(open,close)-low
Вот оно-то у меня и не желает выдавать сигналы при использовании в качестве скрипта, указанного во вкладке Buy (к примеру). Ведь любое равенство или неравенство можно применять напрямую в качестве сигнала без дополнительных оговорок типа "=true", в чем я уже убедился на других, успешно тестируемых в данный момент алгоритмах.
И я хочу понять, почему сигнал не срабатывает - потому, что я неверно написал формулу, потому, что конструктор неверно ее интерпретирует или по какой-то третьей причине.

#47 Сигурд

Сигурд

    Участник

  • Трейдеры
  • PipPip
  • 153 сообщений

Отправлено 21 May 2012 - 03:02 PM

Касательно сходства языков Метасток и Трейдскрипт. Никто не заставляет искать 10 отличий между Украинским и Русским языками. Но тем кто изучал русский язык - легче учить украинский. Только и всего.

Короче, предлагаю завести новую ветку: язык TradeScript и торговые алгоритмы. Туда будем писать все что касается языка и не касается непосредственно самого терминала SmartX.
Если поддерживаете, то я организую такую ветку и аккуратно перенесу туда все касающиеся темы сообщения.

Лично мне ближе формульный язык Excel, на который, кстати, тоже очень похож TradeScript.
А ветка нужна сильно.

#48 Agnostik

Agnostik

    Участник

  • Moderators
  • 152 сообщений

Отправлено 21 May 2012 - 03:13 PM

Именно то что, что нужно! То есть это верхний хвост свечи. И его потом, мне надо сравнить на больше-меньше с нижним хвостом свечи, который вычисляется по аналогичному алгоритму, но с использованием minof.
то есть в итоге получается неравенство
high-maxof(open,close)>minof(open,close)-low
Вот оно-то у меня и не желает выдавать сигналы при использовании в качестве скрипта, указанного во вкладке Buy (к примеру). Ведь любое равенство или неравенство можно применять напрямую в качестве сигнала без дополнительных оговорок типа "=true", в чем я уже убедился на других, успешно тестируемых в данный момент алгоритмах.
И я хочу понять, почему сигнал не срабатывает - потому, что я неверно написал формулу, потому, что конструктор неверно ее интерпретирует или по какой-то третьей причине.



Да равно true писать не обязательно да и зачем
Ваше неравнство должно либо срабатывать( то есть выдавать сигнал) или нет
другого не дано
Давайте проверим скажем на часовых фреймах на каком либо инструменте
Или других фреймах На чем вы проверяете?

#49 Agnostik

Agnostik

    Участник

  • Moderators
  • 152 сообщений

Отправлено 21 May 2012 - 03:37 PM

Попробуйте вместо записи
high-maxof(open,close)>minof(open,close)-low
такой эквивалентный скрипт

SET HHH = high - maxof(close,open)
SET MMM = minof(close,open)- low
HHH < MMM

Что такое МММ язык полагаю сходу поймет -)

#50 Сигурд

Сигурд

    Участник

  • Трейдеры
  • PipPip
  • 153 сообщений

Отправлено 21 May 2012 - 04:51 PM

Попробуйте вместо записи
high-maxof(open,close)>minof(open,close)-low
такой эквивалентный скрипт

SET HHH = high - maxof(close,open)
SET MMM = minof(close,open)- low
HHH < MMM

Что такое МММ язык полагаю сходу поймет -)

Как раз со сравнения этих двух вариантов решения задачи я и начал ее обсуждение в этой теме чуть раньше. Процитирую себя:
"high-maxof(open,close)>minof(open,close)-low
в моем представлении он должен возвращать true, только тогда, когда верхний фитиль свечи больше нижнего. Но он возвращает true в любом случае.
При этом следующая модификация скрипта не возвращает true вообще никогда, хотя в моем представлении они одинаковы.
set a = high-maxof(open,close)
set b = minof(open,close)-low
a>b
не возвращает true вообще никогда, хотя в моем представлении они одинаковы."

Радует, что мысли по поводу решения задач у нас сходятся. Огорчает, что скрипты не выдают ожидаемого.
тестирование произвожу на минутном таймфрейме RIM2. Поясню, почему минутный - при отсутствии модуля бэктестирования наибыстрейший отклик, который и нужен для потверждения либо опровержения работоспособности скрипта дает наименьший таймфрейм (тики не рассматриваем, так как у них, грубо говоря, отсутствуют вектора low и high.

#51 Agnostik

Agnostik

    Участник

  • Moderators
  • 152 сообщений

Отправлено 21 May 2012 - 05:28 PM

Как раз со сравнения этих двух вариантов решения задачи я и начал ее обсуждение в этой теме чуть раньше. Процитирую себя:
"high-maxof(open,close)>minof(open,close)-low
в моем представлении он должен возвращать true, только тогда, когда верхний фитиль свечи больше нижнего. Но он возвращает true в любом случае.
При этом следующая модификация скрипта не возвращает true вообще никогда, хотя в моем представлении они одинаковы.
set a = high-maxof(open,close)
set b = minof(open,close)-low
a>b
не возвращает true вообще никогда, хотя в моем представлении они одинаковы."

Радует, что мысли по поводу решения задач у нас сходятся. Огорчает, что скрипты не выдают ожидаемого.
тестирование произвожу на минутном таймфрейме RIM2. Поясню, почему минутный - при отсутствии модуля бэктестирования наибыстрейший отклик, который и нужен для потверждения либо опровержения работоспособности скрипта дает наименьший таймфрейм (тики не рассматриваем, так как у них, грубо говоря, отсутствуют вектора low и high.


На минутном интервале быстро все меняется
Кстати чтобы быть последовательными посмотрите
такой скрипт
set a = high - maxof(close,open)
set b = minof(close,open)- low
ref(a,0) > ref(b,0)
с конкретной ссылкой на элементы векторов

#52 Сигурд

Сигурд

    Участник

  • Трейдеры
  • PipPip
  • 153 сообщений

Отправлено 21 May 2012 - 05:59 PM

Последняя свеча она в процессе формирования
Чтобы было строгое неравенство нужно по крайней мере три сделки

высокая ликвидность фьючерса на индекс обеспечивает эти три сделки в первые доли секунды таймфрейма.
А ссылки на ref(...,1) и ранее делает цены в сигналах неактуальными. то есть нужен именно последний таймфрейм, независимо от того, какой мы выбираем (минута, 5 минут, час и т.д.).
Сейчас чисто длля эксперимента я модифицировал скрипт до состояния:
set a = ref(high,1)-maxof(ref(open,1),ref(close,1))
set b = minof(ref(open,1),ref(close,1))-ref(low,1)
ref(a,1)>ref(b,1)
посмотрим после вечернего клиринга, будет ли работать. Проверено - тот же результат.
К тому же, по здравому размышлению, такая модификация в общей сложности сдвигает момент появления паттерна от момента появления сигнала о нем на два таймфрейма (один - на этапе "set" и один - на этапе итогового неравенства). Что тем более не приемлемо.
кстати, на 5 минутном и на 15 минутном фреймах, результаты всех обсуждаемых скриптов те же...

#53 Agnostik

Agnostik

    Участник

  • Moderators
  • 152 сообщений

Отправлено 21 May 2012 - 07:39 PM

высокая ликвидность фьючерса на индекс обеспечивает эти три сделки в первые доли секунды таймфрейма.
А ссылки на ref(...,1) и ранее делает цены в сигналах неактуальными. то есть нужен именно последний таймфрейм, независимо от того, какой мы выбираем (минута, 5 минут, час и т.д.).
Сейчас чисто длля эксперимента я модифицировал скрипт до состояния:
set a = ref(high,1)-maxof(ref(open,1),ref(close,1))
set b = minof(ref(open,1),ref(close,1))-ref(low,1)
ref(a,1)>ref(b,1)
посмотрим после вечернего клиринга, будет ли работать. Проверено - тот же результат.
К тому же, по здравому размышлению, такая модификация в общей сложности сдвигает момент появления паттерна от момента появления сигнала о нем на два таймфрейма (один - на этапе "set" и один - на этапе итогового неравенства). Что тем более не приемлемо.
кстати, на 5 минутном и на 15 минутном фреймах, результаты всех обсуждаемых скриптов те же...


Я не совсем понял последний скрипт
переменные определены как скаляры или нет?
А далее вы их используете как вектора

#54 bulldo

bulldo

    Новичок

  • Трейдеры
  • Pip
  • 17 сообщений

Отправлено 22 May 2012 - 02:52 AM

Вопрос к разработчикам.
Бегло пробежал весь мануал по трейдскрипту, но так и не нашел функций и операторов работы со временем. Ожидал что-то типа такого "если время = чч:мм то...". Мне кажется это такой очевидно нужной вещью, что я даже до сих пор не верю, что в трейдскрипте нет таких возможностей, поэтому и задаю, видимо, кажущиеся странными вопросы. В связи с этим:
1) правильно ли я понимаю, что работать со временем в трейдскрипте невозможно?
2) если ответ на первый вопрос утвердительный, то будут ли реализованы эти функции когда-нибудь? Т.е. Начнется ли работа по данному направлению?
2Сидор. Из вашего комментария, прошу прощения за дотошность, непонятно ни первое ни второе:(
Может, я один такой, но Большинство из своих техник мне не удастся автоматизировать без привязки ко времени. У меня есть техники, которые ничего кроме времени не используют, типа "открыть длинную позицию в 11:34". Сейчас я вынужден, грубо говоря, открывать терминал в 11:34 и ручками вводить заявку, хотя способ автоматизации кажется очень простым.
Кому-нибудь ещё такое нужно?


Можно создать свое время. Для этого можно с помощью функции Lastif установить счетчик на 0 для первого 1мин или 5мин бара. Надо только подобрать нужное условие для первого бара( геп или размер,...). Остается согласовать счетчик с будильником.

#55 Сигурд

Сигурд

    Участник

  • Трейдеры
  • PipPip
  • 153 сообщений

Отправлено 22 May 2012 - 06:21 AM

Я не совсем понял последний скрипт
переменные определены как скаляры или нет?
А далее вы их используете как вектора

Переменная ведь вычисляется для каждого тайм-фрейма. а значит это тоже вектор, ну или не вектор (в определениях могу ошибаться), но величина, изменяющаяся от тайм-фрейма к тайм-фрейму и имеющая конкретное значение в каждом из них. По крайней мере функция ref, примененная к переменной обрабатывается корректно.
Смещение получилось двойное, о чем я написал выше, поэтому я поправил третью строку скрипта на исходный вариант, то есть на:
a>b

итоговый скрипт выглядит так:
set a = ref(high,1)-maxof(ref(open,1),ref(close,1))
set b = minof(ref(open,1),ref(close,1))-ref(low,1)
a>b

его суть та же, что и у обсуждавшихся ранее вариантов, но анализируется не последний тайм-фрейм, а предпоследний.
И вдумчивый анализ результатов похоже дал свои плоды.
Итак, этот скрипт выдает один сигнал. Сразу по завершению первого тайм-фрейма после запуска. И все, больше сигналов не выдает. Что позволяет предположить, что в качестве тайм-фрейма скрипта используется не указанный во вкладке "Стратегия", а предустановленный и используемый в исходном варианте TradeScript дневной тайм-фрейм. То есть при использовании "set" вместо выбранного тайм-фрейма, для всех векторов, используемых для создания переменной, используется тайм-фрейм "день". И это объясняет полное отсутствие сигналов в варианте без смещения на один период назад. Ведь текущий "день" не завершался в процессе тестирования, а во вкладке "стратегия" установлен вариант формирования сигнала "по окончании бара".

#56 Agnostik

Agnostik

    Участник

  • Moderators
  • 152 сообщений

Отправлено 22 May 2012 - 02:08 PM

Погонял на десятиминутках фьючерса на индекс РТС
следующий скрипт
SET b = minof(close,open)- low
SET a = high - maxof(close,open)
при условиях
ref(a,1)>ref(b,1)
ref(a,2)<ref(b,2) и т д

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

Проверил и минутные фреймы Скрипт работает

Для начала я ради интереса просмотрел и значения элементов векторов a и b, выписав параметры предыдущих свечек
и поставив соответствующие условия типа a = 325 на предмет истины Все бьется

С последней свечкой дело сложнее
Поскольку она находится в стадии формирования
условия a > b и a < b с высокой вероятностью срабатывают оба в самом начале таймфрейма
А хотелось бы наверное запускать скрипт с задержкой на несколько тиков, после того как свечка сформировалась

#57 Sidor

Sidor

    Гуру нашего муравейника

  • Moderators
  • 3794 сообщений

Отправлено 22 May 2012 - 02:17 PM

... Что позволяет предположить, что в качестве тайм-фрейма скрипта используется не указанный во вкладке "Стратегия", а предустановленный и используемый в исходном варианте TradeScript дневной тайм-фрейм.

Нет, это не так.
Используются данные того тайм-фрейма, который вы указали в настройках стратегии.

То есть при использовании "set" вместо выбранного тайм-фрейма, для всех векторов, используемых для создания переменной, используется тайм-фрейм "день".

Нет, и это не так. Оператор Set работает правильно.

Теперь тонкости, которые нужно понимать, пользуясь функциями трейд-скрипта.
1. Если указано "Формировать сигналы по окончанию бара", то скрипт начинает работу после окончания бара. Поскольку скрипт крутится на машине клиента, то единственно верным способом узнать начался новый бар или нет - можно только зафиксировав первую сделку после окончания текущего бара (поскольку из-за возможного рассогласования времен торговых серверов и машины клиента полагаться на внутреннее время машины клиента очевидно не стоит). А раз так, то при указанной реализации функция maxof(Close,Open) - выбирает наибольшее между ценой закрытия бара и первой сделкой = цене открытия бара следующего. Т.е. в нашем случае Last=open. Если клоуз предыдущего бара = опену нового (что часто бывает), то функции maxof(Close,Open) и minof(Close,Open) возвращают одинаковый результат, что вы, собственно, и наблюдаете, но неверно интерпретируете.

Для того чтобы сравнивать правильное открытие анализируемого бара с его правильным закрытием, нужно вместо простого OPEN использовать REF(OPEN,1). А вместо REF(OPEN,N) использовать REF(OPEN,N+1). Тогда все будет корректно и так как вы хотите.

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

#58 Сигурд

Сигурд

    Участник

  • Трейдеры
  • PipPip
  • 153 сообщений

Отправлено 22 May 2012 - 02:23 PM

Погонял на десятиминутках фьючерса на индекс РТС
следующий скрипт
SET b = minof(close,open)- low
SET a = high - maxof(close,open)
при условиях
ref(a,1)>ref(b,1)
ref(a,2)<ref(b,2) и т д

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

Проверил и минутные фреймы Скрипт работает

Для начала я ради интереса просмотрел и значения элементов векторов a и b, выписав параметры предыдущих свечек
и поставив соответствующие условия типа a = 325 на предмет истины Все бьется

С последней свечкой дело сложнее
Поскольку она находится в стадии формирования
условия a > b и a < b с высокой вероятностью срабатывают оба в самом начале таймфрейма
А хотелось бы наверное запускать скрипт с задержкой на несколько тиков, после того как свечка сформировалась

Вот прямо сейчас запустил ваш вариант скрипта на минутках. прошел один сигнал по завершению первой после запуска скрипта минуты и все. тишина. Причем я ставлю два скрипта в селл и бай с разнонаправленными неравенствами, чтобы в любой свече (кроме маловероятного полного равенства хвостов) получать сигнал.
Про последнюю свечу - а разве при выставлении параметра "формировать сигналы" на значение "по окончании бара", текущей свечой не считается только что закончившаяся? То есть сигнал проходит как бы после завершения свечи, но еще учитывая эту свечу, как текущую. Я себе именно так представлял.

2 Sidor
Спасибо за развернутый ответ. Буду разбираться. Рад, что ошибся, предположив некорректную работу конструктора.
Update В варианте скрипта с использованием set замена open на ref(open,1) решила задачу. Сигналы поступают.

#59 Agnostik

Agnostik

    Участник

  • Moderators
  • 152 сообщений

Отправлено 22 May 2012 - 03:05 PM

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


Да я тоже именно в таком режиме запускаю этот скрипт

#60 ruix

ruix

    Новичок

  • Трейдеры
  • Pip
  • 72 сообщений

Отправлено 22 May 2012 - 10:48 PM

Бесплатный спредовый робот, распространялся для всех желающихРазмещенное изображение

Умные головы посмотрите, как его переписать под Смарт Х ?
Какой у него принцип работы ?




PORTFOLIO_EX Робот (28 февраля 2012);
DESCRIPTION Робот (28 февраля 2012);
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;

USE_CASE_SENSITIVE_CONSTANTS;

PROGRAM

MARKET = "SPBFUT"
TICKER = "RIH2"
ACCOUNT = "SPBFUT00019"
CLIENT_CODE = "SPBFUT00019"
SIZE = 1

MAL_TAG = "MA_LONG"
MAS_TAG = "MA_SHORT"

NEW_GLOBAL("TRANS_ID", 0)
NEW_GLOBAL("POSITION", 0)
NEW_GLOBAL("LAST_POSITION", 0)

FUNC DIV(_V1, _V2)
RESULT = FLOOR(_V1 / _V2)
END FUNC

FUNC MOD(_V1, _V2)
RESULT = _V1 - (_V2 * FLOOR(_V1 / _V2))
END FUNC

FUNC DAYS(_DATE)
_Y = GET_VALUE(_DATE, "YEAR")
_M = GET_VALUE(_DATE, "MONTH")
_D = GET_VALUE(_DATE, "DAY")
_M = MOD((_M + 9), 12)
_Y = _Y - DIV(_M, 10)
RESULT = 365 * _Y + DIV(_Y, 4) - DIV(_Y, 100) + DIV(_Y, 400) + DIV((_M * 306 + 5), 10) + (_D - 1)
END FUNC

FUNC DATE(_DAYS)
_Y = DIV((10000 * _DAYS + 14780), 3652425)
_DDD = _DAYS - (365 * _Y + DIV(_Y, 4) - DIV(_Y, 100) + DIV(_Y, 400))
IF (_DDD < 0)
_Y = _Y - 1
_DDD = _DAYS - (365 * _Y + DIV(_Y, 4) - DIV(_Y, 100) + DIV(_Y, 400))
END IF
_MI = DIV((100 * _DDD + 52), 3060)
_MM = MOD((_MI + 2), 12) + 1
_Y = _Y + DIV((_MI + 2), 12)
_DD = _DDD - DIV((_MI * 306 + 5), 10) + 1
_RESULT = CREATE_MAP()
_RESULT = SET_VALUE(_RESULT, "YEAR", _Y)
_RESULT = SET_VALUE(_RESULT, "MONTH", _MM)
_RESULT = SET_VALUE(_RESULT, "DAY", _DD)
RESULT = _RESULT
END FUNC

FUNC DAY_OF_WEEK(_DATE)
_YEAR = GET_VALUE(_DATE, "YEAR")
_M = GET_VALUE(_DATE, "MONTH")
_DAY = GET_VALUE(_DATE, "DAY")
_A = DIV((14 - _M), 12)
_Y = _YEAR - _A
_M = _M + 12 * _A - 2
_RESULT = MOD(7000 + (_DAY + _Y + DIV(_Y, 4) - DIV(_Y, 100) + DIV(_Y, 400) + DIV((31*_M), 12)), 7)
' Приводим к порядку QUIK (((
IF _RESULT >= 7
RESULT = 0
ELSE
RESULT = _RESULT
END IF
END FUNC

' Дополнить строку знаками до определённой длинны
FUNC PREFIX(_STR, _CHR, _L)
IF LEN(_STR) < _L
RESULT = PREFIX(_CHR & _STR, _CHR, _L)
ELSE
RESULT = _STR
END IF
END FUNC

FUNC TIMEDELTA(_DATE, _DELTA)
_HOUR = GET_VALUE(_DATE, "HOUR")
_MINUTE = GET_VALUE(_DATE, "MIN")
_SECOND = GET_VALUE(_DATE, "SEC")

_TOTAL = (((_HOUR * 60) + _MINUTE) * 60) + _SECOND
_DAYS = DAYS(_DATE)

_TOTAL = _TOTAL + _DELTA
_ADDDAYS = DIV(_TOTAL, 86400)
_TOTAL = MOD(_TOTAL, 86400)
_HOUR = DIV(_TOTAL, 3600)
_TOTAL = _TOTAL - (_HOUR * 3600)
_MINUTE = DIV(_TOTAL, 60)
_SECOND = _TOTAL - (_MINUTE * 60)

_NEW_DATE = DATE(_DAYS + _ADDDAYS)
_DOW = DAY_OF_WEEK(_NEW_DATE)
_NEW_DATE = SET_VALUE(_NEW_DATE, "DAYOFWEEK", _DOW)
_NEW_DATE = SET_VALUE(_NEW_DATE, "HOUR", _HOUR)
_NEW_DATE = SET_VALUE(_NEW_DATE, "MIN", _MINUTE)
_NEW_DATE = SET_VALUE(_NEW_DATE, "SEC", _SECOND)
_MILLISEC = GET_VALUE(_DATE, "MILLISEC")
_NEW_DATE = SET_VALUE(_NEW_DATE, "MILLISEC", _MILLISEC)
_DAY = GET_VALUE(_NEW_DATE, "DAY")
_MONTH = GET_VALUE(_NEW_DATE, "MONTH")
_YEAR = GET_VALUE(_NEW_DATE, "YEAR")
_DATETIME = PREFIX(_DAY, "0", 2) & "." & PREFIX(_MONTH, "0", 2) & "." & PREFIX(_YEAR, "0", 4) & " "
_DATETIME = _DATETIME & PREFIX(_HOUR, "0", 2) & ":" & PREFIX(_MINUTE, "0", 2) & ":" & PREFIX(_SECOND, "0", 2) & "." & PREFIX(_MILLISEC, "0", 3)
_NEW_DATE = SET_VALUE(_NEW_DATE, "DATETIME", _DATETIME)
RESULT = _NEW_DATE
END FUNC

SOURCE = GET_DATETIME()


D1 = TIMEDELTA(SOURCE, -1 * 60 * 10)
MAL_NEW = GET_GRAPH_VALUE(D1, MAL_TAG)
MAS_NEW = GET_GRAPH_VALUE(D1, MAS_TAG)
D2 = TIMEDELTA(SOURCE, -2 * 60 * 10)
MAL_OLD = GET_GRAPH_VALUE(D2, MAL_TAG)
MAS_OLD = GET_GRAPH_VALUE(D2, MAS_TAG)

'MESSAGE(MAL_NEW & " " & MAL_OLD & " " & MAS_NEW & " " & MAS_OLD, 1)

DIFF_OLD = MAS_OLD - MAL_OLD
DIFF_NEW = MAS_NEW - MAL_NEW

ROW = CREATE_MAP()
ROW = SET_VALUE(ROW, "DT", GET_VALUE(D1, "DATETIME"))
ROW = SET_VALUE(ROW, "DIFF_OLD", DIFF_OLD)
ROW = SET_VALUE(ROW, "DIFF_NEW", DIFF_NEW)
ADD_ITEM(1, ROW)

IF DIFF_NEW > 0
POSITION = 1
END IF

IF DIFF_NEW < 0
POSITION = -1
END IF

'IF (DIFF_OLD <= 0) AND (DIFF_NEW > 0)
' POSITION = 1
'END IF

'IF (DIFF_OLD >= 0) AND (DIFF_NEW < 0)
' POSITION = -1
'END IF

FUNC PLACE_ORDER(OPERATION, PRICE, QUANTITY)
IF OPERATION == "B"
MESSAGE("ЛОНГ!", 1)
ELSE
MESSAGE("ШОРТ!", 1)
END IF
T = CREATE_MAP()
TRANS_ID = TRANS_ID + 1
T = SET_VALUE(T, "TRANS_ID", TRANS_ID)
T = SET_VALUE(T, "ACTION", "NEW_ORDER")
T = SET_VALUE(T, "CLASSCODE", MARKET)
T = SET_VALUE(T, "SECCODE", TICKER)
T = SET_VALUE(T, "ACCOUNT", ACCOUNT)
T = SET_VALUE(T, "CLIENT_CODE", CLIENT_CODE)
T = SET_VALUE(T, "TYPE", "L")
T = SET_VALUE(T, "OPERATION", OPERATION)
T = SET_VALUE(T, "PRICE", PRICE)
T = SET_VALUE(T, "QUANTITY", QUANTITY)
RESULT = SEND_TRANSACTION(30, T)
MESSAGE(GET_VALUE(RESULT, "DESCRIPTION"), 1)
END FUNC

ASK = GET_VALUE(GET_PARAM_EX(MARKET, TICKER, "OFFER"), "PARAM_VALUE")+0
BID = GET_VALUE(GET_PARAM_EX(MARKET, TICKER, "BID"), "PARAM_VALUE")+0

IF POSITION == -1
IF LAST_POSITION == 0
PLACE_ORDER("S", BID, SIZE)
END IF
IF LAST_POSITION == 1
PLACE_ORDER("S", BID, 2*SIZE)
END IF
END IF

IF POSITION == 1
IF LAST_POSITION == 0
PLACE_ORDER("B", ASK, SIZE)
END IF
IF LAST_POSITION == -1
PLACE_ORDER("B", ASK, 2*SIZE)
END IF
END IF

IF POSITION == 0
IF LAST_POSITION == 1
PLACE_ORDER("S", BID, SIZE)
END IF
IF LAST_POSITION == -1
PLACE_ORDER("B", ASK, SIZE)
END IF
END IF

LAST_POSITION = POSITION

FUNC GET_GRAPH_VALUE(_DATE, _TAG)
_DINDEX = FLAT_DATE(_DATE)
_TINDEX = FLAT_TIME(_DATE)
_CANDLE = GET_CANDLE_EX(_TAG, _DINDEX, _TINDEX)
_LINES = GET_VALUE(_CANDLE, "LINES")
_LINE = GET_COLLECTION_ITEM(_LINES, 0)
RESULT = GET_VALUE(_LINE, "CLOSE")+0
END FUNC

FUNC FLAT_DATE(_DT)
RESULT = GET_VALUE(_DT, "YEAR") & PREFIX(GET_VALUE(_DT, "MONTH"), "0", 2) & PREFIX(GET_VALUE(_DT, "DAY"), "0", 2)
END FUNC

FUNC FLAT_TIME(_DT)
RESULT = PREFIX(GET_VALUE(_DT, "HOUR"), "0", 2) & PREFIX(GET_VALUE(_DT, "MIN"), "0", 2) & PREFIX(GET_VALUE(_DT, "SEC"), "0", 2)
END FUNC

END_PROGRAM

PARAMETER DT;
PARAMETER_TITLE Дата и Время;
PARAMETER_DESCRIPTION Дата и Время;
PARAMETER_TYPE STRING(30);
END

PARAMETER DIFF_OLD;
PARAMETER_TITLE Прошлая разница;
PARAMETER_DESCRIPTION Прошлая разница;
PARAMETER_TYPE STRING(30);
END

PARAMETER DIFF_NEW;
PARAMETER_TITLE Новая разница;
PARAMETER_DESCRIPTION Новая разница;
PARAMETER_TYPE STRING(30);
END

END_PORTFOLIO_EX



Ответить



  


Rambler's Top100 Яндекс.Метрика