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

, заменив код её с нуля написанным простым алгоритмом, который и выкладываю.
Тут всё просто и понятно. Работает как в лонг так и в шорт, для примера взяты 2 SMA быстрая и медленная.
Всё как обычно, в лонг заходим и набираем позицию на откатах указанных в параметре D
Закрывать позицию и переворачиваться начинает когда MA пересекутся в другую сторону, сначала на откатах будет закрываться ранее открытая позиция, затем начнет набирать позицию в другую сторону.
			
		
				
			 
- iGrid1-01.png (31.15 КБ) 82991 просмотр
 
			
		
				
			 
- iGrid1-02.png (35.19 КБ) 82991 просмотр
 В итоге простой и понятный код:
Код: Выделить всё
/**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;
}