
Идея данной стратегии наглядно отображена на картинке с вебинара. Если можно, то сделайте сразу два варианта - для работы в Лонг, и для работы в Шорт.
Заранее благодарен!
evge писал(а):Приветствую! Ок, займусь в ближайшее время. Скорее всего, за выходные посмотрю.
Код: Выделить всё
/**
Инвестиционная стратегия.
При старте покупает по текущим ценам начальный объем qStart.
Докупает на Q при снижении цены, не более позиции робота и не ниже порога (cmin).
Продает докупленное кол-во при росте цены выше цены начальной покупки.
Продает весь объем при росте цены выше целевой цены и останавливается
Algorithm = ИНВЕСТИЦИИ;**/
function Initialize()
{
StrategyName = "Invest_positive";
AddParameter("qStart", 1000, "Сколько купить при старте", 0);
AddParameter("cmax", 160, "Целевая цена", 0);
AddParameter("cmin", 60, "Нижний порог покупки", 0);
AddParameter("Q", 10, "Шаг покупки в штуках", 0);
AddInput("Input1", Inputs.Candle, 1, true, "");
AddGlobalVariable("LastPrice", Types.Double, 100000000000);
AddGlobalVariable("FirstPrice", Types.Double, 0);
AddGlobalVariable("DeltaPrice", Types.Double, 0);
}
function OnUpdate()
{
// В момент запуска покупаем qStart акций
// Основная прибыль: продаем qStart акций по цели (cmax)
// Дополнительна: ниже цены старта покупаем (но не ниже cmin), выше продаем
double c = Input1.Close[0];
double pos = CurrentPosition();
double qStep;
// Правило 1: Открытие позиции на начальный объем
// и расчет DeltaPrice
if ( (LastPrice == 100000000000) )
{
// Проверки
if (Q <= 0)
{
ShowMessage("Не задано Q - шаг количества");
Stop();
}
if ( cmin >= cmax )
{
ShowMessage("cmin больше, чем cmax ");
Stop();
}
// Открываем позицию, если стартовое кол-во больше 0
if (qStart > 0)
EnterLong(qStart);
LastPrice = c;
FirstPrice = c;
// Расчитываем дельту цены для докупки
if (Q > 0 )
{
qStep = (LongLimit - qStart) / Q ;
DeltaPrice = (LastPrice - cmin) / qStep;
}
}
// Правило 2: Закрытие всей позиции при достижении сmax
if ( c > cmax)
{
CloseLong();
ShowMessage("Цена достигла цели, робот закрывает позицию и будет остановлен");
Stop();
// Остановка робота
}
// Правило 3: Добавление к позиции при падении
if ( c < LastPrice - DeltaPrice && c > cmin )
{
EnterLong(Q);
LastPrice = c;
}
// Правило 4: Продажа кусочка от позиции при падении
if ( c > FirstPrice && pos > qStart)
{
CloseLong(pos - qStart);
LastPrice = c;
}
}
oxi писал(а):Стратегия простая.
Ее можно даже не переделывать под списки
evge писал(а):Ура! В выходные отдыхаем!
Simonov писал(а):Евгений Алексеевич, если не сильно затруднит, помогите переделать код от Дмитрия для работы в Шорт, пожалуйста!
Код: Выделить всё
/**
"Инвестиционная" стратегия.
При старте продает по текущим ценам начальный объем qStart.
Допродает на Q при росте цены, не более позиции робота и не выше порога (cmax).
Покупает допроданное кол-во при падении цены ниже цены начальной продажи.
Покупает весь объем при падении цены ниже целевой цены и останавливается
Algorithm = ИНВЕСТИЦИИ;**/
function Initialize()
{
StrategyName = "Invest_negative";
AddParameter("qStart", 1000, "Сколько продать при старте", 0);
AddParameter("cmin", 140, "Целевая цена", 0);
AddParameter("cmax", 180, "Верхний порог продажи", 0);
AddParameter("Q", 10, "Шаг продажи в штуках", 0);
AddInput("Input1", Inputs.Candle, 1, true, "");
AddGlobalVariable("LastPrice", Types.Double, 100000000000);
AddGlobalVariable("FirstPrice", Types.Double, 0);
AddGlobalVariable("DeltaPrice", Types.Double, 0);
}
function OnUpdate()
{
// В момент запуска продаем qStart
// Основная прибыль: покупаем qStart по цели (cmin)
// Дополнительна: выше цены старта продаем (но не выше cmax), ниже покупаем
double c = Input1.Close[0];
double pos = CurrentPosition();
double qStep;
// Правило 1: Открытие позиции на начальный объем
// и расчет DeltaPrice
if ( (LastPrice == 100000000000) )
{
// Проверки
if (Q <= 0)
{
ShowMessage("Не задано Q - шаг количества");
Stop();
}
if ( cmin >= cmax )
{
ShowMessage("cmin больше, чем cmax ");
Stop();
}
// Открываем позицию, если стартовое кол-во больше 0
if (qStart > 0)
EnterShort(qStart);
LastPrice = c;
FirstPrice = c;
// Расчитываем дельту цены для докупки
if (Q > 0 )
{
qStep = (Math.Abs(ShortLimit) - qStart) / Q ;
DeltaPrice = (cmax - LastPrice) / qStep;
}
}
// Правило 2: Закрытие всей позиции при достижении сmin
if ( c < cmin)
{
CloseShort();
ShowMessage("Цена достигла цели, робот закрывает позицию и будет остановлен");
Stop();
// Остановка робота
}
// Правило 3: Добавление к позиции при росте
if ( c > LastPrice + DeltaPrice && c < cmax )
{
EnterShort(Q);
LastPrice = c;
}
// Правило 4: Закрытие допроданной части позиции при падении ниже цены стартовой продажи
if ( c < FirstPrice && -pos > qStart)
{
CloseShort(-pos - qStart);
LastPrice = c;
}
}
Вернуться в «Стратегии и роботы»
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 17 гостей