///
<summary>
///
Старт торговой стратегии. При реальной торговле отрабатывается на каждом
тике,
///
при тестировании - на каждой свече
///
</summary>
///
<returns>true
- отработано успешно, false - были ошибки</returns>
public
override bool
start()
{
ITerminalDriver driver =
manager.strategy.driver;
string account =
manager.strategy.account;
string market =
manager.strategy.market;
string ticker =
manager.strategy.ticker;
int signal = GetSignal(1);
decimal koeff = 1;
int l_count_trade =
Convert.ToInt32(get_count_trade() / koeff);
int count_bal;
//если сигнал
на покупку
if (signal
== 1)
{
count_bal =
driver.itemCountOnAccount(ticker); //определим
кол-во инструментов на балансе
//определяем, сколько будем покупать, учитывая то, что надо переворачивать
позицию
int
count_buy = l_count_trade - count_bal;
//если мы можем что то купить, то
покупаем
if (count_buy
> 0)
{
//
выставляем ордер на покупку
StockOrderInfo
info;
info.account = account;
info.count = count_buy;
info.market = market;
info.price = 0; //по
рынку
info.stopType = "";
//обычная
заявка
info.type = "buy";
info.signalPrice = 0;
info.ticker = ticker;
info.expiry = DateTime.Now;
driver.sendOrder(info);
//выставляем
стоп
лосс
if (stop_loss_order !=
null)
{
(driver as
IAddTerminalDriver).deleteOrder(stop_loss_order);
}
info.stopType = "stoploss";
//обычная
заявка
info.type = "sell";
info.signalPrice =
_source.getBarFromCurrent(0).open*(1.0-Convert.ToDouble(stop_loss)/100);
stop_loss_order=driver.sendOrder(info).orderCode;
//выставляем
тэйк
профит
if (take_profit_order !=
null)
{
(driver as
IAddTerminalDriver).deleteOrder(take_profit_order);
}
info.signalPrice = _source.getBarFromCurrent(0).open *
(1.0 + Convert.ToDouble(take_profit) /
100);
info.stopType = "takeprofit";
//обычная
заявка
take_profit_order=driver.sendOrder(info).orderCode;
}
}
//если сигнал
на продажу
if (signal
== -1)
{
count_bal =
driver.itemCountOnAccount(ticker); //определим
кол-во инструментов на балансе
//определяем, сколько будем покупать, учитывая то, что надо переворачивать
позицию
int
count_sell = l_count_trade + count_bal;
//если мы можем что то продать, то
продаем
if (count_sell
> 0)
{
//выставим ордер на продажу
StockOrderInfo
info;
info.account = account;
info.count = count_sell;
info.market = market;
info.price = 0; //по
рынку
info.stopType = "";
//обычная
заявка
info.type = "sell";
info.signalPrice = 0;
info.ticker = ticker;
info.expiry = DateTime.Now;
driver.sendOrder(info);
//выставляем
стоп
лосс
if (stop_loss_order !=
null)
{
(driver as
IAddTerminalDriver).deleteOrder(stop_loss_order);
}
info.stopType = "stoploss";
//обычная
заявка
info.type = "buy";
info.signalPrice = _source.getBarFromCurrent(0).open *
(1.0 + Convert.ToDouble(stop_loss) /
100); ;
stop_loss_order=driver.sendOrder(info).orderCode;
//выставляем
тэйк
профит
if (take_profit_order !=
null)
{
(driver as
IAddTerminalDriver).deleteOrder(take_profit_order);
}
info.signalPrice = _source.getBarFromCurrent(0).open *
(1.0 - Convert.ToDouble(take_profit) /
100);
info.stopType = "takeprofit";
//обычная
заявка
take_profit_order=driver.sendOrder(info).orderCode;
}
}
//теперь
проверим, надо ли удалить стоп заявки
Order
order = null;
if (take_profit_order !=
null)
{
order = (driver as
IAddTerminalDriver).getOrder(take_profit_order);
if (order !=
null)
{
if (order.state ==
OrderState.Full) (driver
as
IAddTerminalDriver).deleteOrder(stop_loss_order);
}
}
if (stop_loss_order !=
null)
{
order = (driver as
IAddTerminalDriver).getOrder(stop_loss_order);
if (order !=
null)
{
if (order.state ==
OrderState.Full) (driver
as
IAddTerminalDriver).deleteOrder(take_profit_order);
}
}
return
true;
} |