Alexey Krechetov
1
All posts from Alexey Krechetov
Alexey Krechetov in krechetov,

Делаем торгового робота в Transaq своими руками. ч.3 (Боремся со множественными заявками, немного об алертах).

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

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

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

      Избежать этого можно используя функцию onNewCandle(). Данная функция производит расчёт один раз при открытии новой свечи.

      Но просто заменить функцию calc () на функцию  onNewCandle() у нас не получится, так как расчёт средних в данной функции нельзя визуализировать нанеся на график цены.

       Поэтому мы поступим таким образом:

1.       Сначала мы рассчитываем наши среднии используя Функцию Calc ()

2.       Затем мы рассчитываем торговые операции используя функцию onNewCandle()

3.       Учитываем что теперь сделки будут произведены на открытии новой свечи, а значит сигналы о пересечении нам надо взять с полностью сформировавшейся предыдущей свечи. Чего добьёмся сдвиганием сигнала на 1 бар в прошлое.

 

В итоге наш робот BOT трансформируется вот в такой код:

 

#samewindow

#line 0 solid red

#line 1 solid green

function calc()

{   line[0] = MovAvg(ind_ema, 26, pt_close );

    line[1] = MovAvg(ind_ema, 13, pt_close );    

 }

function  onNewCandle()

{

if(line[0][-1]<line[1][-1] and  line[0][-2]>line[1][-2]){

                trade_action::buy(1, ::lots,close*1.01);}

 

if(line[0][-1]>line[1][-1] and  line[0][-2]<line[1][-2]){

                trade_action::sell(1, ::lots,close*0.99);}

 }

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

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

      Возникшие вопросы завайте в обсуждении поста. В следующем видимо расмотрю к вопросы контроля позиций.

      Предыдущие посты на эту тему:

2. http://www.comon.ru/user/krechetov/blog/post.aspx?index1=208...

1. http://www.comon.ru/user/krechetov/blog/post.aspx?index1=206...