grid strategy 21112024 - 1_5363996961055735984.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «grid strategy 21112024 - 1_5363996961055735984.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный продукт представляет собой торгового робота (Expert Advisor) для MetaTrader 4, реализующий сеточную (grid) торговлю. Робот управляет семью торговыми стратегиями одновременно, каждая из которых использует свой индикатор для генерации сигналов на покупку или продажу: скользящие средние (MA), полосы Боллинджера (BB), паттерны свечей, стохастик, MACD и RSI. Стратегии работают параллельно и идентифицируются уникальными магическими числами.
Основная логика заключается в открытии и управлении сеткой ордеров: при отсутствии позиций робот открывает сделку, а при необходимости — добавляет дополнительные ордера на заданном расстоянии (iOrderStep). Лоты рассчитываются либо как фиксированное значение, либо как процент от свободного маржинального баланса с возможностью умножения. При достижении определённых условий робот модифицирует стоп-лоссы и тейк-профиты существующих позиций. Если совокупный профит с учётом начального депозита стратегии становится отрицательным, все позиции стратегии закрываются и она отключается.
Параметры настраиваются пользователем через входные переменные: размер тейк-профита, тип расчёта лота, начальный лот, множитель, дистанция между позициями, минимальный профит в пунктах и допустимое проскальзывание. Робот не является автоматическим советником в терминологии Pine Script — это полноценный MQL4-советник для ручной или автоматической торговли на платформе MetaTrader 4.
Настройки программы
| Настройка | Описание |
|---|---|
| iTakeProfit | Размер тейк-профита в пунктах, устанавливаемый на первом ордере стратегии при его открытии. При значении 0 тейк-профит не устанавливается. |
| iTypeLots | Тип расчёта начального лота: «Лоты» — фиксированное числовое значение, «Процент» — расчёт лота как процента от свободного маржинального баланса. |
| iStartLots | Начальный размер лота для первой позиции в сетке. Используется также как базовое значение при расчёте лота в процентном режиме. |
| iMultiplier | Множитель лота, применяемый при расчёте размера лота для дополнительных позиций в сетке. Умножает лот предыдущей позиции. |
| iOrderStep | Дистанция между позициями в сетке, измеряемая в пунктах. Определяет расстояние, при котором открывается следующий ордер. |
| iMinimalProfit | Минимальный профит в пунктах, используемый при расчёте средневзвешенных цен для модификации ордеров. Задаётся в пунктах цены. |
| iSlippage | Допустимое проскальзывание цены при отправке рыночных ордеров и модификации существующих позиций, измеряемое в пунктах. |
Поиск по коду файла
#property version "24.110"
#property description "Разработка торговых роботов и автоматизация торговых процессов."
#property description "Уведомления о начале вебинара в телеграмм "
#property strict
/*
Название торгового робота?
*/
enum ENUM_TYPE_CALC_LOTS
{
Lots = 0, // Лоты
Percent = 1 // Процент
};
input int iTakeProfit = 300; // Тейк Профит
sinput ENUM_TYPE_CALC_LOTS iTypeLots = Lots; // Тип рассчета лота Процент или Значение
sinput double iStartLots = 0.01; // Начальный лот
input double iMultiplier = 2.0; // Множитель лота
input int iOrderStep = 290; // Дистанция между позициями
input int iMinimalProfit = 30; // Минимальный профит в пунктах
sinput int iSlippage = 30; // Проскальзывание
struct _str_
{
/* 01 */int magic; // === Меджик номер стратегии, он же порядковый номер стратегии
/* 02 */string name; // === Имя торговой стратегии
/* 03 */double depo; // === Депозит выделенный торговой стратегии
/* 04 */bool work; // === Признак работы торговой стратегии true - работать false - выключить
/* 05 */string descr; // === Тектовое описание результата работы
/* 06 */datetime time_start; // === Время начала работы стратегии
/* 07 */datetime time_stop; // === Время конца работы стратегии
/* 08 */int deals; // === Количество сделок по стратегии
/* 09 */double profit; // === Профит стратегии за время теста (Профит в день) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/* 10 */double deals_d; // === Количество сделок в день
void Print()
{
double pos_day = ((int)time_stop - (int)time_start) / (60 * 60 * 24);
pos_day = pos_day == 0 ? 1 : pos_day;
::Print(" =============================================== ");
::Print(" Итоговый баланс " + DoubleToString(depo + profit, 2));
::Print(" Причина остановки " + (work ? "Конец теста Успех!" : " Потеря депозита, Провал!"));
::Print(" Позиций в день " + DoubleToString(deals / pos_day, 2));
::Print(" Чистый профит " + DoubleToString(profit, 2));
::Print(" Позиций всего " + IntegerToString(deals));
::Print(" Дата стоп " + TimeToString(time_stop, TIME_DATE | TIME_SECONDS));
::Print(" Дата старт " + TimeToString(time_start, TIME_DATE | TIME_SECONDS));
::Print(" Депозит " + DoubleToString(depo, 2));
::Print(" Стратегия " + name + " Magic " + (string)magic);
::Print(" =============================================== ");
}
};
_str_ strategy[] =
{
{1, "MA", 500, true, "", NULL, NULL, 0, 0, 0},
{2, "BB", 500, true, "", NULL, NULL, 0, 0, 0},
{3, "Candle 1", 500, true, "", NULL, NULL, 0, 0, 0},
{4, "Candle 2", 500, true, "", NULL, NULL, 0, 0, 0},
{5, "Stochastic", 500, true, "", NULL, NULL, 0, 0, 0},
{6, "MACD", 500, true, "", NULL, NULL, 0, 0, 0},
{7, "RSI", 500, true, "", NULL, NULL, 0, 0, 0},
};
int OnInit()
{
// код доступен только после оплаты
}
void OnTick()
{
// код доступен только после оплаты
}
bool Strategy(int iIndex)
{
double
BuyPriceMax = 0, BuyPriceMin = 0, BuyPriceMaxLot = 0, BuyPriceMinLot = 0, BuyPriceSumm = 0, BuyLotsSumm = 0,
SelPriceMin = 0, SelPriceMax = 0, SelPriceMinLot = 0, SelPriceMaxLot = 0, SelPriceSumm = 0, SelLotsSumm = 0,
op = 0, lt = 0, sl = 0, tp = 0, profit = 0;
int b = 0, s = 0, ty = -1, tk = -1;
int BuyTicMax = -1, BuyTicMin = -1, SelTicMax = -1, SelTicMin = -1;
for(int i = OrdersTotal() - 1; i >= 0; i--)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if(strategy[iIndex].work) // === Стратегии разрешено работать
if(OrderMagicNumber() == strategy[iIndex].magic)
if(OrderSymbol() == _Symbol)
{
op = OrderOpenPrice();
lt = OrderLots();
ty = OrderType();
tk = OrderTicket();
if(ty == OP_BUY)
{
if(op > BuyPriceMax || BuyPriceMax == 0)
{
BuyPriceMax = op;
BuyPriceMaxLot = lt;
BuyTicMax = tk;
}
if(op < BuyPriceMin || BuyPriceMin == 0)
{
BuyPriceMin = op;
BuyPriceMinLot = lt;
BuyTicMin = tk;
}
b++;
BuyPriceSumm += op * lt;
BuyLotsSumm += lt;
}
if(ty == OP_SELL)
{
if(op > SelPriceMax || SelPriceMax == 0)
{
SelPriceMax = op;
SelPriceMaxLot = lt;
SelTicMax = tk;
}
if(op < SelPriceMin || SelPriceMin == 0)
{
SelPriceMin = op;
SelPriceMinLot = lt;
SelTicMin = tk;
}
s++;
SelPriceSumm += op * lt;
SelLotsSumm += lt;
}
}
double AwerageBuyPrice = 0, AwerageSelPrice = 0;
if(b >= 2 && BuyLotsSumm > 0 && b <= 3)
AwerageBuyPrice = Nd((BuyPriceSumm / BuyLotsSumm) + iMinimalProfit * _Point);
if(s >= 2 && SelLotsSumm > 0 && s <= 3)
AwerageSelPrice = Nd((SelPriceSumm / SelLotsSumm) - iMinimalProfit * _Point);
if(b >= 4 && BuyLotsSumm > 0)
AwerageBuyPrice = Nd((BuyPriceMax * BuyPriceMaxLot + BuyPriceMin * BuyPriceMinLot) / (BuyPriceMaxLot + BuyPriceMinLot) + iMinimalProfit * _Point);
if(s >= 4 && SelLotsSumm > 0)
AwerageSelPrice = Nd((SelPriceMax * SelPriceMaxLot + SelPriceMin * SelPriceMinLot) / (SelPriceMaxLot + SelPriceMinLot) - iMinimalProfit * _Point);
double BuyLot = 0, SelLot = 0;
if(b == 0)
BuyLot = iTypeLots == Percent ? LotPercent(iStartLots) : iStartLots;
else
BuyLot = BuyPriceMinLot * iMultiplier; // Добавить код пересчета с 0,01 * 1,5 =
if(s == 0)
SelLot = iTypeLots == Percent ? LotPercent(iStartLots) : iStartLots;
else
SelLot = SelPriceMaxLot * iMultiplier;
BuyLot = CheckVolumeValue(BuyLot);
SelLot = CheckVolumeValue(SelLot);
if(strategy[iIndex].work) // === Стратегии разрешено работать
{
if(Signal(strategy[iIndex].magic) == OP_BUY)
if((b == 0) || (b > 0 && (BuyPriceMin - Ask) >= (iOrderStep * _Point)))
if(OrderSend(_Symbol, OP_BUY, Nd(BuyLot, 2), Nd(Ask), iSlippage, 0, 0, "Grid", strategy[iIndex].magic, 0, clrGreen) < 0)
Print("OrderSend error OP_BUY #", GetLastError());
if(Signal(strategy[iIndex].magic) == OP_SELL)
if((s == 0) || (s > 0 && (Bid - SelPriceMax) >= (iOrderStep * _Point)))
if(OrderSend(_Symbol, OP_SELL, Nd(SelLot, 2), Nd(Bid), iSlippage, 0, 0, "Grid", strategy[iIndex].magic, 0, clrGreen) < 0)
Print("OrderSend error OP_SELL #", GetLastError());
}
for(int i = OrdersTotal() - 1; i >= 0; i--)
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if(strategy[iIndex].work) // === Стратегии разрешено работать
if(OrderMagicNumber() == strategy[iIndex].magic)
if(OrderSymbol() == _Symbol)
Показано первые 50% кода (символов: 9886)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.