Страница 3 из 8
Re: Усреднение!
Добавлено: 17 апр 2020, 23:44
Orange2000
Приветствую Евгений.
А сложно изменить стратегию от 13 апреля 19года что бы она всегда закрывала позицию в конце дня. Скажем в 23-45. И потом с утра по новой уже.
Re: Усреднение!
Добавлено: 18 апр 2020, 19:07
evge
Добрый день!
Готово. Закрывает по GAZP в 18:30.
В коде H и M задают время, после которого позиция будет закрытия и остановлен алгоритм (через return).
Вообще H и M можно вынести в параметры.
В тоже время производится переворот в другую сторону по торговле на следующий день.
Это задается через N = -N;
Можно закомментировать эту строку и переворота не будет, торговать будет в туже сторону на следующий день.
А если 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];
}
}
Re: Усреднение!
Добавлено: 18 апр 2020, 20:52
Orange2000
Евгений благодарю!
Такое исчерпывающее решение. Браво)
Re: Усреднение!
Добавлено: 21 апр 2020, 00:09
Orange2000
что-то не закрылся робот в конце сессии. Торговал фьюч сбера. Выставил 23-49 в коде. Но не закрылся робот и как-будто подвис даже. Потому что правая кнопка не работала по строчке с роботом...
в чем может быть проблема?
в сообщениях робота тоже пусто
Re: Усреднение!
Добавлено: 21 апр 2020, 06:04
evge
Кратно таймфрейму нужно и НЕ указывать время последнего бара таймфрейма.
Если таймфрейм 5 минут, то и время должно быть 23:40, но не более 23:40, т.к. это уже будет сигнал для следущего дня. Последний бар 23:45 будет доступен только в первый тик следующего дня на баре в 10:00.
23:49 при таймфрейме 5 минут не отработает, т.к. BarTime() на следующий день в 10:00 будет 23:45,а это меньше 23:49
Re: Усреднение!
Добавлено: 21 апр 2020, 09:57
Orange2000
Евгений, был минутный тайм фрейм)
Но возможно, я что-то не допонимаю...и надо было сделать 23-48..попробую сегодня
Re: Усреднение!
Добавлено: 21 апр 2020, 10:25
evge
Выше я ошибся. 23:45 последний бар дня, а не 23:50 (поправил выше). 23:50 бара нет.
аналогично для минутного 23:49 последний бар и будет он доступен в старт торгов следующего дня, т.е. в 10:00.
Т.е. в минутном таймфрейме указывать надо бар 23:48 (для закрытия на 23:49) или ранее.
- BarTime-01.png (13.14 КБ) 17270 просмотров
- BarTime-02.png (6.78 КБ) 17270 просмотров
Re: Усреднение!
Добавлено: 21 апр 2020, 11:13
Orange2000
Спасибо Евгений. Я уже тоже глянул. 49 последний бар)
Хотя в коде и написано что по достижении (больше или равно) 23 49 00 закрыть позицию, но особенности альфы я так понял, а именно ждет закрытия бара ( в нашем случае 49 минутного)...
Re: Усреднение!
Добавлено: 21 апр 2020, 14:31
evge
Ждет закрытия и дождется его только на первом тике следующего бара!
т.е. о том что предыдущий бар закрыт информация появится в стратегии только на первом тике следующего бара и сработает событие OnUpdate(). Есть конечно т.н. "живой бар", но это другая история
Re: Усреднение!
Добавлено: 21 апр 2020, 17:54
Den
"Живой бар" с детства и до сих пор нетрудоспособный инвалид.