Собственно есть две просьбы:
- подскажите пожалуйста, как стакан то добавить (возможно я сделал все верно, но я не уверен, тк впервые это делаю) в документации рассмотрен пример с генерацией стакана с интервалом в 1 сек или 1 милисек.
_trader.DepthGenerators[security] = new TrendMarketDepthGenerator(security)
{
// стакан для инструмента в истории обновляется раз в секунду
Interval = TimeSpan.FromSeconds(1)
};
я просто решил закомментить Interval = TimeSpan.FromSeconds(1), возможно не так сделал
- Как потом вызвать этот стакан в стратегии, в преведущем моем топике "takeprofit && stoploss" возможно кто-то помнит, сделано совсем не грамотно! и теперь думаю пришло время разобраться с этим.. Вот собственно весь код стратегии))
а)общий объем покупки пытался получить вот так MarketDepth.TotalBidsVolume(Security), вот так MarketDepth.TotalBidsVolume.Security , но увы ничего не вышло. Пишет "Невызываемый член "StockSharp.BusinessEntities.MarketDepth.TotalBidsVolume" не может использоваться как метод." в чем ошибка? б)как получить портфолио? я его по идее присваиваю при создании стратегии
_strategy = new NewStrategy()
{
Volume = 1,
Portfolio = portfolio,
Security = security,
Trader = _trader
};
те при создании заявки я могу просто убрать "Portfolio = portfolio," ?
var longPos = new Order
{
Portfolio = portfolio,
Price = Security.ShrinkPrice(Security.BestBid.Price),
Security = Security,
Volume = 1,
Direction = OrderDirections.Buy,
};
public class NewStrategy : Strategy
{
int i;
protected override void OnStarting()
{
this
.When(Security.MarketDepthChanged())
.Do(str);
base.OnStarting();
}
public void str()
{
var totb = MarketDepth.TotalBidsVolume(Security);// общий объем покупки
var tota = _depth.TotalAsksVolume;// общий объем продажи
if (_position.CurrentValue != 0) // если позиция не равна 0, то будем считать, что заявок у нас нету
{
i = 0;
}
if (i == 1) // если заявка есть, то...
{
if ((Security.BestBid.Price - posPrice >= 50 && pos == 0) || (posPrice - Security.BestAsk.Price >= 50 && pos == 1)) // если цена ушла от заявки на 50 и более пунктов то закрываем ее
{
var orderClose = Trader.Orders.First(o => o.Id == posId);
/* получаем статус заявки */
int stateOrderClose = (int)orderClose.State;
/*
* 0 - Не отправлена в торговую систему.
* 1 - Заявка принята биржей и активна.
* 2 - Заявка больше не активна на бирже (была полностью удовлетворена или снята из программы).
* 3 - Заявка не принята торговой системой.
*/
if (stateOrderClose == 1)
{
Trader.CancelOrder(orderClose);
}
if (stateOrderClose == 2)
{
i = 0;
}
}
}
if (_position.CurrentValue == 0 && i == 0)
{
if (totb > tota) // если общий объем покупок больше продаж, то продаем
{
i = 1;
shortPos();
}
else
{
i = 1;
longPos();
}
}
}
public void longPos()
{
// создаем заявку для открытия длинной позиции
var longPos = new Order
{
Portfolio = portfolio,
Price = Security.ShrinkPrice(Security.BestBid.Price),
Security = Security,
Volume = 1,
Direction = OrderDirections.Buy,
};
// регистрируем правило, отслеживающее появление новых сделок по заявке
this
.When(longPos.NewTrades())
.Do(OnNewOrderTrades)
.Periodical(() => longPos.IsMatched());
// отправляем заявку на регистрацию
RegisterOrder(longPos);
pos = 0;
posPrice = Security.BestBid.Price;
}
public void shortPos()
{
// создаем заявку для открытия длинной позиции
var shortPos = new Order
{
Portfolio = portfolio,
Price = Security.ShrinkPrice(Security.BestAsk.Price),
Security = Security,
Volume = 1,
Direction = OrderDirections.Sell,
};
// регистрируем правило, отслеживающее появление новых сделок по заявке
this
.When(shortPos.NewTrades())
.Do(OnNewOrderTrades)
.Periodical(() => shortPos.IsMatched());
// отправляем заявку на регистрацию
RegisterOrder(shortPos);
pos = 1;
posPrice = Security.BestAsk.Price;
}
private void OnNewOrderTrades(IEnumerable<MyTrade> trades)
{
// для каждой сделки добавляем для защитную пару стратегии
var protectiveStrategies = trades.Select(t =>
{
// выставляет тейк-профит в 100 пунктов
var takeProfit = new TakeProfitStrategy(t, 100);
// выставляет стоп-лосс в 50 пунктов
var stopLoss = new StopLossStrategy(t, 50);
return new TakeProfitStopLossStrategy(takeProfit, stopLoss);
});
ChildStrategies.AddRange(protectiveStrategies);
}
}
В коде все равно останется много ошибок, но надеюсь я смогу с ними разобраться с Вашей помощью)) Спасибо за помощь
Comments (10)
Login or Create account, Log in or register to leave a comment
Лучше сравнивай сам статус. Вот так.
Лучше сравнивай сам статус. Вот так.
если нельзя убирать портфолио, то как сделать то?
MarketDepth.TotalBidsVolume так таже самая ошибка..
зачем? я ведь не генерирую стаканы, а это как я понял интервал обновления (волотильность) инструмента.. не совсем понятно
"Замени использование числа 50 на переменную." это ньюансы, с ними проблем нету вроде как
"если нельзя убирать портфолио, то как сделать то?" Вопрос - что сделать?
_marketDepth.TotalBidsVolume.ToString() - такая строчка у меня вывела все что нужно. В данном случае MarketDepth это что, объект или класс?
""Замени использование числа 50 на переменную." это ньюансы, с ними проблем нету вроде как" Потом это приведит к трудноуловимым ошибкам, т.к. если в 3 местах нужно использовать одно число, к примеру 140, а потом приходиться менять его на 120 ,в одном месте можно забыть поменять и пол дня искать ошибку.
Собственно мне кажется, что стакан у меня вовсе не создан.. Я не знаю, как мне его создать, а точнее исторически вытащить, в примере он не используется вовсе 🤨
А за совет отдельное спасибо, я знал конечно, но пока я просто пытаюсь разобраться 🙂
Так понятно почему ошибка - поле то не статическое, нужно создать объект ,тогда можно будет получить суммарный объем. Как это сделать для тестинга на истории - я не знаю.
В общем сделал вот так.
mainwindow.xaml.cs
strategy.cs
Но увы не робит... я считаю что со стаканом что то не так..
Покажи место, где происходит инициализация стакана.
Честно - ХЗ почему не работает.
Я бы взял один из примеров и потишоньку бы передолываал его под себя, тогда будет видна причина ошибки. И Станет понятен мехнизм работы S#.