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



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

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

Ами будет работать через TWS.

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

Ами соединяем с платформой TWS от InteractiveBrokers с помошью IBController и пишем робота:

Код:

//-----------------------------------------RT-Trading------------------------------------------
if( LastValue( Short ) ) //open SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     // check if we do not have already open position on this stock
     if( ibc.GetPositionSize( Name() ) == 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "SSHORT", 100, "MKT", 0, 0, "GTC", True );
     }
  }
}

if( LastValue( Cover ) ) //cover SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     // check if we do not have already open position on this stock
     if( ibc.GetPositionSize( Name() ) == 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "BUY", 100, "MKT", 0, 0, "GTC", True );
     }
  }
}


вот размер позиций пока 100. сейчас подумаю, как его превратить в нужное кол-во в зависимости от капитала под систему.


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


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

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

Единственное что. При закрытии позы бери сайз с ibc.GetPositionSize(). Вдруг по какой то причине не вся заявка на вход исполнилась.
А так все ОК.

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



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

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

000 писал(а):
Единственное что. При закрытии позы бери сайз с ibc.GetPositionSize(). Вдруг по какой то причине не вся заявка на вход исполнилась.
А так все ОК.


точно! или можно не заморачиваться и крыть позу так:
Код:

ibc.CloseAllOpenPositions( Name() );


а если корректно, то получим:
Код:

if( LastValue( Cover ) ) //cover SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     // check if we do not have already open position on this stock
     if( ibc.GetPositionSize( Name() ) == 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "BUY", ibc.GetPositionSize( Name() ), "MKT", 0, 0, "GTC", True );
     }
  }
}
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Не понял?
Если открытая позиция равно 0, то кроем ее нулевым сайзом?

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



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

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

000 писал(а):
Если открытая позиция равно 0, то кроем ее нулевым сайзом?


упс, забыл актуализировать версию здесь.

в общем вот актуальный вариант:
Код:

//-----------------------------------------RT-Trading------------------------------------------
if( LastValue( Short ) ) //open SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     // check if we do not have already open position on this stock
     if( ibc.GetPositionSize( Name() ) == 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "SSHORT", 100, "MKT", 0, 0, "GTC", True );
     }
  }
}

if( LastValue( Cover ) ) //cover SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     // check if we have already open position on this stock
     if( ibc.GetPositionSize( Name() ) != 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "BUY", ibc.GetPositionSize( Name() ), "MKT", 0, 0, "GTC", True );
     }
  }
}
Посмотреть профиль Отправить личное сообщение
MrDrJOKER



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

СообщениеДобавлено: Чт Окт 10, 2013 2:41 am Ответить с цитатой Вернуться к началу

добавил:
- CostBuffer - текущие расходы + буфер,
- CashToShort - кол-во кеша расчитываемое автоматом пока на всю котлету.

Код:

//-----------------------------------------RT-Trading------------------------------------------
if( LastValue( Short ) ) //open SHORT-Position
{
  ibc = GetTradingInterface("IB");
 
  //cash buffer for operating costs
  CostBuffer = 500;
 
  // check if we are connected OK
  if( ibc.IsConnected() )
  {
  //------------MM-------------
     // operating cash/shares to trade sizing
     CashToShort = ibc.GetAccountValue( "[USD]TotalCashBalance" ) - CostBuffer;
     SharesToShort = ???; //to do
     // check if we do not have already open position on this stock
     if( ibc.GetPositionSize( Name() ) == 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "SSHORT", SharesToShort, "MKT", 0, 0, "GTC", True );
     }
  }
}

if( LastValue( Cover ) ) //cover SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     // check if we have already open position on this stock
     if( ibc.GetPositionSize( Name() ) != 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "BUY", ibc.GetPositionSize( Name() ), "MKT", 0, 0, "GTC", True );
     }
  }
}


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

edit: блин, как узнать текущую цену? Open? ValueWhen(Short, ShortPrice)?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

Текщую цену?
LastValue(C)

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



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

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

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

Код:

//-----------------------------------------RT-Trading------------------------------------------
if( LastValue( Short ) ) //open SHORT-Position
{
  ibc = GetTradingInterface("IB");
  //------------MM------------
  //cash buffer for operating costs
  CostBuffer = 100;
 
  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     //------------MM-------------
     // operating cash/shares to trade sizing
     CashToShort = ibc.GetAccountValue( "[USD]TotalCashBalance" ) - CostBuffer;
     SharesToShort = round( CashToShort / LastValue(C) );
     
     // check if we do not have already open position on this stock
     if( ibc.GetPositionSize( Name() ) == 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "SSHORT", SharesToShort, "MKT", 0, 0, "GTC", True );
     }
  }
}

if( LastValue( Cover ) ) //cover SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     // check if we have already open position on this stock
     if( ibc.GetPositionSize( Name() ) != 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "BUY", ibc.GetPositionSize( Name() ), "MKT", 0, 0, "GTC", True );
     }
  }
}


добавить:
- коэф-т келли.
Посмотреть профиль Отправить личное сообщение
MrDrJOKER



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

