IndianTrailingStopLoss/AddOnOrdersManagement.mqh

66 lines
3.2 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 15:00:53 +02:00
//+------------------------------------------------------------------+
//| AddOnOrdersManagement.mqh |
//| Jay Davis |
//| 512jay.github.io |
//+------------------------------------------------------------------+
#property copyright "Jay Davis"
#property link "512jay.github.io"
#property version "1.0"
input group ""
input group "|----------Add On Orders Settings----------|"
input group "||--- Buy Addons"
input double BuyAddOnAtPercentage = 0; // BUY Add-on at Percentage, 0 - Off
input double BuyLotSizeMultiplier = 1; // BUY Lot Size Multiplier;
input int BuysInSeries = 1; // Number of BUYS in Series, 0 - Unlimited
input group "||--- Sell Addons"
input double SellAddOnAtPercentage = 0; // SELL Add-on at Percentage, 0 -Off
input double SellLotSizeMultiplier = 1; // SELL Lot Size Multiplier;
input int SellsInSeries = 1; // Number of SELLS in Series, 0 - Unlimited
//+------------------------------------------------------------------+
//| Implements a new trade at given percentage |
//+------------------------------------------------------------------+
void AddOnPercentageTradeCheck()
{
int size = ArraySize(Virt);
double issueNewTradeAtPercentage;
if(DirectionToTrade == ORDER_TYPE_BUY)
issueNewTradeAtPercentage = BuyAddOnAtPercentage;
else
issueNewTradeAtPercentage = SellAddOnAtPercentage;
if(issueNewTradeAtPercentage == 0)
return;
double Curr = iClose(_Symbol, PERIOD_CURRENT, 0);
if(Virt[size - 1].request.type == ORDER_TYPE_BUY && Curr >
(MostRecentOpenedPrice + MostRecentOpenedPrice * issueNewTradeAtPercentage / 100)
&& (SeriesOrderNumber < BuysInSeries || BuysInSeries == 0))
{
VirtualBuy(Virt, LotSizer(Buy), _Symbol, SymbolInfoDouble(_Symbol, SYMBOL_BID),
GetStopLoss(_Symbol, ORDER_TYPE_BUY, false),
0, "%+ Buy #" + (string)(SeriesOrderNumber + 1));
if(trade.Buy(LotSizer(Buy), NULL, 0, 0, 0,
"%+ Buy #" + (string)(SeriesOrderNumber + 1)))
Virt[ArraySize(Virt) - 1].request.order = trade.ResultOrder();
MostRecentOpenedPrice = Curr;
SeriesOrderNumber++;
TimeStopLossWasLastModified = TimeCurrent();
}
if(Virt[size - 1].request.type == ORDER_TYPE_SELL && Curr < MostRecentOpenedPrice -
MostRecentOpenedPrice * issueNewTradeAtPercentage / 100
&& (SeriesOrderNumber < SellsInSeries || SellsInSeries == 0))
{
VirtualSell(Virt, LotSizer(Sell), _Symbol, SymbolInfoDouble(_Symbol, SYMBOL_ASK),
GetStopLoss(_Symbol, ORDER_TYPE_SELL, false),
0, "%+ Sell #" + (string)(SeriesOrderNumber + 1));
if(trade.Sell(LotSizer(Sell), NULL, 0, 0, 0,
"%+ Sell # " + (string)(SeriesOrderNumber + 1)))
Virt[ArraySize(Virt) - 1].request.order = trade.ResultOrder();
MostRecentOpenedPrice = Curr;
SeriesOrderNumber++;
TimeStopLossWasLastModified = TimeCurrent();
}
}
//+------------------------------------------------------------------+