← К каталогу
Исходный код · ID 4236

martingale_gold_tp.mq5

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Данный продукт представляет собой торговый советник для платформы MetaTrader 5, написанный на языке MQL5. Советник обрабатывает рыночные события OnTick и выполняет торговые операции через встроенные средства MetaTrader 5, включая открытие и закрытие позиций.

Советник реализует управление серией позиций с несколькими вариантами выхода: закрытие одиночных позиций при достижении заданного профита в пунктах, выборочный выход по группам позиций, а также полное закрытие группы при достижении целевого совокупного результата. Доступна защита по суммарной потере средств.

В качестве средств управления позициями советник поддерживает последовательное добавление ордеров с автоматическим подбором размера лота и контролем максимального допустимого объёма. Все позиции идентифицируются с помощью магического номера и привязаны к конкретному торговому символу.

Настройки программы

НастройкаОписание
Notice Уведомление — Текстовое уведомление, отображаемое при настройке советника.
SimpleForexTeam__ Информация автора — Текстовый параметр с информацией об авторе.
abOrderLots Последовательность лотов — Текстовая последовательность базовых размеров лотов, используемых при добавлении позиций в серию.
LotMultiplier Множитель лота — Множитель, на который умножается базовый размер лота при расчёте объёмов позиций.
MaxLot Максимальный лот — Максимально допустимый размер лота для одной позиции.
GridDistance Расстояние сетки — Расстояние в пунктах, при достижении которого добавляется новая позиция в серию.
MaxLotToStartEscapePlan Максимальный лот для активации плана выхода — Порог максимального лота, при превышении которого активируется режим целевого выхода по группе позиций.
OverallTakeProfitUSDEscapePlan Общий профит для плана выхода — Целевая суммарная прибыль в долларах для полного закрытия группы позиций в режиме целевого выхода.
SingleOrderProfitPoints Профит для закрытия одиночной позиции — Целевой профит в пунктах для закрытия одиночной позиции.
CrossExitTwoOrdersProfitPoints Профит для кросс-выхода — Целевой профит в пунктах для кросс-выхода по группе позиций.
AverageExitPointsAfterSevenOrders Средний профит для выхода после 7 позиций — Целевой средний профит в пунктах, при достижении которого происходит закрытие группы из более чем 7 позиций.
StopLossAmount Сумма стоп-лосса — Суммарная допустимая потеря в долларах, при достижении которой происходит принудительное закрытие всех позиций и перезапуск серии.
EnableStopLoss Включить стоп-лосс — Переключатель, определяющий, активна ли защита от суммарной потери средств.
magicNo Магический номер — Магический номер, используемый для идентификации позиций, управляемых данным советником.
OrderComment Комментарий к ордерам — Комментарий, присваиваемый открытым ордерам и позициям.
Получить полный код

Поиск по коду файла

#property description "Market has many uncertainties, no EA guarantees 100% profit, please use proper risk management."
#property version   "1.39"

#include <Trade/Trade.mqh>

#define WECHAT_ID   ""
#define AUTHORIZED_ACCOUNT   0
#define EXPIRATION_DATE      "2029-09-21"

input string Notice = "Trading are risky! Trade only if you can loss your money";
input string SimpleForexTeam__ = "free tools for forex! Join our channel for more free eas";
input string The_our_telegram = "";
input string VIP_group = "";

input string   abOrderLots               = "0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.02,0.02,0.02,0.02,0.05,0.05,0.06,0.06,0.07,0.07,0.08,0.08,0.09,0.10,0.15,0.19,0.23,0.26,0.29,0.30,0.35,0.40,0.50,0.60,0.70,0.80,0.90,1.00,1.00,2.00";
input double   LotMultiplier             = 1.0;
input double   MaxLot                    = 2.0;
input int      GridDistance              = 100;
input double   MaxLotToStartEscapePlan   = 1.0;
input double   OverallTakeProfitUSDEscapePlan    = 15.0;
input double   SingleOrderProfitPoints       = 100.0;
input double   CrossExitTwoOrdersProfitPoints   = 100.0;
input double   AverageExitPointsAfterSevenOrders = 100.0;
input double   StopLossAmount              = 2000000.0;
input bool     EnableStopLoss          = true;
input int      magicNo               = 1588;
input string   OrderComment              = "";

double LotSequence[];
int    SequenceSize;
bool   IsClosing = false;
CTrade Trade;
string TradeComment;

int OnInit()
{
      // код доступен только после оплаты
   }

void OnDeinit(const int reason) { }

double GetAddLot(int level)
{
   if(level <= 0) return 0;
   if(level <= SequenceSize) return LotSequence[level-1];
   return 2.00 * LotMultiplier;
}

bool OpenOrder(int type, double lot)
{
   if(MaxLot > 0 && lot > MaxLot)
   {
      Print("Open position failed: lot ", lot, " exceeds max limit ", MaxLot);
      return false;
   }
   double price = (type==POSITION_TYPE_BUY) ? SymbolInfoDouble(Symbol(), SYMBOL_ASK)
                                            : SymbolInfoDouble(Symbol(), SYMBOL_BID);
   bool result = (type==POSITION_TYPE_BUY) ? Trade.Buy(lot, Symbol(), price, 0, 0, TradeComment)
                                           : Trade.Sell(lot, Symbol(), price, 0, 0, TradeComment);
   if(result)
      return true;
   else
   {
      Print("Open position failed, error code: ", Trade.ResultRetcode(), " description: ", Trade.ResultRetcodeDescription());
      return false;
   }
}

