Код: Выделить всё
/**E_MARTIN
Developed by evge;
Algorithm = Усреднение;**/
function Initialize()
{
StrategyName = "E_MARTIN";
AddParameter("StartPos", 100, "", 1);
AddParameter("TP", 0.1, "", 1);
AddParameter("SL", -10, "", 1);
AddParameter("PeriodSMA", 13, "", 1);
AddParameter("PeriodEMA", 8, "", 1);
AddInput("Input1", Inputs.Candle, 5, true, "SBER=МБ ЦК");
LongLimit = 1000;
ShortLimit = -1000;
AddGlobalVariable("Dir", Types.Int, 0); // Текущее направление
}
function OnUpdate()
{
// пример стратегии с усреднением
// evge 01.03.2017 http://alfadirect4.ru
var S = SMA(Input1.Close, PeriodSMA);
var E = EMA(Input1.Close, PeriodEMA);
var Pos = CurrentPosition();
var Lot = (Pos == 0) ? (int)StartPos : Math.Abs(Pos);
// Условие входа в лонг
var isLong = E[1] < S[1] && E[0] > S[0] && Dir >= 0;
// Условие входа в шорт
var isShort = E[1] > S[1] && E[0] < S[0] && Dir <= 0;
if (isLong) Dir = 1;
if (isShort) Dir = -1;
// Вход
if (Pos == 0)
{
if ( isLong )
{
EnterLong(Lot);
}
else
if ( isShort )
{
EnterShort(Lot);
}
}
// Усреднение
if ( Pos != 0 && CurrentPLper() < 0 )
{
if ( isLong && Pos > 0 )
{
EnterLong(Lot);
}
else
if ( isShort && Pos < 0 )
{
EnterShort(Lot);
}
}
// Выход по Take
if ( (CurrentPLper() > TP) )
{
ClosePosition();
Dir = 0;
}
// Стоп :(
if ( (CurrentPLper() < SL) )
{
ClosePosition();
Dir = 0;
}
}
Скачать код
Данный пример каждый следующий лот входа при убытке ставит равным по размеру текущей открытой позиции, т.е. это мартингейл (1, 2, 4, 8, 16, 32, 64....)
Если нужно просто усреднение, то нужно
Код: Выделить всё
var Lot = (Pos == 0) ? (int)StartPos : Math.Abs(Pos);
заменить на
Код: Выделить всё
var Lot = (int)StartPos;