mql5/Experts/Downloads/Auto_Tp.mq5

146 lines
4.9 KiB
MQL5
Raw Permalink Normal View History

2025-08-10 17:43:21 -04:00
//+------------------------------------------------------------------+
//| Auto_Tp_MQL5.mq5 |
//| Mir Mostofa Kamal|
//| https://www.mql5.com/en/users/bokul |
//+------------------------------------------------------------------+
#property copyright "Mir Mostofa Kamal"
#property link "https://www.mql5.com/en/users/bokul"
#property description "mkbokul@gmail.com"
#property version "1.00"
#property description "Auto Take profit and stop loss set EA ."
#property description "This EA will work on all time frames. Good for Scalping. It also work on XAUUSD too."
#property description "WARNING: Use this software at your own risk."
#property description "The creator of this script cannot be held responsible for any damage or loss."
#property strict
#include <Trade\Trade.mqh>
CTrade trade;
// Inputs
input string Auto_Tp_Genaral_Settings = "=== Auto Tp Genaral Settings ===";
input double TakeProfitPips = 25; // Take Profit in pips:
input bool UseStopLoss = false; // Enable Stop Loss:
input double StopLossPips = 12; // Stop Loss in pips:
input string Auto_Tp_Advance_Settings = "=== Auto Tp Advance Settings ===";
input bool UseTrailingStop = false; // Enable Trailing Stop:
input double TrailingStopPips = 15; // Trailing Stop in pips:
input bool UseEquityProtection = false; // Enable Equity Protection:
input double MinEquityPercent = 20.0; // Use Maximum Equity % Risk:
input int Slippage = 3; //Slip:
int MagicNumber = 2025; // Only affect manual trades
//+---------------- On in It --------------------------------------------------+
int OnInit()
{
Print("Auto SL/TP Manager EA initialized.");
return(INIT_SUCCEEDED);
}
//+--------------- On Trick ---------------------------------------------------+
void OnTick()
{
ManageOpenPositions();
CheckEquityLimit();
}
//+--------------- Manage Open Positions ---------------------------------------------------+
void ManageOpenPositions()
{
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
double pip = point * 10;
if(PositionSelect(_Symbol))
{
ulong ticket = PositionGetInteger(POSITION_TICKET);
int type = (int)PositionGetInteger(POSITION_TYPE);
double price = PositionGetDouble(POSITION_PRICE_OPEN);
double sl = PositionGetDouble(POSITION_SL);
double tp = PositionGetDouble(POSITION_TP);
double newSL = 0.0, newTP = 0.0;
if(type == POSITION_TYPE_BUY)
{
if(UseStopLoss)
newSL = NormalizeDouble(price - StopLossPips * pip, _Digits);
newTP = NormalizeDouble(price + TakeProfitPips * pip, _Digits);
}
else
if(type == POSITION_TYPE_SELL)
{
if(UseStopLoss)
newSL = NormalizeDouble(price + StopLossPips * pip, _Digits);
newTP = NormalizeDouble(price - TakeProfitPips * pip, _Digits);
}
if((UseStopLoss && sl == 0.0) || tp == 0.0)
{
if(!UseStopLoss)
newSL = 0.0;
trade.PositionModify(_Symbol, newSL, newTP);
}
if(UseTrailingStop && UseStopLoss)
ApplyTrailingStop(type, price, pip);
}
}
//+--------------- Apply Trailing Stop ---------------------------------------------------+
void ApplyTrailingStop(int type, double openPrice, double pip)
{
double sl = PositionGetDouble(POSITION_SL);
double newSL;
if(type == POSITION_TYPE_BUY)
{
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
if(bid - openPrice > TrailingStopPips * pip)
{
newSL = NormalizeDouble(bid - TrailingStopPips * pip, _Digits);
if(sl < newSL)
trade.PositionModify(_Symbol, newSL, PositionGetDouble(POSITION_TP));
}
}
else
if(type == POSITION_TYPE_SELL)
{
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
if(openPrice - ask > TrailingStopPips * pip)
{
newSL = NormalizeDouble(ask + TrailingStopPips * pip, _Digits);
if(sl > newSL || sl == 0.0)
trade.PositionModify(_Symbol, newSL, PositionGetDouble(POSITION_TP));
}
}
}
//+------------- Equity Limit -----------------------------------------------------+
void CheckEquityLimit()
{
if(!UseEquityProtection)
return;
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
double minEquity = balance * MinEquityPercent / 100.0;
if(equity <= minEquity)
{
if(PositionSelect(_Symbol) && PositionGetInteger(POSITION_MAGIC) == MagicNumber)
{
if(trade.PositionClose(_Symbol))
Print("Closed trade due to low equity. Equity: ", equity);
}
}
}
//+
//+--------------------- Finish codeing ---------------------------------------------+