Стратегии и роботы > Стратегия Invest_Positive
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Стратегия Invest_Positive
в комментариях к правилам расписано (с включенным poor = 1)
// Правило 5: Закрытие докупленной части позиции при росте выше последней цены на deltaPrice
последняя цена - цена последней докупки или цена закрытия части позиции (докупки).
после чего последняя цена выставляется в правиле 5 на цену закрытия и следующее закрытие будет по цене выше на deltaPrice уже от неё.
// Правило 5: Закрытие докупленной части позиции при росте выше последней цены на deltaPrice
последняя цена - цена последней докупки или цена закрытия части позиции (докупки).
после чего последняя цена выставляется в правиле 5 на цену закрытия и следующее закрытие будет по цене выше на deltaPrice уже от неё.
никогда такого не было и вот опять
- ip851874
- Сообщения: 42
- Зарегистрирован: 21 ноя 2020, 22:56
- Откуда: Москва
- Благодарил (а): 14 раз
- Контактная информация:
Re: Стратегия Invest_Positive
evge писал(а):Если что-то не так, сообщайте, поправлю код.
Евгений, при старте робот несколько раз закупился выше текущей цены, при текущей цене в 71155 выставил стартовую заявку по 71208. По какой причине это может вознкать?
- ip851874
- Сообщения: 42
- Зарегистрирован: 21 ноя 2020, 22:56
- Откуда: Москва
- Благодарил (а): 14 раз
- Контактная информация:
Re: Стратегия Invest_Positive
evge писал(а):Модифицированный (предварительный) вариант на проверку.
Добавлен параметр QC, который задается в кол-ве шт для закрытия частями при движении к целевой цене. Дельту до максимальной цены рассчитывает автоматически, по тому же принципу что и докупку при падении.Код: Выделить всё
/**
Инвестиционная стратегия.
При старте покупает по текущим ценам начальный объем qStart.
Докупает на Q при снижении цены, не более позиции робота и не ниже порога (cmin).
Продает докупленное кол-во при росте цены выше цены начальной покупки.
Если Poor не равен 0, докупка закрывается частями по цене выше чем последняя цена на дельту.
Продает весь объем при росте цены выше целевой цены и останавливается
Algorithm = ИНВЕСТИЦИИ;**/
function Initialize()
{
StrategyName = "Invest_positive";
AddParameter("qStart", 1000, "Сколько купить при старте", 0);
AddParameter("cmax", 160, "Целевая цена", 0);
AddParameter("QC", 100, "Шаг закрытия позиции в штуках", 0);
AddParameter("cmin", 60, "Нижний порог покупки", 0);
AddParameter("Q", 100, "Шаг покупки в штуках", 0);
AddParameter("Poor", 0, "Закрывать докупки частями, если значение не 0", 0);
AddInput("Input1", Inputs.Candle, 1, true, "");
AddGlobalVariable("LastPrice", Types.Double, 100000000000);
AddGlobalVariable("LastPriceClose", Types.Double, 100000000000);
AddGlobalVariable("FirstPrice", Types.Double, 0);
AddGlobalVariable("DeltaPrice", Types.Double, 0);
AddGlobalVariable("DeltaPriceClose", Types.Double, 0);
}
function OnUpdate()
{
// В момент запуска покупаем qStart акций
// Основная прибыль: продаем qStart акций по цели (cmax)
// Дополнительно: ниже цены старта покупаем (но не ниже cmin), выше продаем
// evge 14.03.2019 https://alfadirect4.ru
// модификация стратегии с закрытием по частям при движении к целевой цене
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;
LastPriceClose = c;
FirstPrice = c;
// Расчитываем дельту цены для докупки
if (Q > 0 )
{
qStep = (LongLimit - qStart) / Q ;
DeltaPrice = (LastPrice - cmin) / qStep;
}
// Расчитываем дельту цены для закрытия позиции частями
if (QC > 0 )
{
qStep = qStart / QC ;
DeltaPriceClose = (cmax - LastPrice) / qStep;
}
}
// Правило 2: Закрытие всей позиции при достижении сmax
if ( c > cmax)
{
CloseLong();
//ShowMessage("Цена достигла цели, робот закрывает позицию и будет остановлен");
//Stop();
// Остановка робота
}
// Правило 2.1: закрытие позиции частями
if ( c > LastPriceClose + DeltaPriceClose && c < cmax )
{
CloseLong(QC);
LastPriceClose = c;
}
// Правило 2.2: повторный старт
if ( pos < qStart && c <= FirstPrice)
{
EnterLong(qStart - pos);
LastPrice = c;
LastPriceClose = c;
//FirstPrice = c;
}
// Правило 3: Добавление к позиции при падении
if ( c < LastPrice - DeltaPrice && c > cmin )
{
EnterLong(Q);
LastPrice = c;
}
// Правило 4: Продажа докупки росте цены выше стартовой цены
if ( c > FirstPrice && pos > qStart)
{
CloseLong(pos - qStart);
LastPrice = c;
}
// Правило 5: Закрытие докупленной части позиции при росте выше последней цены на deltaPrice
if ( Poor != 0 && c > LastPrice + DeltaPrice && pos > qStart)
{
CloseLong(Q);
LastPrice = c;
}
}
пример работы и параметры тестирования на таймфрейме M5:
Invest-positive-mod-01.png
Invest-positive-mod-02.png
Помогите пожалуйста еще добавить точку входа для закупки стартовой позиции в модифицированной версии
-
- Сообщения: 3
- Зарегистрирован: 20 дек 2022, 15:16
- Поблагодарили: 1 раз
Re: Стратегия Invest_Positive
Приветствую всех! Евгений, подскажите, пожалуйста, что делаю не так: скачал архив инвест_позитив/негатив, запустил роботов в режиме советника. роботы, проработав примерно час, так и не открыли стартовую сделку. Что-то с терминалом?
- ip851874
- Сообщения: 42
- Зарегистрирован: 21 ноя 2020, 22:56
- Откуда: Москва
- Благодарил (а): 14 раз
- Контактная информация:
Re: Стратегия Invest_Positive
Код: Выделить всё
function Initialize()
{
StrategyName = "Invest Pozitiv";
AddParameter("OnPrice", 250, "Стартовая цена (начать торговлю при пересечении цены)", 0);
AddParameter("qStart", 1000, "Сколько купить при старте", 0);
AddParameter("cmax", 160, "Целевая цена", 0);
AddParameter("cmin", 60, "Нижний порог покупки", 0);
AddParameter("Q", 10, "Шаг покупки в штуках", 0);
AddParameter("Poor", 0, "Закрывать докупки частями, если значение не 0", 0);
AddInput("Input1", Inputs.Candle, 1, true, "");
AddGlobalVariable("LastPrice", Types.Double, 100000000000);
AddGlobalVariable("FirstPrice", Types.Double, 0);
AddGlobalVariable("DeltaPrice", Types.Double, 0);
AddGlobalVariable("Started", Types.Boolean, false);
}
Код: Выделить всё
function OnUpdate()
{
// В момент запуска покупаем qStart акций
// Основная прибыль: продаем qStart акций по цели (cmax)
// Дополнительна: ниже цены старта покупаем (но не ниже cmin), выше продаем
double c = Input1.Close[0];
double pos = CurrentPosition();
double qStep;
// Правило 1: Открытие позиции на начальный объем
// и расчет DeltaPrice
if (!Started) Started = (Input1.Close[0] <= OnPrice && Input1.Close[1] > OnPrice) || (Input1.Close[0] >= OnPrice && Input1.Close[1] < OnPrice);
if (!Started) return;
if ( (LastPrice == 100000000000) )
{
- ip851874
- Сообщения: 42
- Зарегистрирован: 21 ноя 2020, 22:56
- Откуда: Москва
- Благодарил (а): 14 раз
- Контактная информация:
Re: Стратегия Invest_Positive
evge писал(а):в комментариях к правилам расписано (с включенным poor = 1)
// Правило 5: Закрытие докупленной части позиции при росте выше последней цены на deltaPrice
последняя цена - цена последней докупки или цена закрытия части позиции (докупки).
после чего последняя цена выставляется в правиле 5 на цену закрытия и следующее закрытие будет по цене выше на deltaPrice уже от неё.
Подскажите как добавить вход по сигналу только один раз при старте и до полного выполнения сценария и остановки робота, например по пересечению МА, попробовал, но он входит каждый раз по пересечению.
Код: Выделить всё
function Initialize()
{
StrategyName = "MyMTS2";
AddParameter("Pfast", 3, "быстрая ema", 1);
AddParameter("Pslow", 185, "медленная sma", 0);
LongLimit = 0;
AddChartIndicator("EMA", new Dictionary <string, string>{{"Period", "Pfast"}});
AddChartIndicator("SMA", new Dictionary <string, string>{{"Period", "Pslow"}});
AddParameter("qStart", 1000, "Сколько купить при старте", 0);
AddParameter("cmax", 160, "Целевая цена", 0);
AddParameter("cmin", 60, "Нижний порог покупки", 0);
AddParameter("Q", 10, "Шаг покупки в штуках", 0);
AddParameter("Poor", 0, "Закрывать докупки частями, если значение не 0", 0);
AddInput("Input1", Inputs.Candle, 1, true, "");
AddGlobalVariable("LastPrice", Types.Double, 100000000000);
AddGlobalVariable("FirstPrice", Types.Double, 0);
AddGlobalVariable("DeltaPrice", Types.Double, 0);
AddGlobalVariable("Started", Types.Boolean, false);
}
function OnUpdate()
{
// В момент запуска покупаем qStart акций
// Основная прибыль: продаем qStart акций по цели (cmax)
// Дополнительна: ниже цены старта покупаем (но не ниже cmin), выше продаем
double c = Input1.Close[0];
double pos = CurrentPosition();
double qStep;
// Правило 1: Открытие позиции на начальный объем
// и расчет DeltaPrice когда будет сигнал на пересечение
if ( (EMA(Input1.Close, Pfast) > SMA(Input1.Close, Pslow)) && (Pfast < Pslow) )
{
EnterLong();
}
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;
}
// Правило 5: Закрытие докупленной части позиции при росте выше последней цены на deltaPrice
if ( Poor != 0 && c > LastPrice + DeltaPrice && pos > qStart)
{
CloseLong(Q);
LastPrice = c;
}
}
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Стратегия Invest_Positive
условие перенесите, добавив его сюда
Код: Выделить всё
// Открываем позицию, если стартовое кол-во больше 0
if (qStart > 0)
никогда такого не было и вот опять
- ip851874
- Сообщения: 42
- Зарегистрирован: 21 ноя 2020, 22:56
- Откуда: Москва
- Благодарил (а): 14 раз
- Контактная информация:
Re: Стратегия Invest_Positive
evge писал(а):условие перенесите, добавив его сюдаКод: Выделить всё
// Открываем позицию, если стартовое кол-во больше 0
if (qStart > 0)
Спасибо!
- ip851874
- Сообщения: 42
- Зарегистрирован: 21 ноя 2020, 22:56
- Откуда: Москва
- Благодарил (а): 14 раз
- Контактная информация:
Re: Стратегия Invest_Positive
evge писал(а):условие перенесите, добавив его сюдаКод: Выделить всё
// Открываем позицию, если стартовое кол-во больше 0
if (qStart > 0)
Евгений , благодарю за своевременную помощь!
Хочу вернутся к идее входа по цене и повторять закрытую сделку при повторном касании цены. Хочется вывести это в настройки как вы делали по частичной распродаже. Повторять сделку (Если значение не 0)
Вернуться в «Стратегии и роботы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей