ip851874 писал(а):Подскажите пожалуйста как добавить параметр Q для Delta price и для PL свой?
например так:
Код: Выделить всё
/**Стратегия торговли по сетке содержит три простых правила:
Правило 1. При первом запуске покупаем стартовый объем (StartQ штук) и запоминаем уровень «покупки».
Правило 2. При снижении цены ниже минимальной покупки на DeltaPrice покупаем еще Q штук, если не набрали допустимую позицию. Добавляем уровень покупки в список.
Правило 3. При росте цены выше минимальной покупки на PL продаем Q штук, если еще не продали все. Удаляем данный уровень покупки из списка.
Примечание: На вкладке отчета "переменные" можно посмотреть список уровней покупки.
Уровни прописываются на следующем баре. Для первой покупки сформируются несколько уровеней смещенных на DeltaPrice вверх.
Developed by Alfadirect;
Algorithm = ИНВЕСТИЦИИ;**/
function Initialize()
{
StrategyName = "Invest_Grid";
AddInput("Input1", Inputs.Candle, 5, true, "GAZP=МБ ЦК");
AddParameter("StartQ", 100, "Стартовое Кол-во", 1);
AddParameter("Q", 10, "Кол-во докупки");
AddParameter("QC", 10, "Кол-во продажи");
AddParameter("DeltaPrice", 1, "Изм. цены для докупки");
AddParameter("PL", 1, "Изм. цены для фиксации прибыли ");
AddGlobalVariable("xPrice", Types.Double, 10000000000.0);
AddGlobalVariable("xPosition", Types.Double, 0.0);
AddGlobalVariable("LastPrice", Types.DoubleList);
AddGlobalVariable("Last", Types.Double, 0);
AddGlobalVariable("Order", Types.Boolean, false);
}
function OnUpdate()
{
double pos = CurrentPosition();
// Правило 1. если первый запуск, покупаем StartQ
if ( xPrice == 10000000000.0 )
{
if ( Q < LotSize() || StartQ < LotSize() )
{
ShowMessage("StartQ или Q меньше лота. Робот остановлен !");
Stop();
}
// Покупка StartQ
EnterLong(StartQ);
Order = true;
xPrice = Input1.Close[0];
}
// Модуль проверки изменение позиции
// если позиция выросла, добавляем уровень в список
if ( pos > xPosition )
{
double a = xPrice;
double b = xPosition;
while (pos - b > 0)
{
LastPrice.Add(a);
a = a + DeltaPrice;
b = b + QC;
}
Last = xPrice;
xPosition = pos;
Order = false;
LastPrice.Sort();
}
// если позиция снизилась, убираем уровень из списка
else if ( pos < xPosition && LastPrice.Count >= 1 )
{
LastPrice.Sort();
LastPrice.RemoveAt(0);
Last = xPrice;
xPosition = pos;
Order = false;
}
double MinPrice = 0;
if ( LastPrice.Count <= 0 )
MinPrice = Last;
else
MinPrice = LastPrice.Min();
//Правило 2. Если цена упала и кол-во меньше допустимого,
// то покупаем и добавляем цену покупки в начало списка
if ( Input1.Close[0] < MinPrice - DeltaPrice && pos + Q <= LongLimit && Order == false)
{
EnterLong(Q);
xPrice = Input1.Close[0];
Order = true;
}
//Правило 3. Если цена выше цены из начала списка, то продаем и удаляем 0-й элемент списка
if ( Input1.Close[0] >= MinPrice + PL && pos > 0 && Order == false )
{
CloseLong(Math.Min(QC, pos));
xPrice = Input1.Close[0];
Order = true;
}
}
Нужно учитывать, что если кол-во продажи (QC) меньше чем докупки (Q), тогда уровни для продажи могут пересекаться с уровнями продаж предыдущих докупок.
Уже не будет "равномерности" расстановки уровней, т.к. добавляться будут несколько (ранее один) новых уровней после докупки при падении цены. После падения и нескольких докупок и дальнейшего роста, продажи будут проходить на одних уровнях подряд по барам.
пример, где Q = 50, QC = 10, максимальная позиция Long 1000
т.е. каждый раз когда мы докупили при падении 50 шт, мы нарисовали от цены докупки 5 уровней вверх с расстоянием DeltaPrice для продаж по 10 шт.