void CloseAllOrders(int type)
{
   ulong tickets[];
   int cnt=0;
   for(int i=PositionsTotal()-1; i>=0; i--)
   {
      if(PositionSelectByTicket(PositionGetTicket(i)))
      {
         if(PositionGetInteger(POSITION_MAGIC)!=magicNo) continue;
         if(PositionGetString(POSITION_SYMBOL)!=Symbol()) continue;
         if(type == -1 || (int)PositionGetInteger(POSITION_TYPE)==type)
         {
            ArrayResize(tickets, cnt+1);
            tickets[cnt] = PositionGetTicket(i);
            cnt++;
         }
      }
   }
   for(int i=0; i<cnt; i++)
   {
      for(int att=0; att<3; att++)
      {
         if(Trade.PositionClose(tickets[i]))
            break;
         else
         {
            int err = Trade.ResultRetcode();
            Print("Close position failed, ticket: ", tickets[i], " attempt: ", att+1, " error: ", err);
            if(err==10027 || err==10028) Sleep(50);
            else break;
         }
      }
   }
}

void CloseSingleOrder(ulong ticket)
{
   for(int att=0; att<3; att++)
   {
      if(Trade.PositionClose(ticket))
         break;
      else
      {
         int err = Trade.ResultRetcode();
         Print("Close position failed, ticket: ", ticket, " attempt: ", att+1, " error: ", err);
         if(err==10027 || err==10028) Sleep(50);
         else break;
      }
   }
}

double OrderProfitPoints(ulong ticket, int type, double priceOpen)
{
   double currentPrice = (type==POSITION_TYPE_BUY) ? SymbolInfoDouble(Symbol(), SYMBOL_BID)
                                                   : SymbolInfoDouble(Symbol(), SYMBOL_ASK);
   double point = SymbolInfoDouble(Symbol(), SYMBOL_POINT);
   if(type==POSITION_TYPE_BUY)
      return (currentPrice - priceOpen) / point;
   else
      return (priceOpen - currentPrice) / point;
}//+------------------------------------------------------------------+
void OnTick()
{
      // код доступен только после оплаты
   }
   if(IsClosing) return;

   int    longCnt=0, shortCnt=0;
   double longLots=0, shortLots=0;
   double longSum=0, shortSum=0;
   double longProfit=0, shortProfit=0;
   double longMaxLot=0, shortMaxLot=0;
   double longMinPrice = 0;   // Buy minimum open price
   double shortMaxPrice = 0;  // Sell maximum open price
   datetime longLastTime=0, shortLastTime=0;
   double longLastPrice=0, shortLastPrice=0;

   struct OrderInfo
   {
      ulong ticket;
      int type;
      double profitPoints;
      double profitUSD;
      double priceOpen;
      datetime openTime;
   };
   OrderInfo orders[];
   int orderCount=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
   {
      if(PositionSelectByTicket(PositionGetTicket(i)))
      {
         if(PositionGetInteger(POSITION_MAGIC)!=magicNo) continue;
         if(PositionGetString(POSITION_SYMBOL)!=Symbol()) continue;

         ulong ticket = PositionGetTicket(i);
         int type = (int)PositionGetInteger(POSITION_TYPE);
         double lots = PositionGetDouble(POSITION_VOLUME);
         double price = PositionGetDouble(POSITION_PRICE_OPEN);
         double profitUSD = PositionGetDouble(POSITION_PROFIT);
         double profitPoints = OrderProfitPoints(ticket, type, price);
         datetime openTime = (datetime)PositionGetInteger(POSITION_TIME);

         if(type==POSITION_TYPE_BUY)
         {
            longCnt++;
            longLots += lots;
            longSum += price * lots;
            longProfit += profitUSD;
            if(lots > longMaxLot) longMaxLot = lots;
            if(longMinPrice == 0 || price < longMinPrice) longMinPrice = price;

            if(openTime > longLastTime)
            {
               longLastTime = openTime;
               longLastPrice = price;
            }
         }
         else if(type==POSITION_TYPE_SELL)
         {
            shortCnt++;
            shortLots += lots;
            shortSum += price * lots;
            shortProfit += profitUSD;
            if(lots > shortMaxLot) shortMaxLot = lots;
            if(shortMaxPrice == 0 || price > shortMaxPrice) shortMaxPrice = price;

            if(openTime > shortLastTime)
            {
               shortLastTime = openTime;
               shortLastPrice = price;
            }
         }

         ArrayResize(orders, orderCount+1);
         orders[orderCount].ticket = ticket;
         orders[orderCount].type = type;
         orders[orderCount].profitPoints = profitPoints;
         orders[orderCount].profitUSD = profitUSD;
         orders[orderCount].priceOpen = price;
         orders[orderCount].openTime = openTime;
         orderCount++;
      }
   }

   double point = SymbolInfoDouble(Symbol(), SYMBOL_POINT);
   double bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
   double ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);

   double totalProfitUSD = longProfit + shortProfit;

   if(EnableStopLoss && totalProfitUSD <= -StopLossAmount)
   {
      Print("Stop loss triggered: total loss ", totalProfitUSD, " USD, reached stop loss amount ", StopLossAmount);
      IsClosing = true;
      CloseAllOrders(-1);
      IsClosing = false;
    

Показано первые 50% кода (символов: 11560)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 156₽ ≈ $14.13