//+------------------------------------------------------------------+ //| 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(); } } //+------------------------------------------------------------------+