Code: Select all
void ShouldTradesBeClosed()
{
if (OpenTrades == 0)
return;//Nothing to do
int tries = 0;
//We only want trades closing if the trades are based on a previous candle's signal
if (LatestTradeTime < iTime(Symbol(), TradingTimeFrame, 0) )
{
//Opposite direction semafor
//Close buys
if (CloseTradesOnRelevantSemafor || CloseImmediatelySemaforAppears)//semafor
{
//SemStatus will only == highsemafor or highsemafornow if CloseImmediatelySemaforAppears is enabled
if (SemStatus == highsemafor || SemStatus == highsemafornow)
{
tries = 0;
//Close buys
if (BuyOpen && (!CloseOnlyInPositivePips || BuyPipsUpl > 0))
{
ForceTradeClosure = true;
while (ForceTradeClosure)
{
CloseAllTrades(OP_BUY);
CloseAllTrades(OP_BUYSTOP);
if (DeleteAndReplaceLosersGrid || !SellOpen)
CloseAllTrades(OP_SELLSTOP);
if (ForceTradeClosure)
Sleep(1000);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while (ForceTradeClosure)
//Replace the grids for the stop orders method
if (GridType == Stop_Orders_Only)
{
if (ReplaceWinnersGrid)
if (SellOpen)//open sells means the cycle has not ended and we want new buy stop orders ready in case market resumes its upward move
SendBuyGrid(Symbol(), OP_BUYSTOP, NormalizeDouble(Ask + (DistanceBetweenTrades / factor), Digits), Lot);
if (DeleteAndReplaceLosersGrid)
if (SellOpen)//open sells means the cycle has not ended and we want new sell stop orders much closer to the market
SendSellGrid(Symbol(), OP_SELLSTOP, NormalizeDouble(Bid - (DistanceBetweenTrades / factor), Digits), Lot);
}//if (GridType == Stop_Orders_Only)
return;//Nothing more for this function to do
}//if (BuyOpen)
}//if (SemStatus == highsemafor || SemStatus == highsemafornow)
//SemStatus will only == lowsemafor or lowsemafornow if CloseImmediatelySemaforAppears is enabled
if (SemStatus == lowsemafor || SemStatus == lowsemafornow)
{
tries = 0;
//Close sells
if (SellOpen && (!CloseOnlyInPositivePips || BuyPipsUpl > 0))
{
ForceTradeClosure = true;
while (ForceTradeClosure)
{
CloseAllTrades(OP_SELL);
CloseAllTrades(OP_SELLSTOP);
if (DeleteAndReplaceLosersGrid || !BuyOpen)
CloseAllTrades(OP_BUYSTOP);
if (ForceTradeClosure)
Sleep(1000);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while (ForceTradeClosure)
//Replace the sell grid for the stop orders method
if (GridType == Stop_Orders_Only)
{
if (ReplaceWinnersGrid)
if (BuyOpen)//open buys means the cycle has not ended and we want new sell stop orders ready in case market resumes its downward move
SendSellGrid(Symbol(), OP_SELLSTOP, NormalizeDouble(Bid - (DistanceBetweenTrades / factor), Digits), Lot);
if (DeleteAndReplaceLosersGrid)
if (BuyOpen)//open buys means the cycle has not ended and we want new buy stop orders much closer to the market
SendBuyGrid(Symbol(), OP_BUYSTOP, NormalizeDouble(Ask + (DistanceBetweenTrades / factor), Digits), Lot);
}//if (GridType == Stop_Orders_Only)
return;//Nothing more for this function to do
}//if (SellOpen)
}//if (SemStatus == lowsemafor || SemStatus == lowsemafornow)
}//if (CloseTradesOnRelevantSemafor || CloseImmediatelySemaforAppears)//semafor
}//if (LatestTradeTime < iTime(Symbol(), TradingTimeFrame, 0) )
//Hedged position. Has it hit tp?
if (Hedged)
{
bool ClosePosition = false;
//Have we hit pips upl
if (HedgeProfitPips > 0)
if (PipsUpl >= HedgeProfitPips)
ClosePosition = true;
//Have we hit cash upl
if (!ClosePosition)
if (HedgeProfitCash > 0)
if (CashUpl >= HedgeProfitCash)
ClosePosition = true;
if (ClosePosition)
{
tries = 0;
ForceTradeClosure = true;
while(ForceTradeClosure)
{
ForceTradeClosure = false;
if (BuyOpen)
CloseAllTrades(OP_BUY);
if (SellOpen)
CloseAllTrades(OP_SELL);
if (SellStopOpen)
CloseAllTrades(OP_SELLSTOP);
if (SellLimitOpen)
CloseAllTrades(OP_SELLLIMIT);
if (BuyStopOpen)
CloseAllTrades(OP_BUYSTOP);
if (BuyLimitOpen)
CloseAllTrades(OP_BUYLIMIT);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while(ForceTradeClosure)
}//if (ClosePosition)
//Close the profitable bit of the hedge following a yellow wavy line
if (CloseProfitableSideOnYellowWavy)
if (WaveStatus == Waverange)
{
//Is the buy side in a cash profit
if (BuyCashUpl >= 0)
{
tries = 0;
ForceTradeClosure = true;
while(ForceTradeClosure)
{
ForceTradeClosure = false;
if (BuyOpen)
CloseAllTrades(OP_BUY);
if (BuyStopOpen)
CloseAllTrades(OP_BUYSTOP);
if (BuyLimitOpen)
CloseAllTrades(OP_BUYLIMIT);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while(ForceTradeClosure)
//Grid replacement
if (!ForceTradeClosure)
{
//Replace the buy grid in case the market continues to rise
SendBuyGrid(Symbol(), OP_BUYSTOP, NormalizeDouble(Ask + (DistanceBetweenTrades / factor), Digits), Lot);
//Replace the sell grid in the hope that the market will fall
SendSellGrid(Symbol(), OP_SELLSTOP, NormalizeDouble(Bid - (DistanceBetweenTrades / factor), Digits), Lot);
}//if (!ForceTradeClosure)
if (!ForceTradeClosure)
return;//Everything worked. Makes a bloody change.
}//if (BuyCashUpl >= 0)
//Is the sell side in a cash profit
if (SellCashUpl >= 0)
{
tries = 0;
ForceTradeClosure = true;
while(ForceTradeClosure)
{
ForceTradeClosure = false;
if (SellOpen)
CloseAllTrades(OP_SELL);
if (SellStopOpen)
CloseAllTrades(OP_SELLSTOP);
if (SellLimitOpen)
CloseAllTrades(OP_SELLLIMIT);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while(ForceTradeClosure)
//Grid replacement
if (!ForceTradeClosure)
{
//Replace the sell grid in the hope that the market continues to fall
SendSellGrid(Symbol(), OP_SELLSTOP, NormalizeDouble(Bid - (DistanceBetweenTrades / factor), Digits), Lot);
//Replace the buy grid in case it rises instead
SendBuyGrid(Symbol(), OP_BUYSTOP, NormalizeDouble(Ask + (DistanceBetweenTrades / factor), Digits), Lot);
}//if (!ForceTradeClosure)
if (!ForceTradeClosure)
return;//Everything worked. Makes a bloody change.
}//if (SellCashUpl >= 0)
}//if (WaveStatus == Waverange)
//A hedged position overrides all else, so no need to continue with this function.
return;
}//if (Hedged)
//We only want trades closing if the trades are based on a previous candle's signal
if (LatestTradeTime < iTime(Symbol(), TradingTimeFrame, 0) )
{
//Buy signal
if (BuySignal)
if (OriginalSignal != OP_SELL)
{
tries = 0;
ForceTradeClosure = true;
while(ForceTradeClosure)
{
if (SellOpen)
CloseAllTrades(OP_SELL);
if (SellStopOpen)
CloseAllTrades(OP_SELLSTOP);
if (SellLimitOpen)
CloseAllTrades(OP_SELLLIMIT);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while(ForceTradeClosure)
if (!ForceTradeClosure)
if(BuyOpen) //)//open buys means the cycle has not ended and we want new sell stop orders ready in case market resumes its downward move
//Replace the sell grid in the case that the market continues to fall
SendSellGrid(Symbol(), OP_SELLSTOP, NormalizeDouble(Bid - (DistanceBetweenTrades / factor), Digits), Lot);
}//if (OriginalSignal != OP_SELL)
//Sell signal
if (SellSignal)
if (OriginalSignal != OP_BUY)
{
tries = 0;
ForceTradeClosure = true;
while(ForceTradeClosure)
{
if (BuyOpen)
CloseAllTrades(OP_BUY);
if (BuyStopOpen)
CloseAllTrades(OP_BUYSTOP);
if (BuyLimitOpen)
CloseAllTrades(OP_BUYLIMIT);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while(ForceTradeClosure)
if (!ForceTradeClosure)
if(SellOpen)//open sells means the cycle has not ended and we want new buy stop orders ready in case market resumes its upward move
//Replace the buy grid in the case that the market continues to rise
SendBuyGrid(Symbol(), OP_BUYSTOP, NormalizeDouble(Ask + (DistanceBetweenTrades / factor), Digits), Lot);
}//if (OriginalSignal != OP_BUY)
}//if (LatestTradeTime < iTime(Symbol(), TradingTimeFrame, 0) )
//No trade signal. Delete existing pendings if none of them have filled.
if (LatestTradeTime >= iTime(Symbol(), TradingTimeFrame, 0) )
if (HgiSignalStatus == hginosignal && WaveStatus == Wavenone && SemStatus == nosemafor)
if (!BuyOpen)
if (!SellOpen)
{
tries = 0;
ForceTradeClosure = true;
while(ForceTradeClosure)
{
ForceTradeClosure = false;
if (SellStopOpen)
CloseAllTrades(OP_SELLSTOP);
if (SellLimitOpen)
CloseAllTrades(OP_SELLLIMIT);
if (BuyStopOpen)
CloseAllTrades(OP_BUYSTOP);
if (BuyLimitOpen)
CloseAllTrades(OP_BUYLIMIT);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while(ForceTradeClosure)
}//if (!SellOpen)
//All market trades have hit tp
if (PendingTradesTotal <= GridSize)//There should be up to GridSize * 2
if (MarketTradesTotal == 0)//And all the market trades have hit tp or sl
{
ForceTradeClosure = true;
while(ForceTradeClosure)
{
tries = 0;
ForceTradeClosure = false;
if (SellStopOpen)
CloseAllTrades(OP_SELLSTOP);
if (SellLimitOpen)
CloseAllTrades(OP_SELLLIMIT);
if (BuyStopOpen)
CloseAllTrades(OP_BUYSTOP);
if (BuyLimitOpen)
CloseAllTrades(OP_BUYLIMIT);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while(ForceTradeClosure)
}//if (MarketTradesTotal == 0)//And all the market trades have hit tp or sl
//Yellow wavy range
if (CloseOnYellowRangeWave)
{
//Buy trades
if (!OnlyCloseProfitablePositions || BuyCashUpl > 0)
{
ForceTradeClosure = true;
while(ForceTradeClosure)
{
tries = 0;
ForceTradeClosure = false;
if (BuyOpen)
CloseAllTrades(OP_BUY);
if (BuyStopOpen)
CloseAllTrades(OP_BUYSTOP);
if (BuyLimitOpen)
CloseAllTrades(OP_BUYLIMIT);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while(ForceTradeClosure)
CountOpenTrades();
}//if (!OnlyCloseProfitablePositions || BuyCashUpl > 0)
//Sell trades
if (!OnlyCloseProfitablePositions || SellCashUpl > 0)
{
ForceTradeClosure = true;
while(ForceTradeClosure)
{
tries = 0;
ForceTradeClosure = false;
if (SellOpen)
CloseAllTrades(OP_SELL);
if (SellStopOpen)
CloseAllTrades(OP_SELLSTOP);
if (SellLimitOpen)
CloseAllTrades(OP_SELLLIMIT);
tries++;
if (tries >= 100)
{
ForceTradeClosure = false;
break;
}//if (tries >= 100)
}//while(ForceTradeClosure)
CountOpenTrades();
}//if (!OnlyCloseProfitablePositions || SellCashUpl > 0)
}//if (CloseOnYellowRangeWave)
}//End void ShouldTradesBeClosed()