Собственно есть две просьбы:
- подскажите пожалуйста, как стакан то добавить (возможно я сделал все верно, но я не уверен, тк впервые это делаю) в документации рассмотрен пример с генерацией стакана с интервалом в 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);
}
}
В коде все равно останется много ошибок, но надеюсь я смогу с ними разобраться с Вашей помощью)) Спасибо за помощь
Комментарии (10)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Лучше сравнивай сам статус. Вот так.
Лучше сравнивай сам статус. Вот так.
если нельзя убирать портфолио, то как сделать то?
MarketDepth.TotalBidsVolume так таже самая ошибка..
зачем? я ведь не генерирую стаканы, а это как я понял интервал обновления (волотильность) инструмента.. не совсем понятно
"Замени использование числа 50 на переменную." это ньюансы, с ними проблем нету вроде как
"если нельзя убирать портфолио, то как сделать то?" Вопрос - что сделать?
_marketDepth.TotalBidsVolume.ToString() - такая строчка у меня вывела все что нужно. В данном случае MarketDepth это что, объект или класс?
""Замени использование числа 50 на переменную." это ньюансы, с ними проблем нету вроде как" Потом это приведит к трудноуловимым ошибкам, т.к. если в 3 местах нужно использовать одно число, к примеру 140, а потом приходиться менять его на 120 ,в одном месте можно забыть поменять и пол дня искать ошибку.
Собственно мне кажется, что стакан у меня вовсе не создан.. Я не знаю, как мне его создать, а точнее исторически вытащить, в примере он не используется вовсе 🤨
А за совет отдельное спасибо, я знал конечно, но пока я просто пытаюсь разобраться 🙂
Так понятно почему ошибка - поле то не статическое, нужно создать объект ,тогда можно будет получить суммарный объем. Как это сделать для тестинга на истории - я не знаю.
В общем сделал вот так.
mainwindow.xaml.cs
strategy.cs
Но увы не робит... я считаю что со стаканом что то не так..
Покажи место, где происходит инициализация стакана.
Честно - ХЗ почему не работает.
Я бы взял один из примеров и потишоньку бы передолываал его под себя, тогда будет видна причина ошибки. И Станет понятен мехнизм работы S#.