Автор |
Сообщение |
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
Ами будет работать через 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
|
Единственное что. При закрытии позы бери сайз с ibc.GetPositionSize(). Вдруг по какой то причине не вся заявка на вход исполнилась.
А так все ОК. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
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
|
Не понял?
Если открытая позиция равно 0, то кроем ее нулевым сайзом? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
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
|
добавил:
- 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
|
Текщую цену?
LastValue(C) |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
добавил:
- 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
|
добавил:
- 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
|
Запись сделок обязательно надо сделать. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
добавил:
- 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
|
А ibc.PlaceOrder что нибудь возвращает? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
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
|
Я бы его писал в лог.
И вообще для начала (ведь не известно на сколько хорошо это все работает) я бы писал каждый заход в открытие и закрытие позиции.
Вот например. Позу открыл, а инфа об этом еще не попала в терминал, а тут следующий проход и опять открытие....
А если не писать, то ты потом будешь ломать голову почему поза открыта двойным сайзом.... |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
добавил:
- 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 );
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|