avatar
пашет уже на реале. лучший стресс-тест))
avatar
там сложная система, входы и выходы по частям на разных таймфреймах плюс хеджирование.
грубо говоря, в общей сложности это 8 отдельных оптимизированных алгоритма, работающих одновременно. идея состояла в диверсификации и сложения работы нескольких систем с положительным матожиданием.
avatar
ну да, я об этом же и писал, он наращивал шорты
avatar
ага, видел. красивый такой
avatar
кстати, заявку убрали через некоторое время.
попугали и ушли. а может, позу набирали
avatar
достаточно большое количество сделок и поведение при вчерашних движениях фунта уже позволяют сделать некоторые выводы
avatar
естественно. все только начинается)
avatar
Код в самом конце статьи.
Копирую:
using System;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
using WealthLab.Properties;
using System.Drawing;
namespace WealthLab.Strategies
{
public class FirstStrategy: WealthScript
{
StrategyParameter paramMA;
StrategyParameter paramTime;
StrategyParameter paramTimeShort;
StrategyParameter paramRisk;
StrategyParameter paramRiskS;
public FirstStrategy()
{
paramMA = CreateParameter(«MA», 1, 1, 500, 10);
paramTime = CreateParameter(«Время», 12, 10, 19, 1);
paramTimeShort = CreateParameter(«Время_S», 11, 10, 19, 1);
paramRisk = CreateParameter(«Риск лонг», 0.2, 0.2, 1, 0.1);
paramRiskS = CreateParameter(«Риск шорт», 0.2, 0.2, 1, 0.1);
}
protected override void Execute()
{
DataSeries ma = SMA.Series(Open, paramMA.ValueInt);
PlotSeries (PricePane, SMA.Series(Open, paramMA.ValueInt), Color.Blue, LineStyle.Solid, 2);
double sp = 0;
double stop = 0;
PlotStops();
for(int bar = 1; bar < Bars.Count — 1; bar++)
{
if (Bars.IntradayBarNumber(bar) == 0)
{
sp = Bars.Open[bar];
}
\
if (IsLastPositionActive)
{
Position p = LastPosition;
if (p.PositionType == PositionType.Short)
{
if (!CoverAtStop(bar, p, stop))
{
if (Bars.IsLastBarOfDay(bar))
{
CoverAtMarket(bar, p);
}
}
}
else //Long
{
if (!SellAtStop(bar, p, stop))
{
if (Bars.IsLastBarOfDay(bar))
{
SellAtMarket(bar, p);
}
}
}
}
else
{
double high = Bars.High[bar];
double low = Bars.Low[bar];
if (!Bars.IsLastBarOfDay(bar) && high < sp)
{
if (Bars.Open[bar — 1] < Bars.Close[bar — 1] && Bars.Open[bar — 1] > Bars.Close[bar] &&
Bars.Date[bar + 1].Hour < paramTimeShort.ValueInt && Close[bar] < ma[bar] )
{
stop = Math.Max(Bars.High[bar], Bars.High[bar — 1]);
double openPrice = Bars.Open[bar + 1];
double exitPrice = stop;
if (openPrice / exitPrice > 1 — paramRiskS.Value / 100)
{
RiskStopLevel = stop;
ShortAtMarket(bar + 1);
}
else
{
stop = openPrice / (1 — paramRiskS.Value / 100);
RiskStopLevel = stop;
ShortAtMarket(bar + 1);
}
}
}
if (!Bars.IsLastBarOfDay(bar) && low > sp)
{
if (Bars.Open[bar — 1] > Bars.Close[bar — 1] && Bars.Open[bar — 1] < Bars.Close[bar] &&
Bars.Date[bar + 1].Hour < paramTime.ValueInt && Close[bar] > ma[bar] )
{
stop = Math.Min(Bars.Low[bar], Bars.Low[bar — 1]);
double openPrice = Bars.Open[bar + 1];
double exitPrice = stop;
if (exitPrice / openPrice > 1 — paramRisk.Value / 100)
{
RiskStopLevel = stop;
BuyAtMarket(bar + 1);
}
else
{
stop = (1 — paramRisk.Value / 100) * openPrice;
RiskStopLevel = stop;
BuyAtMarket(bar + 1);
}
}
}
}
}
}
}
}
avatar
на самом деле, это вчерашние сделки.
у них там сбой какой-то случился, и вчерашние сделки попали в сегодняшние.
мораль: нефига по воскресеньям работать)