Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Собираем робота своими руками (Ami + TWS) Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Окт 15, 2013 7:58 am Ответить с цитатой Вернуться к началу

Цитата:
вообще я остановился на часовом тф и открытие позиции должно совершаться по цене Open, т.е. теоретически сигнал должен проходить один раз в начале часового бара.

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

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
MrDrJOKER



Зарегистрирован: 22.06.2009
Сообщения: 489

СообщениеДобавлено: Вт Окт 15, 2013 12:48 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Раз сделка по закрытию, то ты переносишь сигнал на следующий бар и совершаешь сделку сразу после открытия следующего. Почему сигнал придет 1 раз? Он придет столько раз, сколько будет сканирований во время формирования бара. Сканер никак не знает сколько раз он уже сканировал этот бар, поэтому ограничение сделки будет только размер позиции полученный от терминала.


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


Последний раз редактировалось: MrDrJOKER (Ср Окт 16, 2013 12:47 am), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Окт 15, 2013 5:15 pm Ответить с цитатой Вернуться к началу

Угу. Понял. Ну это на сигнал влияет мало. Вот открылась свеча, поступил сигнал. Робот его увидел и кинул заявку. Через секунду он снова увидел сигнал. Про то, что он его уже видел робот ничего не знает. Поэтому он снова попытается кинуть заявку. Если IB скажет роботу, что поза уже есть, то робот не станет кидать заявку. А вдруг IB узнает об открытой позе с задержкой?

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
MrDrJOKER



Зарегистрирован: 22.06.2009
Сообщения: 489

СообщениеДобавлено: Вт Окт 15, 2013 7:01 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Угу. Понял. Ну это на сигнал влияет мало. Вот открылась свеча, поступил сигнал. Робот его увидел и кинул заявку. Через секунду он снова увидел сигнал. Про то, что он его уже видел робот ничего не знает. Поэтому он снова попытается кинуть заявку. Если IB скажет роботу, что поза уже есть, то робот не станет кидать заявку. А вдруг IB узнает об открытой позе с задержкой?


ага. а как часто тестер скенит данные в режиме риалтайм?
и разве ф-ция ExRem не блокирует такие последующие сигналы того же массива Short/Cover?
Код:

Short = ExRem( Short, Cover );
Cover = ExRem( Cover, Short );


Последний раз редактировалось: MrDrJOKER (Вт Окт 15, 2013 7:22 pm), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Окт 15, 2013 7:22 pm Ответить с цитатой Вернуться к началу

Цитата:
ага. а как часто тестер скенит данные в режиме риалтайм?

А это как задашь. От 1 раз в секунду, до...
Цитата:
и разве ф-ция ExRem не блокирует такие последующие сигналы того же массива Short?

Блокирует последующие сигналы. Но это тот же самый сигнал. Последующие на других барах, а этот тот же самый сигнал на том же баре.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
MrDrJOKER



Зарегистрирован: 22.06.2009
Сообщения: 489

СообщениеДобавлено: Вт Окт 15, 2013 7:54 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Цитата:
ага. а как часто тестер скенит данные в режиме риалтайм?

А это как задашь. От 1 раз в секунду, до...
Цитата:
и разве ф-ция ExRem не блокирует такие последующие сигналы того же массива Short?

Блокирует последующие сигналы. Но это тот же самый сигнал. Последующие на других барах, а этот тот же самый сигнал на том же баре.

всё понял, сделаю. надо будет попробовать милисекунды в лог тоже писать, если это вообще возможно.

если поставить частоту скэна 1 сек, то у всей системы будет как раз 1 секунда на то, чтоб послать сигнал и завершить процесс. хотя 1 сек - маловато, наверняка.
какую частоту скэна принято ставить?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Окт 15, 2013 9:57 pm Ответить с цитатой Вернуться к началу

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

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
MrDrJOKER



Зарегистрирован: 22.06.2009
Сообщения: 489

СообщениеДобавлено: Вт Окт 15, 2013 10:30 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Я ставлю 1 секунду. Тут еще надо иметь ввиду, что если функция должна что либо вернуть и требует на это время, то AFL ждет. Не знаю точно сколько он может ждать, но некоторое время ждет. Таким макаром время выполнения одного скана может быть больше секунды, но пока не закончится один скан следующий не запуститься.


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


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Окт 15, 2013 10:34 pm Ответить с цитатой Вернуться к началу

А если ордер покакой либо причине не прошел, то что возвращает PlaceOrder?
Может использовать как тут?
http://www.amisite.ru/afl/exp/files/Quik_Robot1.afl

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
MrDrJOKER



