Стратегия боллинджер
C#
Cтратегия пытается торговать в длинную позицию, покупая на нижней границе полосы Боллинджера и продавая, когда цены растут и достигают линии скользящей средней.
Эта стратегия эффективна на рынках с боковым и восходящим трендом, если ложные прорывы и рынки с нисходящим трендом не слишком часто идут против вас. Конечно, вы должны добавить в эту стратегию механизм стоп-лосса для защиты от убытков, прежде чем использовать ее в реальной жизни. Также обратите пристальное внимание на транзакционные издержки, потому что небольшие колебания цен обычно не приносят большой прибыли.
Код
using OpenQuant.API;
using OpenQuant.API.Indicators;
using System.Drawing;
public class MyStrategy : Strategy
{
[Parameter("Order quantity (number of contracts to trade)")]
double Qty = 100;
[Parameter("Length of SMA")]
int SMALength = 20;
[Parameter("Order of BBL")]
double BBLOrder = 2;
// indicators
;
BBL bbl;
SMA sma
;
Order buyOrder;
Order sellOrder
public override void OnStrategyStart()
{
// set up the moving averages
= new SMA(Bars, SMALength);
sma .Color = Color.Yellow;
smaDraw(sma, 0);
// set up bollinger bands
= new BBL(Bars, SMALength, BBLOrder);
bbl .Color = Color.Pink;
bblDraw(bbl, 0);
}
public override void OnBar(Bar bar)
{
// always a good practice to be sure a series contains
// a bar for a particular date before you try to use it
if (bbl.Contains(bar.DateTime))
{
// We are always trying to buy at the lower Bollinger
// limit, and sell when the price goes up to the
// latest SMA value. So we are constantly
// updating both the buy point and the sell point.
// if we don't have an open position in this instrument,
// update the buy point to the latest lower bbl limit
if (!HasPosition)
{
if (buyOrder != null)
.Cancel();
buyOrder
= BuyLimitOrder(Qty, bbl.Last, "Entry");
buyOrder .Send();
buyOrder}
// else if we already have a position going, update
// the sell point to follow the latest SMA value
else
UpdateExitLimit();
}
}
public override void OnPositionOpened()
{
UpdateExitLimit();
}
private void UpdateExitLimit()
{
// cancel old exit point order, if it exists
if (sellOrder != null)
.Cancel();
sellOrder// Issue a new order with the latest SMA value. This is
// kind of a "trailing SMA sell order" that follows the SMA.
= SellLimitOrder(Qty, sma.Last, "Exit");
sellOrder .Send();
sellOrder}
}