Re: Усреднение!
Добавлено: 13 апр 2019, 21:29
буду тестировать. больше интересует доллар)) если от лонга
Неофициальный форум клиентского терминала Альфа-Инвестиции (Альфа-Директ 4). Обсуждение терминала, обмен опытом, разработка скриптов индикаторов и стратегий.
https://alfadirect4.ru/
Код: Выделить всё
/**
**/
function Initialize()
{
StrategyName = "UpAndDown";
AddInput("Input1", Inputs.Candle, 5, true, "GAZP=МБ ЦК");
AddParameter("StartQ", 3000, "Стартовое кол-во", 0);
AddParameter("Q", 300, "Кол-во докупки", 0);
AddParameter("LongDeltaPrice", 1.5, "LONG пунктов изменения цены для докупки и продажи", 0);
AddParameter("LongDeltaPriceClose", 1.5, "LONG пунктов изменения цены для закрытия", 0);
AddParameter("ShortDeltaPrice", 1.5, "SHORT пунктов изменения цены для докупки и продажи", 0);
AddParameter("ShortDeltaPriceClose", 1.5, "SHORT пунктов изменения цены для закрытия", 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 12.08.2019
// delta можно задавать раздельно для long и short и для закрытия long и short
// Переворот стратегии 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] + LongDeltaPrice, 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] - ShortDeltaPrice, 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 + LongDeltaPrice;
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 - ShortDeltaPrice;
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 - LongDeltaPrice && pos + Q <= LongLimit )
{
EnterLongLimit(Input1.Close[0] + LongDeltaPrice, Q);
xPrice = Input1.Close[0];
}
//Правило 2.1. Если цена выросла и кол-во больше допустимого,
// то продаем и добавляем цену продажи в начало списка
if ( N < 0 && Input1.Close[0] > MaxPrice + ShortDeltaPrice && pos - Q >= ShortLimit )
{
EnterShortLimit(Input1.Close[0] - ShortDeltaPrice, Q);
xPrice = Input1.Close[0];
}
//Правило 3. Если цена выше цены из начала списка, то продаем и удаляем 0-й элемент списка
if ( N > 0 && Input1.Close[0] >= MinPrice + LongDeltaPriceClose && pos > 0 )
{
CloseLongLimit(Input1.Close[0] - LongDeltaPriceClose, Q);
xPrice = Input1.Close[0];
}
//Правило 3.1. Если цена ниже цены из начала списка, то покупаем и удаляем 0-й элемент списка
if ( N < 0 && Input1.Close[0] <= MaxPrice - ShortDeltaPriceClose && pos < 0 )
{
CloseShortLimit(Input1.Close[0] + ShortDeltaPriceClose, Q);
xPrice = Input1.Close[0];
}
}
Код: Выделить всё
LastPrice.Clear();
Balalayka писал(а): что за функция с Clear?
Clear()
Удаляет из коллекции List<T> все элементы.