Стратегии и роботы > Усреднение!
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Усреднение!
так и есть, при откатах он добирает, смотрите сигналы (колонку позиция).
Но так как сейчас появилась зависимость от MA, то чаще откаты превращаются не в добор позиции, а в переворот. Поэтому доборы позиции есть, но не так часто как это было ранее. Так как идет сейчас по MA чаще, то стало чаще закрывать открытую позицию частями.
Но так как сейчас появилась зависимость от MA, то чаще откаты превращаются не в добор позиции, а в переворот. Поэтому доборы позиции есть, но не так часто как это было ранее. Так как идет сейчас по MA чаще, то стало чаще закрывать открытую позицию частями.
никогда такого не было и вот опять
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Усреднение!
Konstantin писал(а):А ещё лучше объеденить оба варианта. Нужно ввести переменную DeltaPercent_Доливка. Она будет ориентировачно в два раза меньше нашей DeltaPercent_Частичное_закрытие, и доливать тем же объёмом "Q"
Например, для доливки текущей позиции шорт должны быть выполнены условия: тренд идёт вниз по индикатору, позиция меньше полной, и уровень последнего DeltaPercent_Частичное_зкрытие ниже на DeltaPercent_Доливка.
добавил параметр DeltaPercentAdd - влияющий только на процент отката для добора позиции
демонстрация работы
Код: Выделить всё
function Initialize()
{
StrategyName = "UpAndDownMA";
AddInput("Input1", Inputs.Candle, 5, true, "GAZP=МБ ЦК");
AddParameter("StartQ", 450, "Стартовое кол-во", 0);
AddParameter("Q", 50, "Кол-во докупки", 0);
AddParameter("DeltaPercent", 0.5, "% изменения цены для продажи", 0);
AddParameter("DeltaPercentAdd", 0.2, "% изменения цены для докупки", 0);
AddParameter("SMAper", 100, "MA Period", 0);
AddGlobalVariable("xPrice", Types.Double, 10000000000.0);
AddGlobalVariable("xPosition", Types.Double, 0.0);
AddGlobalVariable("LastPrice", Types.DoubleList);
AddGlobalVariable("Last", Types.Double, 0);
AddGlobalVariable("MinPrice", Types.Double, 0);
AddGlobalVariable("MaxPrice", Types.Double, 99999999);
AddGlobalVariable("Type", Types.Double, 1);
AddGlobalVariable("N", Types.Int, 1); //направление "1" - Long, "-1" - Short
AddChartIndicator("SMA", new Dictionary <string, string>{{"Period", "SMAper"}});
}
function OnUpdate()
{
// evge 13.04.2019 https://alfadirect4.ru
// модификация стратегии StepByStep от AlfaDirect
// evge 06.08.2020 https://alfadirect4.ru
// работа по MA + DeltaPercent от sMA[0]
// разделены параметры для добора (DelataPercentAdd) и закрытия частями (DelataPercent) позиции
// весь алгоритм работает по DeltaPercent и только в части добора позиции на откат DeltaPercentAdd
var CP = CurrentPosition();
var sMA = SMA(Input1, SMAper);
var NN = sMA[0] > sMA[1] && Input1.Close[0] > sMA[0]*(1.0 + 0.01*DeltaPercent) ? 1 : sMA[0] < sMA[1] && Input1.Close[0] < sMA[0]*(1.0 + 0.01*DeltaPercent) ? - 1 : N;
if (N == 0) N = NN;
// Переворот при смене направления
if (N != NN && CP >= 0 && NN < 0) { ClosePosition(); xPosition = 1; N = NN; CP = 0; return; }
if (N != NN && CP <= 0 && NN > 0) { ClosePosition(); xPosition = -1; N = NN; CP = 0; return; }
if (xPosition !=0 && CP == 0)
{
//N =- N;
xPrice = 10000000000.0;
LastPrice.Clear();
xPosition = 0;
MaxPrice = Double.MaxValue;
MinPrice = 0;
}
double pos = CurrentPosition();
// Правило 1. если первый запуск, покупаем StartQ
if ( xPrice == 10000000000.0 && N > 0)
{
if ( (Q%LotSize() != 0) || (StartQ%LotSize() != 0) )
{
ShowMessage("StartQ или Q не кратно лоту. Робот остановлен !");
Stop();
}
// Покупка StartQ
if (StartQ > 0)
{
EnterLongLimit(Input1.Close[0]*(1.0 + 0.01*DeltaPercent), StartQ);
}
xPrice = Input1.Close[0];
}
// Правило 1.1 старт для Short, продаем StartQ
if ( xPrice == 10000000000.0 && N < 0)
{
if ( (Q%LotSize() != 0) || (StartQ%LotSize() != 0) )
{
ShowMessage("StartQ или Q не кратно лоту. Робот остановлен !");
Stop();
}
// Продажа StartQ
if (StartQ > 0)
{
EnterShortLimit(Input1.Close[0]*(1.0 - 0.01*DeltaPercent), StartQ);
}
xPrice = Input1.Close[0];
}
// Модуль проверки изменение позиции UP
// если позиция выросла, добавляем уровень в список
if (N > 0)
{
if ( pos > xPosition )
{
double a = xPrice;
double b = xPosition;
while (pos - b > 0)
{
LastPrice.Add(a);
a = a*(1.0 + 0.01*DeltaPercent);
b = b + Q;
}
Last = xPrice;
xPosition = pos;
LastPrice.Sort();
}
// если позиция снизилась, убираем уровень из списка
else if ( pos < xPosition && LastPrice.Count >= 1 )
{
LastPrice.Sort();
LastPrice.RemoveAt(0);
Last = xPrice;
xPosition = pos;
}
if ( LastPrice.Count <= 0 )
MinPrice = Last;
else
MinPrice = LastPrice.Min();
}
// Модуль проверки изменение позиции DOWN
// если позиция снизилась, добавляем уровень в список
if (N < 0)
{
if ( pos < xPosition )
{
double a = xPrice;
double b = xPosition;
while (pos - b < 0)
{
LastPrice.Add(a);
a = a*(1.0 - 0.01*DeltaPercent);
b = b - Q;
}
Last = xPrice;
xPosition = pos;
LastPrice.Sort();
LastPrice.Reverse();
}
// если позиция выросла, убираем уровень из списка
else if ( pos > xPosition && LastPrice.Count >= 1 )
{
LastPrice.Sort();
LastPrice.Reverse();
LastPrice.RemoveAt(0);
Last = xPrice;
xPosition = pos;
}
if ( LastPrice.Count <= 0 )
MaxPrice = Last;
else
MaxPrice = LastPrice.Max();
}
//Правило 2. Если цена упала и кол-во меньше допустимого,
// то покупаем и добавляем цену покупки в начало списка
if ( N > 0 && Input1.Close[0] < MinPrice*(1.0 - 0.01*DeltaPercentAdd) && pos + Q <= LongLimit )
{
EnterLongLimit(Input1.Close[0]*(1.0 + 0.5*0.01*DeltaPercentAdd), Q);
xPrice = Input1.Close[0];
}
//Правило 2.1. Если цена выросла и кол-во больше допустимого,
// то продаем и добавляем цену продажи в начало списка
if ( N < 0 && Input1.Close[0] > MaxPrice*(1.0 + 0.01*DeltaPercentAdd) && pos - Q >= ShortLimit )
{
EnterShortLimit(Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercentAdd), Q);
xPrice = Input1.Close[0];
}
//Правило 3. Если цена выше цены из начала списка, то продаем и удаляем 0-й элемент списка
if ( N > 0 && Input1.Close[0] >= MinPrice*(1.0 + 0.01*DeltaPercent) && pos > 0 )
{
CloseLongLimit(Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercent), Q);
xPrice = Input1.Close[0];
}
//Правило 3.1. Если цена ниже цены из начала списка, то покупаем и удаляем 0-й элемент списка
if ( N < 0 && Input1.Close[0] <= MaxPrice*(1.0 - 0.01*DeltaPercent) && pos < 0 )
{
CloseShortLimit(Input1.Close[0]*(1.0 + 0.5*0.01*DeltaPercent), Q);
xPrice = Input1.Close[0];
}
}
никогда такого не было и вот опять
-
- Сообщения: 20
- Зарегистрирован: 11 окт 2017, 15:25
- Благодарил (а): 6 раз
Re: Усреднение!
evge писал(а):Konstantin писал(а):А ещё лучше объеденить оба варианта. Нужно ввести переменную DeltaPercent_Доливка. Она будет ориентировачно в два раза меньше нашей DeltaPercent_Частичное_закрытие, и доливать тем же объёмом "Q"
Например, для доливки текущей позиции шорт должны быть выполнены условия: тренд идёт вниз по индикатору, позиция меньше полной, и уровень последнего DeltaPercent_Частичное_зкрытие ниже на DeltaPercent_Доливка.
добавил параметр DeltaPercentAdd - влияющий только на процент отката для добора позиции
Но тогда, при установке параметра DeltaPercentAdd равным DeltaPercent, отчёт должен быть похож на тот, что я прикреплял выше.
А получилось вот что:
- Вложения
-
- Отчёт-2.png (34.83 КБ) 20826 просмотров
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Усреднение!
Это скорее всего из-за xPrice, замените обратно в 4 строках в конце на
подобные
на
и протестируйте
у меня с установкой не Input1.Close[0] на тех же параметрах выдало лучшие результаты и я оставил их.
вернул как был код, всё же лучше оставить как было, это совпадение что улучились результаты в единичном случае
подобные
Код: Выделить всё
xPrice = Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercent);
на
Код: Выделить всё
xPrice = Input1.Close[0];
и протестируйте
у меня с установкой не Input1.Close[0] на тех же параметрах выдало лучшие результаты и я оставил их.
вернул как был код, всё же лучше оставить как было, это совпадение что улучились результаты в единичном случае
никогда такого не было и вот опять
-
- Сообщения: 20
- Зарегистрирован: 11 окт 2017, 15:25
- Благодарил (а): 6 раз
Re: Усреднение!
evge писал(а):Это скорее всего из-за xPrice, замените обратно в 4 строках в конце на
подобныеКод: Выделить всё
xPrice = Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercent);
наКод: Выделить всё
xPrice = Input1.Close[0];
и протестируйте
у меня с установкой не Input1.Close[0] на тех же параметрах выдало лучшие результаты и я оставил их.
вернул как был код, всё же лучше оставить как было, это совпадение что улучились результаты в единичном случае
Не совсем понял, что вы оставили в итоге?
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Усреднение!
В коде выше внес исправление. Вернул как было изначально во всех четырех правилах добора и закрытия частями.
Код: Выделить всё
xPrice = Input1.Close[0];
никогда такого не было и вот опять
-
- Сообщения: 20
- Зарегистрирован: 11 окт 2017, 15:25
- Благодарил (а): 6 раз
Re: Усреднение!
evge писал(а):В коде выше внес исправление. Вернул как было изначально во всех четырех правилах добора и закрытия частями.Код: Выделить всё
xPrice = Input1.Close[0];
Ясно, но почему-то у меня всё равно, при параметрах:
500
50
1,4
1,4
62
получилось:
А должно быть примерно это:
- evge
- Администратор
- Сообщения: 1812
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 367 раз
- Контактная информация:
Re: Усреднение!
у меня в обеих вариациях и на старом коде и на модифицированном с DeltaPercentAdd выходит как на первой картинке.
т.е. нет разницы
т.е. нет разницы
никогда такого не было и вот опять
-
- Сообщения: 20
- Зарегистрирован: 11 окт 2017, 15:25
- Благодарил (а): 6 раз
Re: Усреднение!
evge писал(а):у меня в обеих вариациях и на старом коде и на модифицированном с DeltaPercentAdd выходит как на первой картинке.
т.е. нет разницы
Вы можете целиком код выложить, может закралась какая-нибудь ошибка?, потому что у меня не повторяется результат.
Вернуться в «Стратегии и роботы»
Кто сейчас на конференции
Сейчас этот форум просматривают: Bing [Bot] и 6 гостей