Не используется цикл, применены глоб. переменные для хранения индекса последнего пересечения.
И анализируется разница текущего индекса с индексом в глоб. переменной.
Результат работы второго примера тот же, разве что первая сделка может быть во втором примере открыта раньше, но в моем тесте результат был одинаковый.
Код: Выделить всё
function Initialize()
{
StrategyName = "EMAEMA2";
AddParameter("P1", 21, "slow preiod EMA", 1);
AddParameter("P2", 8, "fast period EMA", 1);
AddParameter("PN", 10, "period scan", 1);
AddInput("Input1", Inputs.Candle, 1, true, "");
LongLimit = 1;
ShortLimit = -1;
AddGlobalVariable("icU", Types.Int, 0);
AddGlobalVariable("icD", Types.Int, 0);
}
function OnUpdate()
{
var I = Input1;
var E1 = EMA(I, P1);
var E2 = EMA(I, P2);
// cU - было пересечение вверх за PN баров, cD - было пересечение вниз за PN баров
bool
cU = (CurrentIndex - icU) < PN,
cD = (CurrentIndex - icD) < PN;
// isUp - на текущем баре пересекли вверх, isDn - на текущем баре пересекли вниз
bool isUp = E2[0] > E1[0] && E2[1] < E1[1];
bool isDn = E2[0] < E1[0] && E2[1] > E1[1];
// Запоминаем индекс бара в гл. перем. при пересечении вверх / вниз
if (isUp) icU = CurrentIndex;
if (isDn) icD = CurrentIndex;
// если на текущем баре пересекли вверх и не было пересечений вниз за PN баров
if (isUp && !cD) EnterLong();
// если на текущем баре пересекли вниз и не было пересечений вверх за PN баров
if (isDn && !cU) EnterShort();
}