From 1f301a2f9a36f801990b574e52dff9e29af9128a Mon Sep 17 00:00:00 2001 From: Nkondog Anselme Date: Tue, 15 Mar 2022 10:44:52 +0100 Subject: [PATCH] Initial commit --- Experts/Nkanven/CandleCount.mq5 | 72 ++++++++++ Include/Nkanven/CandleCount/CheckHistory.mqh | 27 ++++ .../Nkanven/CandleCount/CloseTransactions.mqh | 74 ++++++++++ .../Nkanven/CandleCount/EntriesManager.mqh | Bin 0 -> 19390 bytes Include/Nkanven/CandleCount/LotSizeCal.mqh | 62 ++++++++ Include/Nkanven/CandleCount/Parameters.mqh | 133 ++++++++++++++++++ Include/Nkanven/CandleCount/Prechecks.mqh | 79 +++++++++++ Include/Nkanven/CandleCount/ScanPositions.mqh | 45 ++++++ Include/Nkanven/CandleCount/TradeManager.mqh | 0 Include/Nkanven/CandleCount/TradingHour.mqh | 62 ++++++++ 10 files changed, 554 insertions(+) create mode 100644 Experts/Nkanven/CandleCount.mq5 create mode 100644 Include/Nkanven/CandleCount/CheckHistory.mqh create mode 100644 Include/Nkanven/CandleCount/CloseTransactions.mqh create mode 100644 Include/Nkanven/CandleCount/EntriesManager.mqh create mode 100644 Include/Nkanven/CandleCount/LotSizeCal.mqh create mode 100644 Include/Nkanven/CandleCount/Parameters.mqh create mode 100644 Include/Nkanven/CandleCount/Prechecks.mqh create mode 100644 Include/Nkanven/CandleCount/ScanPositions.mqh create mode 100644 Include/Nkanven/CandleCount/TradeManager.mqh create mode 100644 Include/Nkanven/CandleCount/TradingHour.mqh diff --git a/Experts/Nkanven/CandleCount.mq5 b/Experts/Nkanven/CandleCount.mq5 new file mode 100644 index 0000000..4dcaa4d --- /dev/null +++ b/Experts/Nkanven/CandleCount.mq5 @@ -0,0 +1,72 @@ +//+------------------------------------------------------------------+ +//| CandleCount.mq5 | +//| Copyright 2022, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2022, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include +#include //EA paramters +#include //Trading hours checks +#include //Trading conditions checks +#include //Trading conditions checks +#include //Lot size calculator +#include //Lot size calculator +#include //Emergency close of transaction +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ + +#include +CiATR* atr; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- + atr = new CiATR(); + atr.Create(gSymbol, InpTimeFrame, InpAtrPeriod); +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + TimeCurrent(dt); + + SymbolInfoTick(_Symbol,last_tick); + + CheckOperationHours(); + CheckPreChecks(); + ScanPositions(); + + //Get ATR values + atr.Refresh(-1); + gAtr = atr.Main(1); + + if(!gIsPreChecksOk) + return; + + if(InpActivateRiskWatcher) + { + drawdownWatcher(); + CloseTransactions(); + } + ExecuteEntry(); + } +//+------------------------------------------------------------------+ diff --git a/Include/Nkanven/CandleCount/CheckHistory.mqh b/Include/Nkanven/CandleCount/CheckHistory.mqh new file mode 100644 index 0000000..8c5f1b0 --- /dev/null +++ b/Include/Nkanven/CandleCount/CheckHistory.mqh @@ -0,0 +1,27 @@ +//+------------------------------------------------------------------+ +//| CheckHistory.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" +//+------------------------------------------------------------------+ +//| defines | +//+------------------------------------------------------------------+ +// #define MacrosHello "Hello, world!" +// #define MacrosYear 2010 +//+------------------------------------------------------------------+ +//| DLL imports | +//+------------------------------------------------------------------+ +// #import "user32.dll" +// int SendMessageA(int hWnd,int Msg,int wParam,int lParam); +// #import "my_expert.dll" +// int ExpertRecalculate(int wParam,int lParam); +// #import +//+------------------------------------------------------------------+ +//| EX5 imports | +//+------------------------------------------------------------------+ +// #import "stdlib.ex5" +// string ErrorDescription(int error_code); +// #import +//+------------------------------------------------------------------+ diff --git a/Include/Nkanven/CandleCount/CloseTransactions.mqh b/Include/Nkanven/CandleCount/CloseTransactions.mqh new file mode 100644 index 0000000..ab1575d --- /dev/null +++ b/Include/Nkanven/CandleCount/CloseTransactions.mqh @@ -0,0 +1,74 @@ +//+------------------------------------------------------------------+ +//| CloseTransactions.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +CTrade trade; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void CloseTransactions() + { + bool result = true; + int cts = PositionsTotal(); + ulong theTicket; + double positionProfit = 0.0; + + if(cts > 0) + { + for(int i = cts-1; i>=0; i--) + { + ulong ticket = PositionGetTicket(i); + if(PositionSelectByTicket(ticket)) + { + if(PositionGetInteger(POSITION_MAGIC)==InpMagicNumber) + { + if(positionProfit > PositionGetDouble(POSITION_PROFIT)) + { + positionProfit = PositionGetDouble(POSITION_PROFIT); + theTicket = ticket; + } + } + } + else + { + Print("Error (", GetLastError(), ") while selecting position by ticket"); + } + } + if(gEmergencyClose) + { + if(!trade.PositionClose(theTicket)) + Print("Error (", GetLastError(), ") while deleting all buy positions"); + } + } + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void drawdownWatcher() + { + double amountDiff, equity, balance, percentDiff; + balance=AccountInfoDouble(ACCOUNT_BALANCE); + equity=AccountInfoDouble(ACCOUNT_EQUITY); + gEmergencyClose = false; + + if(equity < balance) + { + amountDiff = balance - equity; + percentDiff = (amountDiff*100)/balance; + + Print("amountDiff ", amountDiff, " percentDiff ", percentDiff, " InpMaxDrawdown ", InpMaxDrawdown); + + if(InpMaxDrawdown < percentDiff) + { + gEmergencyClose = true; + } + } + } +//+------------------------------------------------------------------+ diff --git a/Include/Nkanven/CandleCount/EntriesManager.mqh b/Include/Nkanven/CandleCount/EntriesManager.mqh new file mode 100644 index 0000000000000000000000000000000000000000..0651068ea423982b7462bf25755226b90d9b2a21 GIT binary patch literal 19390 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 z&aSymbolInfoDouble(gSymbol,SYMBOL_VOLUME_MAX)) + gLotSize=SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_MAX); + Print("Lot ", gLotSize, " Max lot ", SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_MAX)); + + Print("LotSize2 ", gLotSize); +//If the lot size is too small then set it to 0 and don't trade + if(gLotSizeInpMaxStopLoss) + { + gIsPreChecksOk=false; + Print("Default Stop Loss must be between Minimum and Maximum Stop Loss Allowed"); + return; + } +//Check if the default take profit you are setting in above the minimum and below the maximum + if(InpDefaultTakeProfitInpMaxTakeProfit) + { + gIsPreChecksOk=false; + Print("Default Take Profit must be between Minimum and Maximum Take Profit Allowed"); + return; + } +//Check if the Lot Size is between the minimum and maximum + if(InpDefaultLotSizeInpMaxLotSize) + { + gIsPreChecksOk=false; + Print("Default Lot Size must be between Minimum and Maximum Lot Size Allowed"); + return; + } +//Slippage must be >= 0 + if(InpSlippage<0) + { + gIsPreChecksOk=false; + Print("Slippage must be a positive value"); + return; + } +//MaxSpread must be >= 0 + if(InpMaxSpread<0) + { + gIsPreChecksOk=false; + Print("Maximum Spread must be a positive value"); + return; + } +//MaxRiskPerTrade is a % between 0 and 100 + if(InpMaxRiskPerTrade<0 || InpMaxRiskPerTrade>100) + { + gIsPreChecksOk=false; + Print("Maximum Risk Per Trade must be a percentage between 0 and 100"); + return; + } +//Spread is acceptable + long SpreadCurr=(int)Spread; + Print("Spread ", Spread); + if(SpreadCurr>InpMaxSpread) + { + gIsPreChecksOk=false; + Print("Spread is higher than Max acceptable spread"); + return; + } + } +//+------------------------------------------------------------------+ diff --git a/Include/Nkanven/CandleCount/ScanPositions.mqh b/Include/Nkanven/CandleCount/ScanPositions.mqh new file mode 100644 index 0000000..02076cf --- /dev/null +++ b/Include/Nkanven/CandleCount/ScanPositions.mqh @@ -0,0 +1,45 @@ +//+------------------------------------------------------------------+ +//| ScanPositions.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +//Scan all positions to find the ones submitted by the EA +//NOTE This function is defined as bool because we want to return true if it is successful and false if it fails +void ScanPositions() + { + +//Scan all the orders, retrieving some of the details + gTotalPositions = PositionsTotal(); + gTotalBuyPositions = 0; + gTotalSellPositions = 0; + + for(int i=0; i= InpDayTradingHourStart ", InpDayTradingHourStart ," ", dt.hour >= InpDayTradingHourStart); + Print("dt.hour ", dt.hour," <= InpDayTradingHourEnd ", InpDayTradingHourEnd ," ", dt.hour <= InpDayTradingHourEnd); + + //Check day trading hours + if(dt.hour >= InpDayTradingHourStart && dt.hour <= InpDayTradingHourEnd) + { + day_trading = true; + gIsOperatingHours=true; + Print("Day period trading"); + return; + } + + } +Print("InpTradingPeriods == NIGHT_TRADING ", InpTradingPeriods == NIGHT_TRADING); + if(InpTradingPeriods == NIGHT_TRADING) + { + //Check night trading hours + if(dt.hour >= InpNightTradingHourStart && dt.hour <= InpNightTradingHourEnd) + { + night_trading = true; + gIsOperatingHours=true; + Print("Night period trading"); + return; + } + } + + if(InpTradingPeriods == DAY_NIGHT_TRADING) + { + //Check night trading hours + if(day_trading || night_trading) + { + gIsOperatingHours=true; + Print("Day and night periods trading"); + return; + } + } + } +//+------------------------------------------------------------------+