Отличие реальной торговли от отладки на исторических данных

8/4/2010 4:48:14 PM
Gravatar
Total Posts 142

Отличие реальной торговли от отладки на исторических данных

1) Нужно ли что нибудь изменять в коде при переходе от режима отладки к режиму торговли в реальном времени?

2) Как можно в WealhLab задать размер позиции (Position size)?

3) Какой алгоритм запуска стратегии в реальном времени?

Достаточно просто скомпилировать(Compile) и запустить стратегию(Run strategy), а далее в дереве выбрать, например, какой то инструмент?

8/4/2010 11:35:39 PM
Gravatar
Total Posts 25

RE:Отличие реальной торговли от отладки на исторических данных

1) В коде необходимо отнаследовать класс исполняемой стратегии от класса WLRT.LiveTrading.WealthScript и заменить цикл по барам на торговлю на последнем баре:

[CODE]

namespace WealthLab.Strategies

{

public class MyStrategy : WLRT.LiveTrading.WealthScript//отнаследоваться от специального класса библиотеки WLRT

{

protected override void Execute()

{

int bar = Bars.Count - 1; //цикл по барам заменить на торговлю на последнем баре

if (IsLastPositionActive)

{

//code your exit rules here

}

else

{

//code your entry rules here

}

}

}

}[/CODE]

2) Размер позиции можно устанавливать либо непосредственно в коде стратегии методом SetShareSize (при этом в выпадающем списке Position Size должна быть выбрана опция WealthScript Override), либо с помощью PosiSizer'а (написанного самостоятельно или предустановленного).

3) Если связка QUIK и WLD уже настроена, то необходимо запустить WLD, выполнить минимальные изменения в коде стратегии (см. пункт 1), запустить загрузку потоковых данных нажатием кнопки "Stream" и автоторговлю кнопкой "Автоторговля".

11/22/2011 7:38:39 PM
Gravatar
Total Posts 27

RE:Отличие реальной торговли от отладки на исторических данных

..и ничего работать не будет. :( Все сделал, как вы написали, не пашет. Можно как-то по-подробнее. На живых примерах с коментариями. Заранее спасибо.

Например, переведите, пожалуйста, эту стратегию в реальную торговлю. Бьюсь уже неделю, не торгует и все тут.

[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]

11/23/2011 5:37:50 PM
Gravatar
Total Posts 115

RE:Отличие реальной торговли от отладки на исторических данных

Были внесены те изменения, о которых говорится выше. Заявки ставятся:

[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

///

public class RSIEMAParabolic:WLRT.LiveTrading.WealthScript

{

#region Объявление параметров торговой системы

#endregion

#region Инициализация параметров торговой системы

StrategyParameter _rsiPeriod;

StrategyParameter _rsiLevel;

StrategyParameter _emaPeriod;

StrategyParameter _pcPeriod;

StrategyParameter _parabolicStep;

StrategyParameter _parabolicMax;

public RSIEMAParabolic():base(true, false)

{

_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 = _emaPeriod.ValueInt + 1; // Первое значение свечки, при котором существуют все индикаторы

SetShareSize(300);

#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;

bool 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 < 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]

11/23/2011 6:47:10 PM
Gravatar
Total Posts 27

RE:Отличие реальной торговли от отладки на исторических данных

А разве на фьючерсах (RIZ1) можно входить "по рынку" ?

а стоп-заявки будут ставится?

11/23/2011 9:13:27 PM
Gravatar
Total Posts 115

RE:Отличие реальной торговли от отладки на исторических данных

Можно, в крайнем случае звоните в клиентский отдел.

И стоп заявки ставятся.