СообщениеДобавлено: Пн Окт 14, 2013 2:40 am Ответить с цитатой Вернуться к началу

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

Код:

//-----------------------------------------RT-Trading------------------------------------------
if( LastValue( Short ) ) //open SHORT-Position
{
  ibc = GetTradingInterface("IB");
  //------------MM------------
  //cash buffer for operating costs
  CostBuffer = 100;
  //half-Kelly criterion
  HalfKellyCriterion = 1.5;
 
  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     //------------MM-------------
     // operating cash/shares to trade sizing
     CashToShort = ( ibc.GetAccountValue( "[USD]TotalCashBalance" ) - CostBuffer ) * HalfKellyCriterion;
     SharesToShort = round( CashToShort / LastValue(C) );
     
     // check if we do not have already open position on this stock
     if( ibc.GetPositionSize( Name() ) == 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "SSHORT", SharesToShort, "MKT", 0, 0, "GTC", True );
     }
  }
}

if( LastValue( Cover ) ) //cover SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // check if we are connected OK
  if( ibc.IsConnected() )
  {
     // check if we have already open position on this stock
     if( ibc.GetPositionSize( Name() ) != 0 )
     {
        // transmit order
        ibc.PlaceOrder( Name(), "BUY", ibc.GetPositionSize( Name() ), "MKT", 0, 0, "GTC", True );
     }
  }
}


добавить:
?

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


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

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

Запись сделок обязательно надо сделать.

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



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

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

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

Код:

//------------MM------------
//cash buffer for operating costs
CostBuffer = 100;
//Half-Kelly criterion - 1.3
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------------------------------------------
if( LastValue( Short ) ) //open SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // 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
        ibc.PlaceOrder( Name(), "SSHORT", SharesToShort, "MKT", 0, 0, "GTC", True );

        //-------export in file -----
        if(export)
        {
            fh = fopen(path+file+".txt",  "w");
            if( fh )
            {
                text = Ticker +","+ DateTimeToStr(ymdt) +","+ DateTimeToStr(ymdtBar) +","+
                "Short" +","+","+ SharesToShort +","+ LastValue(C) +"\n";
                fputs( text, fh );
                fclose( fh );
            }
        }
    }
  }
}

if( LastValue( Cover ) ) //cover SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // 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
        ibc.PlaceOrder( Name(), "BUY", ibc.GetPositionSize( Name() ), "MKT", 0, 0, "GTC", True );

        //-------export in file -----
        if(export)
        {
            fh = fopen(path+file+".txt",  "w");
            if( fh )
            {
                text = Ticker +","+ DateTimeToStr(ymdt) +","+ DateTimeToStr(ymdtBar) +","+
                "Cover" +","+ PositionsSize +","+ LastValue(C) +"\n";
                fputs( text, fh );
                fclose( fh );
            }
        }
    }
  }
}

добавил запись в файл аккурат после передачи ордеров в TWS. (или лучше сделать до?) должно так работать.

добавить:
?

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


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

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

А ibc.PlaceOrder что нибудь возвращает?

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



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

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

000 писал(а):
А ibc.PlaceOrder что нибудь возвращает?

да, OrderID.

Цитата:
Return value:

The function returns the OrderId (string) that can be later used to modify/cancel/query status of the order
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

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

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

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



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

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

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

Код:

//------------MM------------
//cash buffer for operating costs
CostBuffer = 100;
//Half-Kelly criterion - 1.3
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------------------------------------------
if( LastValue( Short ) ) //open SHORT-Position
{
  ibc = GetTradingInterface("IB");
 
  // 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 );
       
        //-------export in file -----
        if(export)
        {
            fh = fopen(path+file+".txt",  "w");
            if( fh )
            {
                text = Ticker +","+ DateTimeToStr(ymdt) +","+ DateTimeToStr(ymdtBar) +","+
                "Short" +","+ OrderID +","+ SharesToShort +","+ LastValue(C) +"\n";
                fputs( text, fh );
                fclose( fh );
            }
        }
    }
  }
}

if( LastValue( Cover ) ) //cover SHORT-Position
{
  ibc = GetTradingInterface("IB");

  // 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 );
       
        //-------export in file -----
        if(export)
        {
            fh = fopen(path+file+".txt",  "w");
            if( fh )
            {
                text = Ticker +","+ DateTimeToStr(ymdt) +","+ DateTimeToStr(ymdtBar) +","+
                "Cover" +","+ OrderID +","+ PositionsSize +","+ LastValue(C) +"\n";
                fputs( text, fh );
                fclose( fh );
            }
        }
    }
  }
}


добавить:
?
вроде всё?

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


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

можно для тестовой версии писать при проходе сигнала сразу строчку, например, с пометкой "first signal", а уже при отправке ордера с пометкой "order send", но на какой случай? ведь по логике такого быть не может, к тому же у меня там стоят триггеры:
Код:

Short = ExRem( Short, Cover );
Cover = ExRem( Cover, Short );
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen