grid strategy 21112024 - 2or_5363996961055735985.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «grid strategy 21112024 - 2or_5363996961055735985.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный код представляет собой торгового робота-советника (Expert Advisor) для платформы MetaTrader 4, реализующий сеточную торговую систему. Робот управляет несколькими стратегиями одновременно, каждая из которых использует свой магический номер и может быть включена или выключена независимо.
Сигналы для открытия позиций формируются семью различными индикаторными стратегиями: скользящие средние MA, полосы Боллинджера, паттерны свечей, стохастик, MACD и RSI. Каждая стратегия имеет собственные параметры и логику формирования сигналов на покупку или продажу.
Робот размещает позиции с заданным шагом сетки, рассчитывает средневзвешенную цену открытых позиций и корректирует уровни стоп-лосса и тейк-профита по мере развития рынка. При достижении убытком нулевого баланса стратегия автоматически закрывает все открытые позиции и отключается.
Размер позиции может рассчитываться как фиксированное значение, так и процент от свободного маржинала. Множитель лота позволяет увеличивать размер последующих позиций в сетке. Все параметры настраиваются пользователем через входные параметры советника.
Настройки программы
| Настройка | Описание |
|---|---|
| iTakeProfit | Тейк Профит — расстояние в пунктах для установки уровня тейк-профита при первом открытии позиции. |
| 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)
{
op = OrderOpenPrice();
Показано первые 50% кода (символов: 9894)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.