Зарегистрирован: 22.06.2009
Сообщения: 489

СообщениеДобавлено: Вт Окт 15, 2013 11:11 pm Ответить с цитатой Вернуться к началу

000 писал(а):
А если ордер покакой либо причине не прошел, то что возвращает PlaceOrder?
Может использовать как тут?
http://www.amisite.ru/afl/exp/files/Quik_Robot1.afl


мы проверяем есть ли соединение с сервером у платформы, поэтому вроде как причин неисполнения быть не должно. даже если соединение пропадёт, то ордер будет исполнен, когда появится соединение снова. IsConnected() это проверяет. PlaceOrder возвращает только OrderId и всё.

буду дома, гляну, что там в коде точнее, но ориентироваться я могу только на соединение платформы.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вт Окт 15, 2013 11:28 pm Ответить с цитатой Вернуться к началу

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

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
MrDrJOKER



Зарегистрирован: 22.06.2009
Сообщения: 489

СообщениеДобавлено: Ср Окт 16, 2013 2:23 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Может использовать как тут?
http://www.amisite.ru/afl/exp/files/Quik_Robot1.afl

Код:

   else
   {
      text = "фигня какая то";
      Color = colorRed;
   }

Laughing
не, как там не получится.
Код:
if(StrToNum(order) > 100)

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

000 писал(а):
Должны быть сообщения отказа. Ну например ты не правильный тикер забил или денег не хватает на указанный сайз...

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

может решить ситуацию обычным триггером?
встроил триггер, задержки на исполнение ...

в принципе я исхожу из того, что проблем с ордерами не будет, но как поступить, если всё таки случится что-то? тупо закрывать ордер и слать новый?


Последний раз редактировалось: MrDrJOKER (Ср Окт 16, 2013 6:50 pm), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение
MrDrJOKER



Зарегистрирован: 22.06.2009
Сообщения: 489

СообщениеДобавлено: Ср Окт 16, 2013 6:49 pm Ответить с цитатой Вернуться к началу

добавил:
- CostBuffer - текущие расходы + буфер,
- CashToShort - кол-во кеша расчитываемое автоматом пока на всю котлету(без плеча),
- SharesToShort - кол-во акций,
- определение валют кэша и общая их стоимость(GetAccountValue( "[USD]TotalCashBalance" ) выдаёт баланс в валюте USD, общий).
- коэф-т полу-келли,
- запись сделок в лог,
- запись OrderID в лог,
- запись IsConnected в лог,
- запись OrderStaus в лог,
- обработку исполнения ордера (с задержками).

Код:

//------------MM------------
//cash buffer for operating costs
CostBuffer = 100;
//Half-Kelly criterion - 1.63 -> Margin=100/1.63=61.35, 1.5 = 66.66%, 1.4=71,5%, 1.3=77% to use
PartOfKellyCriterion = 1.3;

//---------------------------------------Export in file-----------------------------------
Ticker = Name();
path = "C:\\";
file = Name() + "_amisignals";
export = ParamToggle("export", "No|Yes", 0);
ymdt = Now( format = 5 );  // computer time
ymdtBar = LastValue( DateTime() ); // date and time of bar

//-----------------------------------------RT-Trading------------------------------------------
SignalTrigger = 1; //set trigger at true

