Ипонамама писал(а):программный стоп и по-моему трейлинг стоп
Ипонамама писал(а):помогите написать
Это не проблема. Просто код будет уже открыт, в конструктор уже такой код не вернешь и все манипуляции с кодом только в исходнике.
Написал. Есть ньюансы:
- стоплосс задается в шагах цены
- после срабатывания стоплосса позиция в том же направлении не переоткрывается и ожидается сигнал в другую сторону
Провел оптимизацию и тестирование для SBER 1H (см. ниже) на 2000 баров, для других ТФ нужно смотреть

Вообщем вот код
Код: Выделить всё
/**Стратегия основана на определении моментов пересечения быстрой экспоненциальной скользящей средней и медленной экспоненциальной скользящей средней (система "ES"). Особенности:
- сигнал на покупку выдается, если быстрая EMA пересекает медленную SMA снизу вверх;
- сигнал на продажу выдается, если быстрая EMA пересекает медленную SMA сверху вниз;
- при тестировании цена сделки фиксируется как цена закрытия бара, на котором появился сигнал.
- в роботе заявка выставляется после закрытия бара, на котором появился сигнал.
- стоплосс задается в шагах цены
- после срабатывания стоплосса позиция в том же направлении не переоткрывается и ожидается сигнал в другую сторону
Developed by evge;
Algorithm = ТРЕНД;**/
function Initialize()
{
StrategyName = "evge_ES_TRS";
AddParameter("Pfast", 3, "", 1);
AddParameter("Pslow", 75, "", 0);
AddParameter("TRS", 0.5, "", 0); //трейлинг стоп в шагах цены
AddInput("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
LongLimit = 0;
ShortLimit = 0;
AddGlobalVariable("StopLoss", Types.Double, 0.0); //StopLoss цена
AddGlobalVariable("P", Types.Int, 0); //позиция 0 - нет, 1 - long, 2 - short
AddGlobalVariable("NP", Types.Int, 0); //запрет открытия позиции 0 - нет запрета, 1 - long, 2 - short
}
function OnUpdate()
{
// Определяем стоп
if (CurrentPosition() > 0 && P != 1) { P = 1; StopLoss = 0; }
if (CurrentPosition() < 0 && P != 2) { P = 2; StopLoss = 0; }
if (CurrentPosition() == 0) P = 0;
if (P == 1 && ((Input1.Close[0] - TRS) > StopLoss || StopLoss == 0)) StopLoss = Input1.Close[0] - TRS;
if (P == 2 && ((Input1.Close[0] + TRS) < StopLoss || StopLoss == 0)) StopLoss = Input1.Close[0] + TRS;
//
/// ПРАВИЛО 1
if ( NP != 1 && (EMA(Input1.Close, Pfast) > SMA(Input1.Close, Pslow)) )
{
NP = 1;
EnterLong();
}
else
/// ПРАВИЛО 2
if ( NP != 2 && (EMA(Input1.Close, Pfast) < SMA(Input1.Close, Pslow)) )
{
NP = 2;
EnterShort();
}
else
// закрываем Long по StopLoss
if ( (P == 1) && (Input1.Close[0] < StopLoss)) {
CloseLong();
}
else
// закрываем Short по StopLoss
if ( (P == 2) && (Input1.Close[0] > StopLoss)) {
CloseShort();
}
}