Стратегии и роботы > Усреднение!
-
- Сообщения: 47
- Зарегистрирован: 13 мар 2019, 00:45
- Благодарил (а): 37 раз
- Поблагодарили: 1 раз
Re: Усреднение!
Приветствую Евгений.
А сложно изменить стратегию от 13 апреля 19года что бы она всегда закрывала позицию в конце дня. Скажем в 23-45. И потом с утра по новой уже.
А сложно изменить стратегию от 13 апреля 19года что бы она всегда закрывала позицию в конце дня. Скажем в 23-45. И потом с утра по новой уже.
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 366 раз
- Контактная информация:
Re: Усреднение!
Добрый день!
Готово. Закрывает по GAZP в 18:30.
В коде H и M задают время, после которого позиция будет закрытия и остановлен алгоритм (через return).
Вообще H и M можно вынести в параметры.
В тоже время производится переворот в другую сторону по торговле на следующий день.
Это задается через N = -N;
Можно закомментировать эту строку и переворота не будет, торговать будет в туже сторону на следующий день.
А если N = -N заменить на
переворот направления торговли будет только если ПУ закрываемой в H:M позиции был убыточным.
Добавлен следующий код:
Полный код.
Готово. Закрывает по GAZP в 18:30.
В коде H и M задают время, после которого позиция будет закрытия и остановлен алгоритм (через return).
Вообще H и M можно вынести в параметры.
В тоже время производится переворот в другую сторону по торговле на следующий день.
Это задается через N = -N;
Можно закомментировать эту строку и переворота не будет, торговать будет в туже сторону на следующий день.
А если N = -N заменить на
Код: Выделить всё
if (CurrentPL() < 0) N =- N;
переворот направления торговли будет только если ПУ закрываемой в H:M позиции был убыточным.
Добавлен следующий код:
Код: Выделить всё
//+evge выход из позиции после H:M и приостановка работы до следующего дня
int H = 18, M = 30;
if (BarTime(0) >= AsTime(H, M, 0))
{
if (CurrentPosition() != 0)
{
ClosePosition();
N =- N;
xPrice = 10000000000.0;
LastPrice.Clear();
xPosition = 0;
MaxPrice = Double.MaxValue;
MinPrice = 0;
}
return;
}
//-evge
Полный код.
Код: Выделить всё
/**
**/
function Initialize()
{
StrategyName = "UpAndDownCP";
AddInput("Input1", Inputs.Candle, 5, true, "GAZP=МБ ЦК");
AddParameter("StartQ", 3000, "Стартовое кол-во", 0);
AddParameter("Q", 300, "Кол-во докупки", 0);
AddParameter("DeltaPercent", 0.4, "% изменения цены для докупки и продажи", 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
}
function OnUpdate()
{
// evge 13.04.2019 https://alfadirect4.ru
// модификация стратегии StepByStep от AlfaDirect
//+evge выход из позиции после H:M и приостановка работы до следующего дня
int H = 18, M = 30;
if (BarTime(0) >= AsTime(H, M, 0))
{
if (CurrentPosition() != 0)
{
ClosePosition();
N =- N;
xPrice = 10000000000.0;
LastPrice.Clear();
xPosition = 0;
MaxPrice = Double.MaxValue;
MinPrice = 0;
}
return;
}
//-evge
// Переворот стратегии Long/Short
if (xPosition !=0 && CurrentPosition() == 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*DeltaPercent) && pos + Q <= LongLimit )
{
EnterLongLimit(Input1.Close[0]*(1.0 + 0.5*0.01*DeltaPercent), Q);
xPrice = Input1.Close[0];
}
//Правило 2.1. Если цена выросла и кол-во больше допустимого,
// то продаем и добавляем цену продажи в начало списка
if ( N < 0 && Input1.Close[0] > MaxPrice*(1.0 + 0.01*DeltaPercent) && pos - Q >= ShortLimit )
{
EnterShortLimit(Input1.Close[0]*(1.0 - 0.5*0.01*DeltaPercent), 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];
}
}
никогда такого не было и вот опять
-
- Сообщения: 47
- Зарегистрирован: 13 мар 2019, 00:45
- Благодарил (а): 37 раз
- Поблагодарили: 1 раз
-
- Сообщения: 47
- Зарегистрирован: 13 мар 2019, 00:45
- Благодарил (а): 37 раз
- Поблагодарили: 1 раз
Re: Усреднение!
что-то не закрылся робот в конце сессии. Торговал фьюч сбера. Выставил 23-49 в коде. Но не закрылся робот и как-будто подвис даже. Потому что правая кнопка не работала по строчке с роботом...
в чем может быть проблема?
в сообщениях робота тоже пусто
в чем может быть проблема?
в сообщениях робота тоже пусто
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 366 раз
- Контактная информация:
Re: Усреднение!
Кратно таймфрейму нужно и НЕ указывать время последнего бара таймфрейма.
Если таймфрейм 5 минут, то и время должно быть 23:40, но не более 23:40, т.к. это уже будет сигнал для следущего дня. Последний бар 23:45 будет доступен только в первый тик следующего дня на баре в 10:00.
23:49 при таймфрейме 5 минут не отработает, т.к. BarTime() на следующий день в 10:00 будет 23:45,а это меньше 23:49
Если таймфрейм 5 минут, то и время должно быть 23:40, но не более 23:40, т.к. это уже будет сигнал для следущего дня. Последний бар 23:45 будет доступен только в первый тик следующего дня на баре в 10:00.
23:49 при таймфрейме 5 минут не отработает, т.к. BarTime() на следующий день в 10:00 будет 23:45,а это меньше 23:49
никогда такого не было и вот опять
-
- Сообщения: 47
- Зарегистрирован: 13 мар 2019, 00:45
- Благодарил (а): 37 раз
- Поблагодарили: 1 раз
Re: Усреднение!
Евгений, был минутный тайм фрейм)
Но возможно, я что-то не допонимаю...и надо было сделать 23-48..попробую сегодня
Но возможно, я что-то не допонимаю...и надо было сделать 23-48..попробую сегодня
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 366 раз
- Контактная информация:
Re: Усреднение!
Выше я ошибся. 23:45 последний бар дня, а не 23:50 (поправил выше). 23:50 бара нет.
аналогично для минутного 23:49 последний бар и будет он доступен в старт торгов следующего дня, т.е. в 10:00.
Т.е. в минутном таймфрейме указывать надо бар 23:48 (для закрытия на 23:49) или ранее.
аналогично для минутного 23:49 последний бар и будет он доступен в старт торгов следующего дня, т.е. в 10:00.
Т.е. в минутном таймфрейме указывать надо бар 23:48 (для закрытия на 23:49) или ранее.
никогда такого не было и вот опять
-
- Сообщения: 47
- Зарегистрирован: 13 мар 2019, 00:45
- Благодарил (а): 37 раз
- Поблагодарили: 1 раз
Re: Усреднение!
Спасибо Евгений. Я уже тоже глянул. 49 последний бар)
Хотя в коде и написано что по достижении (больше или равно) 23 49 00 закрыть позицию, но особенности альфы я так понял, а именно ждет закрытия бара ( в нашем случае 49 минутного)...
Хотя в коде и написано что по достижении (больше или равно) 23 49 00 закрыть позицию, но особенности альфы я так понял, а именно ждет закрытия бара ( в нашем случае 49 минутного)...
- evge
- Администратор
- Сообщения: 1811
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 366 раз
- Контактная информация:
Re: Усреднение!
Ждет закрытия и дождется его только на первом тике следующего бара!
т.е. о том что предыдущий бар закрыт информация появится в стратегии только на первом тике следующего бара и сработает событие OnUpdate(). Есть конечно т.н. "живой бар", но это другая история
т.е. о том что предыдущий бар закрыт информация появится в стратегии только на первом тике следующего бара и сработает событие OnUpdate(). Есть конечно т.н. "живой бар", но это другая история
никогда такого не было и вот опять
Вернуться в «Стратегии и роботы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя