66 lines
3.2 KiB
MQL5
66 lines
3.2 KiB
MQL5
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| 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();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
//+------------------------------------------------------------------+
|