Приветствую!
Реализовать это очень легко, для этого есть функции:
CurrentPL() – возвращает текущий доход по открытой позиции в валюте инструмента (рубли или пункты).
CurrentPLper() – возвращает изменение цены в процентах относительно учетной цены по открытой позиции в процентах.
Если нужна разница в пунктах от средней цены до текущей, то это тоже можно узнать через
Input1.Close[0] - цена последнего закрытия доступная нам в момент принятия решения (хотя если быть точнее момент этот это первая сделка на следующем баре)
AverPrice() – возвращает учетную цену открытой позиции
Учетная цена – средневзвешенная цена сделок, которые увеличивают текущую открытую позицию по роботу
Вычисляем разницу Math.Abs(AverPrice() - Input1.Close[0]) и принимаем решение
NIKON писал(а):Если они отличаются менее, чем на заданную величину (например, в процентах), то отказаться от закрытия и дождаться следующего момента
Момент может не наступить и придётся закрывать по цене хуже чем была возможность.
Опишите подробнее что вы хотите получить в условие на выходе, покажу как это сделать на примере этой стратегии.
По тому что описали выше код может быть таким:
Код: Выделить всё
/**
**/
function Initialize()
{
StrategyName = "VStop";
AddParameter("Length", 20, "", 1);
AddParameter("Mult", 2, "", 1);
AddParameter("Period", 1, "", 1);
AddParameter("SL", 2, "StopLoss %", 1);
AddParameter("TP", 4, "TakeProfit %", 1);
AddInput("I", Inputs.Candle, 60, true, "");
LongLimit = 1000;
ShortLimit = -1000;
AddChartIndicator("MY.VStop", new Dictionary <string, string>{{"length", "Length"},{"mult", "Mult"},{"period", "Period"},{"O", "0"},{"H", "0"},{"L", "0"},{"C", "1"}});
}
function OnUpdate()
{
// evge 22.07.2018 http://alfadirect4.ru
var VS = MY.VStop(I, Length, Mult, Period, 0, 0, 0, 1);
var VSUp = VS["Up"];
var VSDn = VS["Dn"];
if (VSUp[0] > 0 && VSDn[1] > 0)
if (CurrentPLper() >= TP || CurrentPosition() == 0)
{
EnterLong();
StopLoss(SL, SignalPriceType.DeltaInPercentFromAveragePrice);
}
if (VSDn[0] > 0 && VSUp[1] > 0)
if (CurrentPLper() >= TP || CurrentPosition() == 0)
{
EnterShort();
StopLoss(SL, SignalPriceType.DeltaInPercentFromAveragePrice);
}
}
Здесь переворот будет только если по открытой позиции % изменения цены выше или равен параметру TP в %