evge писал(а):Код который выше, он полностью как у меня.
Спасибо! Буду разбираться, я бы такую головоломку целый месяц решал и код был бы в несколько раз длиннее
evge писал(а):Код который выше, он полностью как у меня.
Код: Выделить всё
/**
Вход на экстремумах стохастика во флете. Ниже 20 - лонг, выше 80 - шорт.
**/
function Initialize()
{
StrategyName = "15_Stoch";
AddParameter("P3", 20, "Экстремум минимальный стохастик", 1);
AddParameter("P4", 80, "Экстремум максимальный стохастик", 1);
AddParameter("P5", 35, "K%", 1);
AddParameter("P6", 3, "D%", 1);
AddParameter("P7", 7, "Стохастик Сигнал", 1);
AddParameter("P8", 100, "Тейк профит", 1);
AddParameter("P9", 100, "Стоп лосс", 1);
AddInput("Input1", Inputs.Candle, 15, true, "");
LongLimit = 1;
ShortLimit = -1;
AddChartIndicator("Stoch", new Dictionary <string, string>{{"PeriodK", "P5"},{"PeriodD", "P6"},{"PeriodSignal", "P7"}});
}
function OnUpdate()
{
/// ПРАВИЛО 1
if ( (SO(Input1, P5, P6, P7).GetValue("Signal", 0) < P3) )
{
EnterLong();
BreakingStop(P9, P8, SignalPriceType.DeltaFromAveragePrice);
}
/// ПРАВИЛО 2
if ( (SO(Input1, P5, P6, P7).GetValue("Signal", 0) > P4) )
{
EnterShort();
BreakingStop(P9, P8, SignalPriceType.DeltaFromAveragePrice);
}
}
Orange2000 писал(а):...Почему-то в некоторые дни , например 16апреля, входит в лонг утром и только вечером закрывает, не делая внутри дня сделок...
Код: Выделить всё
function Initialize()
{
StrategyName = "UpAndDownMA";
AddInput("Input1", Inputs.Candle, 30, true, "GAZP=МБ ЦК");
AddParameter("StartQ", 290, "Стартовое кол-во", 0);
AddParameter("Q", 10, "Кол-во докупки", 0);
AddParameter("DeltaPercent", 0.6, "% изменения цены для докупки и продажи", 0);
AddParameter("SMAper", 95, "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 от MinPrice и MaxPrice
var CP = CurrentPosition();
var sMA = SMA(Input1, SMAper);
var NN = sMA[0] > sMA[1] && Input1.Close[0] > MaxPrice*(1.0 + 0.01*DeltaPercent) ? 1 : sMA[0] < sMA[1] && Input1.Close[0] < MinPrice*(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*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];
}
}
Код: Выделить всё
function Initialize()
{
StrategyName = "UpAndDownMA2";
AddInput("Input1", Inputs.Candle, 30, true, "GAZP=МБ ЦК");
AddParameter("StartQ", 290, "Стартовое кол-во", 0);
AddParameter("Q", 10, "Кол-во докупки", 0);
AddParameter("DeltaPercent", 0.6, "% изменения цены для докупки и продажи", 0);
AddParameter("SMAper", 95, "MA Period", 0);
AddParameter("SMAper2", 55, "MA Period", 0);
AddParameter("DPAdd", 0.2, "Доп увеличение или уменьшение для DeltaPercent", 0);
//Если сигналы по SMA1 и SMA2 противоречат друг другу, то
//Если SMAper2 > SMAper, тогда DeltaPercent увеличивается на DPAdd
//Если SMAper2 < SMAper, тогда DeltaPercent уменьшается на DPAdd
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"}});
AddChartIndicator("SMA", new Dictionary <string, string>{{"Period", "SMAper2"}});
}
function OnUpdate()
{
// evge 13.04.2019 https://alfadirect4.ru
// модификация стратегии StepByStep от AlfaDirect
// evge 06.08.2020 https://alfadirect4.ru
// работа по MA + DeltaPercent от MinPrice и MaxPrice
// evge 19.09.2021 https://alfadirect4.ru
// добавлен sMA2
var CP = CurrentPosition();
var sMA = SMA(Input1, SMAper);
var sMA2 = SMA(Input1, SMAper2);
double DP = DeltaPercent;
if ((sMA2[0] > sMA2[1] && sMA[0] < sMA[1]) || (sMA2[0] < sMA2[1] && sMA[0] > sMA[1]))
if (SMAper2 > SMAper) DP += DPAdd; else if (SMAper2 < SMAper) DP -= DPAdd;
var NN = sMA[0] > sMA[1] && Input1.Close[0] > MaxPrice*(1.0 + 0.01*DP) ? 1 : sMA[0] < sMA[1] && Input1.Close[0] < MinPrice*(1.0 + 0.01*DP) ? - 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*DP), 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*DP), 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*DP);
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*DP);
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*DP) && pos + Q <= LongLimit )
{
EnterLongLimit(Input1.Close[0]*(1.0 + 0.5*0.01*DP), Q);
xPrice = Input1.Close[0];
}
//Правило 2.1. Если цена выросла и кол-во больше допустимого,
// то продаем и добавляем цену продажи в начало списка
if ( N < 0 && Input1.Close[0] > MaxPrice*(1.0 + 0.01*DP) && pos - Q >= ShortLimit )
{
EnterShortLimit(Input1.Close[0]*(1.0 - 0.5*0.01*DP), Q);
xPrice = Input1.Close[0];
}
//Правило 3. Если цена выше цены из начала списка, то продаем и удаляем 0-й элемент списка
if ( N > 0 && Input1.Close[0] >= MinPrice*(1.0 + 0.01*DP) && pos > 0 )
{
CloseLongLimit(Input1.Close[0]*(1.0 - 0.5*0.01*DP), Q);
xPrice = Input1.Close[0];
}
//Правило 3.1. Если цена ниже цены из начала списка, то покупаем и удаляем 0-й элемент списка
if ( N < 0 && Input1.Close[0] <= MaxPrice*(1.0 - 0.01*DP) && pos < 0 )
{
CloseShortLimit(Input1.Close[0]*(1.0 + 0.5*0.01*DP), Q);
xPrice = Input1.Close[0];
}
}
Вернуться в «Стратегии и роботы»
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей