Эксперименты привели к тому что стратегию Invest_Grid работающую как в лонг так и в шорт с горяча удалил

, заменив код её с нуля написанным простым алгоритмом, который и выкладываю.
Тут всё просто и понятно. Работает как в лонг так и в шорт, для примера взяты 2 SMA быстрая и медленная.
Всё как обычно, в лонг заходим и набираем позицию на откатах указанных в параметре D
Закрывать позицию и переворачиваться начинает когда MA пересекутся в другую сторону, сначала на откатах будет закрываться ранее открытая позиция, затем начнет набирать позицию в другую сторону.

- iGrid1-01.png (31.15 КБ) 71854 просмотра

- iGrid1-02.png (35.19 КБ) 71854 просмотра
В итоге простой и понятный код:
Код: Выделить всё
/**Developed by evge;**/
function Initialize()
{
StrategyName = "iGrid1";
AddInput("I", Inputs.Candle, 5, true, "SBER=МБ ЦК");
AddParameter("Lot", 100, "Кол-во докупки");
AddParameter("D", 0.3, "Изм. цены для докупки");
AddParameter("f", 20, "fast", 1);
AddParameter("s", 180, "slow", 1);
LongLimit = 5000;
ShortLimit = -5000;
AddGlobalVariable("Last", Types.Double, 0.0);
AddGlobalVariable("isLong", Types.Boolean, false);
}
function OnUpdate()
{
var IC = I.Close;
var CP = CurrentPosition();
// + Опередляем общее направление торговли
var S1 = SMA(I.Close, f);
var S2 = SMA(I.Close, s);
if (S1[0] > S2[0])
isLong = true;
else
isLong = false;
// -
if (Last == 0) Last = IC;
if (isLong && IC < Last - D)
{
if (CP >= 0)
EnterLong(Lot);
else
CloseShort(Lot);
}
else if (!isLong && IC > Last + D)
{
if (CP <= 0)
EnterShort(Lot);
else
CloseLong(Lot);
}
if (IC > Last + D) Last = IC;
if (IC < Last - D) Last = IC;
}