martingale_gold_tp.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.