Доброго времени суток!
Евгений, подскажите как в данный код добавить усреднение что бы тейк сдвигался ? Спасибо!
Шаг усреднения и количество лотов на каждом шаге должно быть разным.
Например:
Шаг: 0,1 (%)
Количество шагов: 8
Смешение на каждом шаге: 1.1 (если нет смещения то 1)
Количество докупки: 1
Смещение количества докупки: 1
Код: Выделить всё
// Инициализация параметров стратегии
Initialize() {
StrategyName = "forts_Delta_MATrail_take";
AddParameter("Period", 85, "Период MATrail", 1);
AddParameter("pStop", 0, "Стоп в процентах", 0);
AddParameter("TP", 2, "Тейк в процентах", 0);
AddParameter("StepSize", 0.1, "Шаг усреднения (%)", 0);
AddParameter("NumberOfSteps", 8, "Количество шагов", 1);
AddParameter("StepMix", 1.1, "Смешение на каждом шаге", 1);
AddParameter("PurchaseAmount", 1, "Количество докупки", 1);
AddParameter("PurchaseMix", 1, "Смешение количества докупки", 1);
AddInput("Input1", Inputs.Candle, 1, true, "MXU9=ФОРТС");
AddChartIndicator("MY.str_Delta_MATra", new Dictionary<string, string>{{"Period", "Period"}});
}
// Основной метод обновления, вызывается при каждом обновлении данных
OnUpdate()
{
// Получаем параметры
int period = GetParameter("Period");
double stepSize = GetParameter("StepSize");
double stepMix = GetParameter("StepMix");
double tp = GetParameter("TP");
var delta = MY.DeltaCumLine(Input1); // Вычисляем дельту
double[] lines = MY.MATrail(delta, period);
double line = lines[0];
double line1 = lines[1];
double pos = CurrentPosition(); // Получаем текущее количество открытых позиций
double currentPrice = CurrentPrice(); // Получаем текущую цену
double stepSizeInPrice = stepSize / 100 * currentPrice; // Вычисляем шаг в цене
if (delta[0] > line && delta[1] <= line1) {
if (pos == 0) { // Если позиция еще не открыта
EnterLong(GetParameter("PurchaseAmount")); // Открываем длинную позицию
entryPrice = currentPrice; // Указываем цену входа
if (GetParameter("pStop") > 0) {
SetStopLoss(GetParameter("pStop"), StopLossType.Percent); // Устанавливаем стоп-лосс
}
} else {
if (currentPrice < entryPrice * (1 - stepSize / 100 * stepMix)) {
int additionalLots = (int)(GetParameter("PurchaseAmount") * GetParameter("PurchaseMix"));
EnterLong(additionalLots); // Открываем дополнительные лоты
entryPrice = (entryPrice * (1 + additionalLots) + currentPrice * additionalLots) / (1 + additionalLots);
}
}
}
if (delta[0] < line && delta[1] >= line1) {
if (pos == 0) { // Если позиция еще не открыта
EnterShort(GetParameter("PurchaseAmount")); // Открываем короткую позицию
entryPrice = currentPrice; // Указываем цену входа
if (GetParameter("pStop") > 0) {
SetStopLoss(GetParameter("pStop"), StopLossType.Percent); // Устанавливаем стоп-лосс
}
} else {
if (currentPrice > entryPrice * (1 + stepSize / 100 * stepMix)) {
int additionalLots = (int)(GetParameter("PurchaseAmount") * GetParameter("PurchaseMix"));
EnterShort(additionalLots); // Открываем дополнительные лоты
entryPrice = (entryPrice * (1 + additionalLots) + currentPrice * additionalLots) / (1 + additionalLots);
}
}
}
if (CurrentPL() >= tp) {
ClosePosition(); // Закрываем позицию при достижении тейк-профита
}
}