..и ничего работать не будет. :( Все сделал, как вы написали, не пашет. Можно как-то по-подробнее. На живых примерах с коментариями. Заранее спасибо.
Например, переведите, пожалуйста, эту стратегию в реальную торговлю. Бьюсь уже неделю, не торгует и все тут.
[CODE]
// _rsiLevel = CreateParameter("RSI Level", 15, 5, 40, 5);
// _emaPeriod = CreateParameter("EMA", 38, 2, 50, 2);
// _pcPeriod = CreateParameter("Price Channel", 4, 2, 10, 2);
// _parabolicStep = CreateParameter("Parabolic Step", 0.017, 0.015, 0.025, 0.001);
// _parabolicMax = CreateParameter("Parabolic Max", 0.2, 0.18, 0.23, 0.01);
//
//
// Эта ТС сгенерирована для Wealth-Lab Developer 6 из CodeSmith Generator
// Автор: Чечет Игорь Александрович http://ichechet.livejournal.com
// Версия шаблона: 1.0
// Генератор сигналов на вход: RSI
// Направление следования сигналам: Forward
// Фильтр тренда: None
// Фильтр флета: None
// Временной фильтр: None
// Технология выхода: TrailingStopParabolic
using System;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
namespace IgorChechet.Strategies
{
///
/// Вход по RSI/EMA, выход по Parabolic
///
class RSIEMAParabolic : WealthScript
{
#region Объявление параметров торговой системы
#endregion
#region Инициализация параметров торговой системы
StrategyParameter _rsiPeriod;
StrategyParameter _rsiLevel;
StrategyParameter _emaPeriod;
StrategyParameter _pcPeriod;
StrategyParameter _parabolicStep;
StrategyParameter _parabolicMax;
public RSIEMAParabolic()
{
_rsiPeriod = CreateParameter("RSI", 3, 3, 21, 1);
_rsiLevel = CreateParameter("RSI Level", 15, 5, 40, 5);
_emaPeriod = CreateParameter("EMA", 38, 2, 50, 2);
_pcPeriod = CreateParameter("Price Channel", 4, 2, 10, 2);
_parabolicStep = CreateParameter("Parabolic Step", 0.017, 0.015, 0.025, 0.001);
_parabolicMax = CreateParameter("Parabolic Max", 0.2, 0.18, 0.23, 0.01);
}
#endregion
protected override void Execute()
{
int firstValidValue = 0; // Первое значение свечки, при котором существуют все индикаторы
#region Индикаторы
// RSI
int rsiPeriod = _rsiPeriod.ValueInt;
int overBought = 100 - _rsiLevel.ValueInt; // Уровень перекупленности
int overSold = _rsiLevel.ValueInt; // Уровень перепроданности
DataSeries rsiSeries = RSI.Series(Bars.Close, rsiPeriod);
ChartPane rsiPane = CreatePane(20, false, true); // Область для отрисовки RSI высотой 20%, ниже графика, с сеткой
PlotSeries(rsiPane, rsiSeries, Color.Red, LineStyle.Solid, 1);
DrawHorzLine(rsiPane, overBought, Color.Blue, LineStyle.Solid, 1);
DrawHorzLine(rsiPane, overSold, Color.Blue, LineStyle.Solid, 1);
firstValidValue = Math.Max(firstValidValue, rsiSeries.FirstValidValue * 2);
// EMA
int emaPeriod = _emaPeriod.ValueInt;
DataSeries emaSeries = EMA.Series(Bars.Close, emaPeriod, EMACalculation.Modern);
PlotSeries(PricePane, emaSeries, Color.Red, LineStyle.Solid, 1);
firstValidValue = Math.Max(firstValidValue, emaSeries.FirstValidValue);
// Price Channel
int pcPeriod = _pcPeriod.ValueInt;
DataSeries pcHigh = Highest.Series(Bars.High, pcPeriod);
DataSeries pcLow = Lowest.Series(Bars.Low, pcPeriod);
#endregion
#region Переменные для обслуживания позиции
bool signalBuy = false, signalShort = false; // Сигналы на вход в длинную и короткую позиции
// Parabolic
double acclUpDown = _parabolicStep.Value; // Минимальное значение шага
double acclMaxStep = _parabolicMax.Value; // Максимальное значение шага
double accl = 0; // Текущее значение шага
double ext = 0; // Уровень, от которого откладывать следующее значение Parabolic
double orderTrailingStop = 0; // Ордер T/S
#endregion
#region Представление цен с необходимой разрядностью для отображения ордеров
string PricePattern = "0.";
for (int i = 0; i < this.Bars.SymbolInfo.Decimals; i++)
PricePattern += "0";
#endregion
PlotStops(); // Отображать уровни, на которых были попытки выхода по S/L
HideVolume();
for (int bar = firstValidValue; bar < Bars.Count; bar++) // Пробегаемся по всем свечкам
{
#region Сигналы на вход в позицию и выход из нее
signalBuy = CrossOver(bar, rsiSeries, overBought); // Пересечение RSI уровня перекупленности снизу вверх
signalBuy &= Close[bar] > emaSeries[bar]; // и закрытие выше EMA
signalShort = CrossUnder(bar, rsiSeries, overSold); // Пересечение RSI уровня перепроданности сверху вниз
signalShort &= Close[bar] < emaSeries[bar]; // и закрытие ниже EMA
#endregion
#region Сопровождение и выход из позиции по Trailing Stop Parabolic
if (!IsLastPositionActive) // Если позиции нет
{
if (signalBuy) // При получении сигнала на вход в длинную позицию
{
BuyAtMarket(bar + 1, "Buy");
orderTrailingStop = pcLow[bar];
accl = acclUpDown;
ext = Bars.High[bar];
AnnotateBar(orderTrailingStop.ToString(PricePattern), bar, true, Color.Blue, Color.Yellow);
}
else if (signalShort) // При получении сигнала на вход в короткую позицию
{
ShortAtMarket(bar + 1, "Short");
orderTrailingStop = pcHigh[bar];
accl = acclUpDown;
ext = Bars.Low[bar];
AnnotateBar(orderTrailingStop.ToString(PricePattern), bar, true, Color.Blue, Color.Yellow);
}
}
else // Если позиция есть
{
PrintDebug (orderTrailingStop);
if (LastActivePosition.PositionType == PositionType.Long) // Для длинной позиции
{
SellAtStop(bar+1, LastActivePosition, orderTrailingStop, "Sell Stop"); // Попробовать выйти по T/S
if (Bars.High[bar] > Bars.High[bar - 1])
{
ext = Bars.High[bar];
if (accl + acclUpDown > acclMaxStep)
accl = acclMaxStep;
else
accl += acclUpDown;
}
}
else // Для короткой позиции
{
CoverAtStop(bar+1, LastActivePosition, orderTrailingStop, "Cover Stop"); // Попробовать выйти по T/S
if (Bars.Low[bar] < Bars.Low[bar - 1])
{
ext = Bars.Low[bar];
if (accl + acclUpDown > acclMaxStep)
accl = acclMaxStep;
else
accl += acclUpDown;
}
}
orderTrailingStop += accl * (ext - orderTrailingStop);
}
#endregion
}
}
}
}
[/CODE]