using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
/****************************************
Стратегия создана специально
для обучения по Wealth-Lab от StockSharp
все подробности тут
÷ñÒ3941504êÖ0õæ÷http://stocksharp.com/lesson/wealth.aspx
÷ñÒ3941504êÖ1õæ÷
StockSharp <<торговые роботы>>
*****************************************/
namespace WealthLab.Strategies
{
public class MyStrategy : WealthScript
{
private StrategyParameter _bbPeriod;
private StrategyParameter _bbdev;
private StrategyParameter _malength;
private StrategyParameter _malength1;
private StrategyParameter _roc;
//тейк профит и стоплосс
private StrategyParameter _takeprofit;
private StrategyParameter _stoploss;
public MyStrategy()
{
//индикаторы
_bbPeriod = CreateParameter("BBand Period", 114, 10, 200, 10);
_bbdev = CreateParameter("BBand StdDev", 1.86, 1, 4, 0.25);
_malength = CreateParameter("MA", 137, 10, 200, 5);
_malength1 = CreateParameter("MA1",83,10, 200, 5);
_roc = CreateParameter("ROC",1,1,5, 1);
//тейк профит и стоплосс
_takeprofit = CreateParameter("takeprpfit",1.81,1, 10, 0.1);
_stoploss = CreateParameter("stoploss",6.68,1,10, 0.1);
}
protected override void Execute()
{
//линия боллинджера
DataSeries BBUp = BBandUpper.Series( Close, _bbPeriod.ValueInt, _bbdev.ValueInt );
//скользящая средняя
DataSeries ma = EMAModern.Series(Close, _malength.ValueInt);//60
//индикатор roc
DataSeries roc = ROC.Series(Close,_roc.ValueInt);//2
//еще одна скользящая
DataSeries ma_1 = EMAModern.Series(Close, _malength1.ValueInt);//115
//Выводим графику ( BB,ROC)
PlotSeries(PricePane, BBUp, Color.Green, LineStyle.Solid, 2 );
ChartPane paneROC = CreatePane(75,true,true);
PlotSeries(paneROC,roc,Color.SlateGray,LineStyle.Histogram,20);
//Выводим графику (EMA)
PlotSeries(PricePane,ma,Color.Red,LineStyle.Solid,2);
PlotSeries(PricePane,ma_1,Color.Blue,LineStyle.Solid,2);
for(int bar = 114; bar < Bars.Count; bar++)
{
if (IsLastPositionActive)//если активна позиция
{
Position p = LastPosition;
//Выход из позиции
if (p.EntrySignal.Contains("Sell"))
{
//уровень стопа для продажи
double Stop = p.EntryPrice * (1 + _takeprofit.Value / 100);
//уровень тейка для продажи
double Target = p.EntryPrice * (1 - _stoploss.Value / 100);
//выход по условию верхней линии Боллинджера
if (CrossOver( bar, Close, BBUp ))
{
CoverAtMarket(bar + 1, p, "Exit_Sell_1");
}
//условие на выход по стоплоссу(заведомо знаем что на первом баре невозможно выйти без проскальзывания)
if(bar+1<Bars.Count&&Bars.Date[bar+1].TimeOfDay.Hours!=10)
{
CoverAtStop(bar + 1, p, Stop, "Exit_Sell_2");
}
else if(Close[bar]>Stop)//если это первый бар, то выходим по его закрытию
{
CoverAtClose(bar+1,p,"");
}
CoverAtLimit(bar+1, p, Target, "Exit_Sell_3");
}
else if (p.EntrySignal.Contains("Buy"))
{
if (CrossUnder(bar, Close, ma))
{
SellAtClose(bar + 1, p, "Exit_Buy");
}
}
}
else
{
//если значение Roc меньше нуля
if (roc[bar] < 0)
{
//при пересечении цены закрытия свечи и скользящей
if (CrossUnder(bar, Close, ma_1))
{
ShortAtMarket(bar + 1, "Sell");
}
}
//пересечение цены закрытия и линии боллинджера вверх
else if (CrossOver( bar, Close, BBUp ))
{
BuyAtMarket(bar + 1, "Buy");
}
}
}
}
}
}