V 2e is in post 1.
I had three badly losing GJ trades closed by the bot earlier on, and I have no idea why. I still have no idea why, but digging through the code I saw that I had not implemented yellow wavy line closure. I have implemented that and added a feature to stop it closing groups of trades unless they are in a cash profit. From the updated user guide:
- CloseOnYellowRangeWave: tells HGB'nG to close all open trades and delete outstanding stop/limit orders when HGI judges the market to be ranging. This does not apply to hedged positions.
- OnlyCloseProfitablePositions: acts with CloseOnYellowRangeWave and is best limited to the stop orders only system. This prevents HGB'nG from closing groups of trades if they are not in a cash profit.
Are you getting into making these changes for yourselves? If so:
Line 8 becomes:
#define version "Version 2
e"
Go to line 239 and insert this:
Code: Select all
//Stop unprofitable positions being closed by either of the two inputs above.
extern bool OnlyCloseProfitablePositions=true;
Then go to void ShouldTradesBeClosed() roughly at line 3843 and copy this over the top of the entire function:
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()

Read the effing manual, ok?
Afterprime is the official SHF broker. Read about them at https://www.stevehopwoodforex.com/phpBB3/viewtopic.php?p=175790#p175790.
I still suffer from OCCD. Good thing, really.
Anyone here feeling generous? My paypal account is always in the market for a tiny donation. pianodoodler@hotmail.com is the account.
To see The Weekly Roundup of stuff you guys might have missed
Click here
My special thanks to Thomas (tomele) for all the incredible work he does here.