if( LastValue( Short ) && SignalTrigger == 1 ) //open SHORT-Position
{
  ibc = GetTradingInterface("IB");
 
  //set trigger at false
  SignalTrigger = 0;
 
  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     //------------MM-------------
     // operating cash/shares to trade sizing
     CashToShort = ( ibc.GetAccountValue( "[USD]TotalCashBalance" ) - CostBuffer ) * PartOfKellyCriterion;
     SharesToShort = round( CashToShort / LastValue(C) );
     
     // check if we do not have already open position on this stock
     if( ibc.GetPositionSize( Name() ) == 0 )
     {
        // transmit order
        OrderID = ibc.PlaceOrder( Name(), "SSHORT", SharesToShort, "MKT", 0, 0, "GTC", True );
       
        //some sec's sleeptime
        for (dummy=0; dummy<100; dummy++) ibc.Sleep(40);
       
        //check status of transmitted order
        OrderStatus = ibc.GetStatus( OrderId, True );
        //possible answers
        //"NotYetTransmitted", "PreSubmitted", "Pending", "Cancelled","Submitted", "Filled", "Error" (new in 1.0.2), "Inactive" or empty when matching order was not found
        //wait till order should be filled
        while ( OrderStatus == "NotYetTransmitted" ||
                OrderStatus == "PreSubmitted" ||
                OrderStatus == "Pending" ||
                OrderStatus == "Submitted" ||
                OrderStatus == "Inactive"   )
        {
            for (dummy=0; dummy<100; dummy++) ibc.Sleep(50); //some sec's sleeptime
            OrderStatus = ibc.GetStatus( OrderId, True );
        }
       
        //order was filled, error or some shiat, set trigger on true
        SignalTrigger = 1;

        //-------export in file -----
        if(export)
        {
            fh = fopen(path+file+".txt",  "w");
            if( fh )
            {
                text = Ticker +","+ DateTimeToStr(ymdt) +","+ DateTimeToStr(ymdtBar) +","+
                "Short" +","+ OrderID +","+ SharesToShort +","+ LastValue(C) + OrderStatus +"\n";
                fputs( text, fh );
                fclose( fh );
            }
        }
    }
  }
 
  //check connection is failed
  if( ibc.IsConnected() == 0 )
  {
    //-------export in file -----
    if(export)
    {
        fh = fopen(path+file+".txt",  "w");
        if( fh )
        {
            text = Ticker +","+ DateTimeToStr(ymdt) +","+ DateTimeToStr(ymdtBar) +","+
            "Short" +","+ LastValue(C) +",NO connection\n";
            fputs( text, fh );
            fclose( fh );
        }
    }
  }
}

if( LastValue( Cover ) && SignalTrigger == 1 ) //cover SHORT-Position
{
  ibc = GetTradingInterface("IB");
 
    //set trigger at false
  SignalTrigger = 0;

  // check if we are connected OK
  if( ibc.IsConnected() )
  {
    // check if we have already open position on this stock
    if( ibc.GetPositionSize( Name() ) != 0 )
    {
        PositionsSize = ibc.GetPositionSize( Name() );
       
        // transmit order
        OrderID = ibc.PlaceOrder( Name(), "BUY", ibc.GetPositionSize( Name() ), "MKT", 0, 0, "GTC", True );
       
        //some sec's sleeptime
        for (dummy=0; dummy<100; dummy++) ibc.Sleep(40);
       
        //check status of transmitted order
        OrderStatus = ibc.GetStatus( OrderId, True );
        //possible answers
        //"NotYetTransmitted", "PreSubmitted", "Pending", "Cancelled","Submitted", "Filled", "Error" (new in 1.0.2), "Inactive" or empty when matching order was not found
        //wait till order should be filled
        while ( OrderStatus == "NotYetTransmitted" ||
                OrderStatus == "PreSubmitted" ||
                OrderStatus == "Pending" ||
                OrderStatus == "Submitted" ||
                OrderStatus == "Inactive"   )
        {
            for (dummy=0; dummy<100; dummy++) ibc.Sleep(50); //some sec's sleeptime
            OrderStatus = ibc.GetStatus( OrderId, True );
        }
       
        //order was filled, error or some shiat, set trigger on true
        SignalTrigger = 1;
       
        //-------export in file -----
        if(export)
        {
            fh = fopen(path+file+".txt",  "w");
            if( fh )
            {
                text = Ticker +","+ DateTimeToStr(ymdt) +","+ DateTimeToStr(ymdtBar) +","+
                "Cover" +","+ OrderID +","+ PositionsSize +","+ LastValue(C) + OrderStatus +"\n";
                fputs( text, fh );
                fclose( fh );
            }
        }
       
       
    }
  }
 
  //check connection is failed
  if( ibc.IsConnected() == 0 )
  {
    //-------export in file -----
    if(export)
    {
        fh = fopen(path+file+".txt",  "w");
        if( fh )
        {
            text = Ticker +","+ DateTimeToStr(ymdt) +","+ DateTimeToStr(ymdtBar) +","+
            "Cover" +","+ LastValue(C) +",NO connection\n";
            fputs( text, fh );
            fclose( fh );
        }
    }
  }
}


добавить:
?

как решение? вроде правильно ошибки парсировал.
что ещё? где что забыл? может лог ошибок/промежуточного исполнения ордеров отдельно сделать?
Посмотреть профиль Отправить личное сообщение
MrDrJOKER



Зарегистрирован: 22.06.2009
Сообщения: 489

СообщениеДобавлено: Ср Окт 16, 2013 10:58 pm Ответить с цитатой Вернуться к началу

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

кстати, а есть где-то указания, как ставить Ami в режим риалтайм? где что включить, открыть и т.п.?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Ср Окт 16, 2013 11:06 pm Ответить с цитатой Вернуться к началу

Если Робот в АА, то ничего особенного не надо.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen