From 0b5d6a5a00251201e885408e9ffae6215f1c6df2 Mon Sep 17 00:00:00 2001 From: Nkondog Anselme Date: Sun, 14 Nov 2021 08:14:52 +0100 Subject: [PATCH] Add others mql files --- Include/A_EntriesManagement.mqh | Bin 0 -> 19010 bytes Include/A_HistoryChecker.mqh | Bin 0 -> 4692 bytes Include/A_LotSizeCal.mqh | 62 +++++++++ Include/A_Parameters.mqh | 213 +++++++++++++++++++++++++++++ Include/A_PositionsManager.mqh | 123 +++++++++++++++++ Include/A_TradeManager.mqh | 23 ++++ Include/A_TradingHour.mqh | 27 ++++ Include/DL_CheckHistory.mqh | Bin 0 -> 5140 bytes Include/DL_CheckOperationHours.mqh | 46 +++++++ Include/DL_ClosePositions.mqh | 67 +++++++++ Include/DL_EntriesManagement.mqh | Bin 0 -> 17430 bytes Include/DL_ErrorHandling.mqh | 97 +++++++++++++ Include/DL_InitMQL4.mqh | 65 +++++++++ Include/DL_LotSizeCal.mqh | 54 ++++++++ Include/DL_Parameters.mqh | 175 ++++++++++++++++++++++++ Include/DL_PreChecks.mqh | 62 +++++++++ Include/DL_ScanPositions.mqh | 49 +++++++ Include/DL_TradeManagement.mqh | 20 +++ Include/DL_TradingBoundaries.mqh | 112 +++++++++++++++ Include/E_CheckHistory.mqh | Bin 0 -> 4886 bytes Include/E_ClosePositions.mqh | 81 +++++++++++ Include/E_EntriesManagement.mqh | Bin 0 -> 20382 bytes Include/E_Parameters.mqh | Bin 0 -> 20632 bytes Include/E_ScanPositions.mqh | 49 +++++++ Include/E_TradeManagement.mqh | 57 ++++++++ 25 files changed, 1382 insertions(+) create mode 100644 Include/A_EntriesManagement.mqh create mode 100644 Include/A_HistoryChecker.mqh create mode 100644 Include/A_LotSizeCal.mqh create mode 100644 Include/A_Parameters.mqh create mode 100644 Include/A_PositionsManager.mqh create mode 100644 Include/A_TradeManager.mqh create mode 100644 Include/A_TradingHour.mqh create mode 100644 Include/DL_CheckHistory.mqh create mode 100644 Include/DL_CheckOperationHours.mqh create mode 100644 Include/DL_ClosePositions.mqh create mode 100644 Include/DL_EntriesManagement.mqh create mode 100644 Include/DL_ErrorHandling.mqh create mode 100644 Include/DL_InitMQL4.mqh create mode 100644 Include/DL_LotSizeCal.mqh create mode 100644 Include/DL_Parameters.mqh create mode 100644 Include/DL_PreChecks.mqh create mode 100644 Include/DL_ScanPositions.mqh create mode 100644 Include/DL_TradeManagement.mqh create mode 100644 Include/DL_TradingBoundaries.mqh create mode 100644 Include/E_CheckHistory.mqh create mode 100644 Include/E_ClosePositions.mqh create mode 100644 Include/E_EntriesManagement.mqh create mode 100644 Include/E_Parameters.mqh create mode 100644 Include/E_ScanPositions.mqh create mode 100644 Include/E_TradeManagement.mqh diff --git a/Include/A_EntriesManagement.mqh b/Include/A_EntriesManagement.mqh new file mode 100644 index 0000000000000000000000000000000000000000..893777e20a9c803f0c5ba659c0e9f0bc5b7e30aa GIT binary patch literal 19010 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 literal 0 HcmV?d00001 diff --git a/Include/A_HistoryChecker.mqh b/Include/A_HistoryChecker.mqh new file mode 100644 index 0000000000000000000000000000000000000000..cce9256868ab3b6bd42f61c4df16378c2c6805cd GIT binary patch literal 4692 zcmd5~}Y@fsS5S~t8Erz{iS;TKi>bQRkZ)b8UN4TEgc@6gw z{P*F#i|2Q^o+73$X8Y2?^=9$RjwfS{5ql)hd@a5ThoaJ#r?@*r%!5=scZoj_5&O`i z&uYe~f%6e(t5HGSZ@Wen&zQUj`ryGSY97|1;(0L()@qk*{DPQ!V2uk{n`U!WYCZ~j zy7+VFWCR|Oab%m07?zavv8;ldE5T~=awPBZ4cW+{s2<~+IJ2^YnJ#|433u%-w8w5^ zFC_jWRAvAVXYdiO%tq<(c(8qYPj%aD*N9dpY2wRx%c$PRI;G{jtVI8>- zG1MjzbXQ)66_v{4ra3oc{Ys#){$hI_~Fb(v1EfsOPO8lDG9wLG&eu`ZZ zPrW3TwB3Kj&j~;CraM4y&n!NxT-x)&A!*d_6|QL-J@QWS6%p5#kqJksOPO^pgXvYvW>n&YP1t&i{U<~cB z@?;X960WM>o*W|=<%L-(s^x3=jXhgzWfgX77%zZPq6Nkd{+-TrI^QI>ABdXSGBajj z`pQnYgzrl~OGK`dqk1&v^Jx_sXM43)z+laK!}oj_nnvu?c-7H^P3)_i=*Bksatlw! zFZCT>Lp3T#nmuYtR_w7Q`|$V@YOq=2)s#)M&+paiX1ec{s5sL^CyDrN_-x`d(}wo# zmt-359_3ye=n30-it*inzioMiy0%NahW*Ra75Bid-=(NlWHNmvT^q81jHkZyJ$p9x zU7GDw4(&_!8&kqII*R8%s`E6@_=b9EY(4wK$ zk5W}7;oPd%@~}&kI|tzH9;(R`Cr{$De9=M#n;1?WVVFkfX~D?@?`aWd$09{i9E)^G z-}Vv7Jbrf02zTsR5o!sBu&!euM&34!kYCoLOI!?!>Gik2b z4#kM5pFHtqcUrD_fq62__6cJh5w$t;i_GMIL}Wg@K-qg;ZYD^Z%@!iF6Q5ZPJI>Z6 ze6zk$Td=JoeqP?7O9$ z2YGB*laF4tsBZ(Wc&u-Df>TtBBPd5keSV)hv*^5D^Ux#v%DZ2`y(xNnKFyvF!|1~M cbSLeCQ4tj8e<7ETYIZhx);sP#cj-Uy-(t#m7ytkO literal 0 HcmV?d00001 diff --git a/Include/A_LotSizeCal.mqh b/Include/A_LotSizeCal.mqh new file mode 100644 index 0000000..79f5c11 --- /dev/null +++ b/Include/A_LotSizeCal.mqh @@ -0,0 +1,62 @@ +//+------------------------------------------------------------------+ +//| A_LotSizeCal.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +//Lot Size Calculator +void LotSizeCalculate(double SL=0) + { +//If the position size is dynamic + if(RiskDefaultSize==RISK_DEFAULT_AUTO) + { + //If the stop loss is not zero then calculate the lot size + if(SL!=0) + { + double RiskBaseAmount=0; + //TickValue is the value of the individual price increment for 1 lot of the instrument, expressed in the account currenty + TickValue=SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE); + //Define the base for the risk calculation depending on the parameter chosen + if(RiskBase==RISK_BASE_BALANCE) + RiskBaseAmount=AccountInfoDouble(ACCOUNT_BALANCE); + if(RiskBase==RISK_BASE_EQUITY) + RiskBaseAmount=AccountInfoDouble(ACCOUNT_EQUITY); + if(RiskBase==RISK_BASE_FREEMARGIN) + RiskBaseAmount=AccountInfoDouble(ACCOUNT_FREEMARGIN); + //Calculate the Position Size + Print("Multiplier ", lotMultiplier, "Before lot multiplier ", (RiskBaseAmount*MaxRiskPerTrade/100)/(SL*TickValue)); + Print("RiskBaseAmount ", RiskBaseAmount, " MaxRiskPerTrade ", MaxRiskPerTrade, "Stop loss ", SL, " TickValue ", TickValue); + + LotSize=((RiskBaseAmount*MaxRiskPerTrade/100)/(SL*TickValue)); + + Print("After lot multiplier ", LotSize, " Lot multiplier ", lotMultiplier); + if(ActiveMartingale) + { + LotSize = LotSize * lotMultiplier; + } + } + //If the stop loss is zero then the lot size is the default one + if(SL==0) + { + LotSize=DefaultLotSize; + } + } +//Normalize the Lot Size to satisfy the allowed lot increment and minimum and maximum position size + LotSize=MathFloor(LotSize/SymbolInfoDouble(Symb,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(Symb,SYMBOL_VOLUME_STEP); + +//Limit the lot size in case it is greater than the maximum allowed by the user + if(LotSize>MaxLotSize) + LotSize=MaxLotSize; +//Limit the lot size in case it is greater than the maximum allowed by the broker + if(LotSize>SymbolInfoDouble(Symb,SYMBOL_VOLUME_MAX)) + LotSize=SymbolInfoDouble(Symb,SYMBOL_VOLUME_MAX); + Print("Lot ", LotSize, " Max lot ", SymbolInfoDouble(Symb,SYMBOL_VOLUME_MAX)); +//If the lot size is too small then set it to 0 and don't trade + if(LotSize < SymbolInfoDouble(Symb,SYMBOL_VOLUME_MIN)) + { + LotSize=0; + Print("Lot size too small"); + } + } diff --git a/Include/A_Parameters.mqh b/Include/A_Parameters.mqh new file mode 100644 index 0000000..42702da --- /dev/null +++ b/Include/A_Parameters.mqh @@ -0,0 +1,213 @@ +//+------------------------------------------------------------------+ +//| A_Parameters.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" +//+------------------------------------------------------------------+ +//| defines | +//+------------------------------------------------------------------+ + +//-ENUMERATIVE VARIABLES-// +//Enumerative variables are useful to associate numerical values to easy to remember strings +//It is similar to constants but also helps if the variable is set from the input page of the EA +//The text after the // is what you see in the input paramenters when the EA loads +//It is good practice to place all the enumberative at the start + +//Enumerative for the entry signal value +enum ENUM_SIGNAL_ENTRY + { + SIGNAL_ENTRY_NEUTRAL=0, //SIGNAL ENTRY NEUTRAL + SIGNAL_ENTRY_BUY=1, //SIGNAL ENTRY BUY + SIGNAL_ENTRY_SELL=-1, //SIGNAL ENTRY SELL + }; + +//Enumerative for the exit signal value +enum ENUM_SIGNAL_EXIT + { + SIGNAL_EXIT_NEUTRAL=0, //SIGNAL EXIT NEUTRAL + SIGNAL_EXIT_BUY=1, //SIGNAL EXIT BUY + SIGNAL_EXIT_SELL=-1, //SIGNAL EXIT SELL + SIGNAL_EXIT_ALL=2, //SIGNAL EXIT ALL + }; + +//Enumerative for the allowed trading direction +enum ENUM_TRADING_ALLOW_DIRECTION + { + TRADING_ALLOW_BOTH=0, //ALLOW BOTH BUY AND SELL + TRADING_ALLOW_BUY=1, //ALLOW BUY ONLY + TRADING_ALLOW_SELL=-1, //ALLOW SELL ONLY + }; + +//Enumerative for the base used for risk calculation +enum ENUM_RISK_BASE + { + RISK_BASE_EQUITY=1, //EQUITY + RISK_BASE_BALANCE=2, //BALANCE + RISK_BASE_FREEMARGIN=3, //FREE MARGIN + }; + +//Enumerative for the default risk size +enum ENUM_RISK_DEFAULT_SIZE + { + RISK_DEFAULT_FIXED=1, //FIXED SIZE + RISK_DEFAULT_AUTO=2, //AUTOMATIC SIZE BASED ON RISK + }; + +//Enumerative for the Stop Loss mode +enum ENUM_MODE_SL + { + SL_FIXED=0, //FIXED STOP LOSS + SL_AUTO=1, //AUTOMATIC STOP LOSS + }; + +//Enumerative for the Take Profit Mode +enum ENUM_MODE_TP + { + TP_FIXED=0, //FIXED TAKE PROFIT + TP_AUTO=1, //AUTOMATIC TAKE PROFIT + }; + +//Enumerative for the stop loss calculation +enum ENUM_MODE_SL_BY + { + SL_BY_POINTS=0, //STOP LOSS PASSED IN POINTS + SL_BY_PRICE=1, //STOP LOSS PASSED BY PRICE + }; + +//Enumerative for candle type +enum ENUM_CANDLE_TYPE + { + NEUTRAL_CANDLE=0, + BEARISH_CANDLE=1, + BULLISH_CANDLE=2, + }; + +//Enumerative for price momentum +enum ENUM_PRICE_MOMENTUM + { + UP=2, + DOWN=1, + NEUTRAL=0, + }; + +struct LastTransaction + { + string time; + int type; + double profit; + } lt; + +//-INPUT PARAMETERS-// +//The input parameters are the ones that can be set by the user when launching the EA +//If you place a comment following the input variable this will be shown as description of the field + +//This is where you should include the input parameters for your entry and exit signals +input string Comment_strategy="=========="; //Entry And Exit Settings +//Add in this section the parameters for the indicators used in your entry and exit + +//General input parameters +input string Comment_0="=========="; //Risk Management Settings +input ENUM_RISK_DEFAULT_SIZE RiskDefaultSize=RISK_DEFAULT_AUTO; //Position Size Mode +input double DefaultLotSize=1; //Position Size (if fixed or if no stop loss defined) +input ENUM_RISK_BASE RiskBase=RISK_BASE_BALANCE; //Risk Base +input double MaxRiskPerTrade=0.5; //Percentage To Risk Each Trade +input double MinLotSize=0.01; //Minimum Position Size Allowed +input double MaxLotSize=100; //Maximum Position Size Allowed + +input string Comment_1="=========="; //Trading Hours Settings +input bool UseTradingHours=false; //Limit Trading Hours +input string TradingHourStart="01"; //Trading Start Hour (Broker Server Hour) +input string TradingHourEnd="23"; //Trading End Hour (Broker Server Hour) +input string TradingStartMin="30"; //Trading Start minute (Broker Server Hour) +input string TradingEndMin="00"; //Trading End minute + +input string Comment_2="=========="; //Stop Loss And Take Profit Settings +input ENUM_MODE_SL StopLossMode=SL_AUTO; //Stop Loss Mode +input int DefaultStopLoss=0; //Default Stop Loss In Points (0=No Stop Loss) +input int MinStopLoss=0; //Minimum Allowed Stop Loss In Points +input int MaxStopLoss=5000; //Maximum Allowed Stop Loss In Points +input bool AtrStopLoss=false; //Set Stop loss based on ATR +input int atr_sl_factor=3; //Multiplicator for ATR stop loss +input ENUM_MODE_TP TakeProfitMode=TP_AUTO; //Take Profit Mode +input int DefaultTakeProfit=0; //Default Take Profit In Points (0=No Take Profit) +input int MinTakeProfit=0; //Minimum Allowed Take Profit In Points +input int MaxTakeProfit=5000; //Maximum Allowed Take Profit In Points +input double TakeProfitPercent=1.0; //Take Profit percent on risk base +input double Breakevent=1.0; //Minimum Profit to breakeven +input bool ProfitRun=true; +input bool ActiveMartingale=false; + +input string Comment_3="=========="; //Trailing Stop Settings +input bool UseTrailingStop=false; //Use Trailing Stop + +input string Comment_4="=========="; //Additional Settings +input int MagicNumber=0; //Magic Number For The Orders Opened By This EA +input string OrderNote=""; //Comment For The Orders Opened By This EA +input int Slippage=5; //Slippage in points +input double MaxSpread=10.0; //Maximum Allowed Spread To Trade In Points + +input string Comment_5="==========="; //Zigzag indicator setting +input int Depth=5; +input int Deviation=5; +input int Backstep=3; +input int GapPoint=100; //Minimum gap between peaks +input int Sensitivity=2; //Minimum peak at same level +input int LookBack=50; //Maximum peak to consider + +input int NumberOfCandles=3; + +//-GLOBAL VARIABLES-// +//The variables included in this section are global, hence they can be used in any part of the code +string Symb=Symbol(), server_time; + +long current_chart_id = ChartID(); + +bool IsPreChecksOk=false; //Indicates if the pre checks are satisfied +bool IsNewCandle=false; //Indicates if this is a new candle formed +bool IsSpreadOK=false; //Indicates if the spread is low enough to trade +bool IsOperatingHours=false; //Indicates if it is possible to trade at the current time (server time) +bool IsTradedThisBar=false; //Indicates if an order was already executed in the current candle +bool In_Trade = true; //Indicates if trade range has been formed +bool CanBuy = true; +bool CanSell = true; +bool ClosePosition = false; +bool FollowProfit = false; +bool UpTrendingMarket = false; +bool DownTrendingMarket = false; + +double TickValue=0; //Value of a tick in account currency at 1 lot +double LotSize=0; //Lot size for the position +double Tick_Size = SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_SIZE); //Tick size +double High[]; +double Low[]; +double PositionProfit; + +//Indicators + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +long Spread = SymbolInfoInteger(Symb,SYMBOL_SPREAD) / 100; //Check the impact. It's originally a double +int OrderOpRetry=10; //Number of attempts to retry the order submission +int TotalOpenOrders=0; //Number of total open orders +int TotalOpenBuy=0; //Number of total open buy orders +int TotalOpenSell=0; //Number of total open sell orders +int StopLossBy=SL_BY_POINTS; //How the stop loss is passed for the lot size calculation +double lotMultiplier =1; //Adust lot size according to loosing trades +int candleCounter =0; +double firstCandleOpen =0; +double lastCandleClose=0; +double ProfitRunTargetPercent=10.0; + +datetime LastBarTraded; + +MqlDateTime dt; +MqlTick last_tick; + +ENUM_SIGNAL_ENTRY SignalEntry=SIGNAL_ENTRY_NEUTRAL; //Entry signal variable +ENUM_SIGNAL_EXIT SignalExit=SIGNAL_EXIT_NEUTRAL; +ENUM_CANDLE_TYPE candleType=NEUTRAL_CANDLE; +ENUM_PRICE_MOMENTUM priceMomentum=NEUTRAL; +//+------------------------------------------------------------------+ diff --git a/Include/A_PositionsManager.mqh b/Include/A_PositionsManager.mqh new file mode 100644 index 0000000..ac8a2b1 --- /dev/null +++ b/Include/A_PositionsManager.mqh @@ -0,0 +1,123 @@ +//+------------------------------------------------------------------+ +//| A_PositionsManager.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; + +//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 +bool ScanPositions() + { + +//Scan all the orders, retrieving some of the details + TotalOpenOrders = 0; + TotalOpenBuy = 0; + TotalOpenSell = 0; + for(int i=0; iLastBarTraded || LastBarTraded==0) + LastBarTraded=(datetime)PositionGetInteger(POSITION_TIME); + } + Print("Total positions ", TotalOpenOrders, " - Total buys ", TotalOpenBuy, " - Total sells ", TotalOpenSell); + return true; + } + +// We declare a function CloseOpenPositions of type int and we want to return +// the number of positions that are closed. +void CloseOpenPositions() + { + + int TotalClose=0; // We want to count how many orders have been closed. + int c_slippage = Slippage; + Print("Close position status ", ClosePosition); +// Normalization of the slippage. + if(_Digits==3 || _Digits==5) + { + c_slippage=c_slippage*10; + } + +// We scan all the orders backwards. +// This is required as if we start from the first order, we will have problems with the counters and the loop. + for(int i=PositionsTotal()-1; i>=0; i--) + { + + ulong ticket = PositionGetTicket(i); + + Print("Position profit is ", PositionGetDouble(POSITION_PROFIT)); + PositionProfit = PositionGetDouble(POSITION_PROFIT); + /*if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && iClose(Symb, PERIOD_CURRENT, 1) < Senkouspanb && iClose(Symb, PERIOD_CURRENT, 1) < Senkouspana) + { + // We select the order of index i, selecting by position and from the pool of market/pending trades. + //If the selection is successful we try to close the order. + if(trade.PositionClose(ticket, c_slippage)) + { + TotalClose++; + } + else + { + // If the order fails to be closed, we print the error. + Print("Order failed to close with error - ",GetLastError()); + } + } + + if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && iClose(Symb, PERIOD_CURRENT, 1) > Senkouspanb && iClose(Symb, PERIOD_CURRENT, 1) > Senkouspana) + { + // We select the order of index i, selecting by position and from the pool of market/pending trades. + //If the selection is successful we try to close the order. + if(trade.PositionClose(ticket, c_slippage)) + { + TotalClose++; + } + else + { + // If the order fails to be closed, we print the error. + Print("Order failed to close with error - ",GetLastError()); + } + }*/ + + if(ClosePosition) + { + if(trade.PositionClose(ticket, c_slippage)) + { + TotalClose++; + ClosePosition = false; + } + else + { + // If the order fails to be closed, we print the error. + Print("Order failed to close with error - ",GetLastError()); + } + } + // We can use a delay if the execution is too fast. + // Sleep() will wait X milliseconds before proceeding with the code. + // Sleep(300); + } + } +//+------------------------------------------------------------------+ diff --git a/Include/A_TradeManager.mqh b/Include/A_TradeManager.mqh new file mode 100644 index 0000000..fa829a9 --- /dev/null +++ b/Include/A_TradeManager.mqh @@ -0,0 +1,23 @@ +//+------------------------------------------------------------------+ +//| A_TradeManager.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +void ProfitRunner() + { + if(ProfitRun) + { + if(iClose(Symb, _Period, 1) < iClose(Symb, _Period, 2) && TotalOpenBuy > 0) + { + ClosePosition = true; + } + if(iClose(Symb, _Period, 1) > iClose(Symb, _Period, 2) && TotalOpenSell > 0) + { + ClosePosition = true; + } + } + Print("Looking to close this position ", ClosePosition); + } \ No newline at end of file diff --git a/Include/A_TradingHour.mqh b/Include/A_TradingHour.mqh new file mode 100644 index 0000000..72d352a --- /dev/null +++ b/Include/A_TradingHour.mqh @@ -0,0 +1,27 @@ +//+------------------------------------------------------------------+ +//| A_TradingHour.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/DL_CheckHistory.mqh b/Include/DL_CheckHistory.mqh new file mode 100644 index 0000000000000000000000000000000000000000..992b7ab2ff7b4b75621eb251861bcb95bdd49785 GIT binary patch literal 5140 zcmd5<+fGwa5S?ce|6vDT+JNFEzKED8MI`|twwmxnDju}4P;Czyg8r}kgu2$Aj(d7; z6fa40LOI=MpSi4Av-b4ok5yTfWx2Tk*RoufYlvo5zDoFyS4XzxKsMyPWO67UHT&%_t81S!av=kXr6~PcZI6=*Q9hM?5=D}L+8XFf0?f>7c91FP4eC2MXsb>vju;2o+5FYSUO zyptDp_OU`6gQ?coowr9lq;@6$6LiusJdEJO?<__c@a7r3XP4}vzR}0obRXHRk-vrB zRY%yxdOvn`00KdJ(;POC`xuwnB%%T5S&%)fFpCi?(8WEKi<&!;7M^X&OWBfL>EJZz zK$qJy5zn3qe4E%FB7zqF6uT79N<%EOc26U!JP+*R$-}&c$Z6JV2OhaTfpy!%?27p3 zvJ?5jxISY40Pl@qpBUXK;ky?xA^I&@a+U*-QGX%E7@$x7WDMBNvn$1Gk)+xkA5PnN}sNaDcAs4N;S*fehGx*IT3v6c#cH6ifp;uFnTh;l$ zoM}1Vl-qYi&1{(&v#@iH48MTyi?~Weu9BmAG)D8=Ix;TyV7rEyn)O!f}T;> zL2qqhzTwQ(L%;3doAE|{`%kYj%}BHNOrh#Mc4Z$PpPJYM!K?3IPPshWvUvJXg~(+3 zN?q$&K*m$I`J6qQ$1W{)s&a^ait6V3-}Ec3tw7V#IbsUeLq~BAr|On@#wXN4WAgzR zwgv28VPzBh+4HK<)lsUdB+jizo%UU#+&KVmU!j_u{P~M$o;SLPU^{ZX+Bb2kQ=K{t zO?in1b%7Ig@nqnhM_4CvrhkSewZ+zm8xiMkFIJS*)v8<-^A0qHc(-FMXtRsRY(g=s zo=N6A;b?r&dBvVvXJ#%sTRZ#h&3BS{^J~TdMYa4nL_Kfe&!#Xx&&_u11 zm*%N+0Z%7(Qybjne^c)&-}>Hs8F>uUlV8y|_om9N6UaT(jw>UawwzWCO^w>WZ51-L zWKS4=T1(4RS8YFMgESwO->T=HJt*KP%}KF( z9$bz}V-umbT)h8QnuYw1svOw;b#sn?_iuCXGp)B= TradingStartMin) + { + IsOperatingHours=true; + } + if(dt.hour > TradingHourStart) + { + IsOperatingHours=true; + } + } + + if(TradingHourStart>TradingHourEnd && ((dt.hour>=TradingHourStart && dt.hour<=23) || (dt.hour<=TradingHourEnd && dt.hour>=0)) && In_Trade) + { + IsOperatingHours=true; + } + + if(IsOperatingHours == false) + { + rangeUpdated = false; + } + } +//+------------------------------------------------------------------+ diff --git a/Include/DL_ClosePositions.mqh b/Include/DL_ClosePositions.mqh new file mode 100644 index 0000000..b262b0f --- /dev/null +++ b/Include/DL_ClosePositions.mqh @@ -0,0 +1,67 @@ +//+------------------------------------------------------------------+ +//| DL_ClosePositions.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; + +// We declare a function CloseOpenPositions of type int and we want to return +// the number of positions that are closed. +void CloseOpenPositions() + { + + int TotalClose=0; // We want to count how many orders have been closed. + int c_slippage = Slippage; + +// Normalization of the slippage. + if(_Digits==3 || _Digits==5) + { + c_slippage=c_slippage*10; + } + + if(TimeToString(LastBarTraded, TIME_DATE) == TimeToString(TimeCurrent(), TIME_DATE)) + return; + +// We scan all the orders backwards. +// This is required as if we start from the first order, we will have problems with the counters and the loop. +// We select the order of index i, selecting by position and from the pool of market/pending trades. + + double accountProfit = AccountInfoDouble(ACCOUNT_EQUITY) - AccountInfoDouble(ACCOUNT_BALANCE); + double accountProfitPercent = (fabs(accountProfit)*100)/AccountInfoDouble(ACCOUNT_BALANCE); + if(accountProfit < 0 && accountProfitPercent >= 10) + { + + + + for(int i=PositionsTotal()-1; i>=0; i--) + { + + ulong ticket = PositionGetTicket(i); + + //If the selection is successful we try to close the order. + if(trade.PositionClose(ticket, c_slippage)) + { + TotalClose++; + } + else + { + // If the order fails to be closed, we print the error. + Print("Order failed to close with error - ",GetLastError()); + } + + /*Print("Position profit is ", PositionGetDouble(POSITION_PROFIT)); + if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && PositionGetDouble(POSITION_PRICE_CURRENT) < upper_boundary || PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && PositionGetDouble(POSITION_PRICE_CURRENT) < upper_boundary) + { + + }*/ + + // We can use a delay if the execution is too fast. + // Sleep() will wait X milliseconds before proceeding with the code. + // Sleep(300); + } + } + } +//+------------------------------------------------------------------+ diff --git a/Include/DL_EntriesManagement.mqh b/Include/DL_EntriesManagement.mqh new file mode 100644 index 0000000000000000000000000000000000000000..8cc157c66b9033d517fc84a1a3edfe3e02ac08bc GIT binary patch literal 17430 zcmeI4+io1k5r+FZK;B`kATcG8k{u+uu(JUqlClX~q`{S)_)4HiN@Bb`n7g#3$bR6w zM3VpOVzGL9X7)fafM5uO);lvj)zwvh9lO{6{m=b$Kiy4h@4?^Q^xO0sadSWYoCY`k zw~@Y1Pt#^PNz-(mj?!V8q{nGb*L&%Ou8#GOXZQ5&$MjP3|NIX8tf$j-mfqx?8L>!DWAA|H==4M}?6W!a>=ezNaKfe?2=UMuP`tMXa7-WuXZQM#XucKQTF-0zQa4 z1N}S8QbeNzeMg2!?nvKGB=_cuZBBTb3M1zl@wwizKfLQ!fff)E>*(hLKXsBm7R7-i zev zubro{{x^9h)?gNMk!5O#1!L&d5&W{?iZx>|$p7Qa=ZT&o7j)D2=0NXUPl9k<;%-|q zdnMmxe2jHl|5IrcKVVvI`U&uNB3s3Oz)87w)_jsV!pjCvfmxHG z`z~7v_Tzd#)T~c3;wR~$D4h4Mr>(nEruC{0(`)gyFEp8tJl40dz8?umNG)_ljAc#u zO7o$tfA2C9Kg&FY$Ge~Iw2=Ifyn$h4oL6J$In183M&~@guq|nWr33wijpMINj^Wol z{8&#;g$U$mnldDsR-b1Yd+FKbnh!+z%|ad{R*c>JqE+87*3G>bVOo76KBl5SmOnIq zwIgkUDeU=g%6^uWMPP(A?Pu+QQ;X^oX%z28d|{RY`HI2S+$N9OR}w+6m*?X3BENTU zA!(GJql~leJyz?kr$dgf~f)ksWysv{EVq&t@KK zZLFcpUx>S&KXt`ji*k$WWF*;stv?VmODkXId0#H57i8*QVOhP9m*Gj!?JOGq552fF z=4oamo#6Mbqnj>GH*;T)`la6c^VS`qgjialu*ui;GS@&-)5@Dst>n>SbLpKtMl4eW zl=Q==v}=Hf#_bu&h?+7e?S_nj=g8Eo%`*`yORSH(7t%3x0dX9UAF=tlo}FAq1IE`r ztkguTV3=lkgl5iPW4q3;${FF;qmJjNa8+U$FMn|rgFQN$x1q)#%AfX+A87_+0iK!K zY0>wd$jAO5>Wn{C#6yZ*@6OUB`Q1D}SW1KX=sNN@k6g?BZK2yPyWNtU2a>D%>A>!+ z%E;tj>T0OiwyWqyoO`Nl^n1x^Q{OyJSoFv1lsL5bT+(qI+j}7wd$h_0!2RigUiSoPijtTjpMxxV}mP{d4>sYkSj64vlq{j$-18Fu4UF_%}#~L0al#~ zmEN?aP0KlaZpZgyy$fZtSh{wPlzsd|8rcv%%P2M)GuITla!u1g8&P(@rcl~RTW@RP zq+EIZ_8sBJeH)&$v~8P@&$1%6yUXYWsUz)U$=|Z7TFZ+{_d)JaH2k4-N5?#4?$YC}dok0YkkR=-89$v3SiYasLN%0<_7-|~v58g-a^9AinP zPk&)G-F#S8)|G!<9}n)+Emt+K{#x=4sky~<*{#_t(G`2{#*5E@Og(Cp7WqWjo^O#| zRF=2OE-Iz2+m?B^vdk_DH)owrz0?K~!t<`hEYzvYmiWzCsn1t)J9L}E=MheHbRH$FW2*K=#J-yD_0$ikkhJA z9sCecx>h>NE6$s<|J}vro~P$|^Ur>NF&-=;A;;saxzJbC*0p|!V02`5q+h(_xgvz= ztjz0Hg+uFxoJ#Y^f3;Ifv!pnCg>8K{>p!z5kLb~ZShT+J%6fi=-CliPcI-6CRJ*bP zv)fXRo}v1iwKlq}r7K=rkK#jy{QhRhbsVlOIeX@GP#(c1Eg)o@$Sf z{lH&yhHMta4(rNgJzeI&Yn@rMz0)0w%wN@#jfgf>yzB29f5?wbe*W24gUya9_-)%A z3AxvmYZrx^vrVU7XPV2|r&D1So_UrwY8A=N*{IJ~bNzng$5gQ&@?)~LK=oqz;Vf@7 zFF);ncd@x0QzeFj|M@k+?DrSr;n$iU<0T_o_Dt0FStG9>sEgR#H=v(+kp8K=6IF87 z;WQh6nd{Gk+y!C>;yimEJC))+P&;v9yPRET3yxHUaI%0LH%?h~)f>JC!g;h~{n-rc zeZZIPNOF#fZnxc`;!I$vl}^h%po;=0065bD0-)g6&G$hB^C3(2 zbM4GZRPF4&+W9%x866yY>zrtzCm59^Ggy6Tr`T9E{eeBbG1l0qXsl8s9B z&RML+=ev{pF;3s}3y^E~hI-CPh==+_yWeTGJVW}WHjSRuvrXJn)9eU+zWY*3p-&ce zzn`OZozP*`px{uvq1QG?P-%CIX7lOQ>`igHk@@^V*1}0Rtb)CSS^T!o=2%6}DY3CM zf|Z#422SdeF?bv6g5eKXag0T`V9ZB&hm)QeDDsgYYnlC8(^=DhnQ!vllS%d|Z9Ref ztp<-HaR|Q4I`B-~aoz+Awwx0whP9aOV(aW~xdp|(G`&Cb4V=ZoQ{kJ99v#1FK6iyD zE>HZFvwF1PUE>Z}+Rj*vL*hOXdD_V&c<$dbD?NCBXPrF?MwasA)H`ck*9!1jEBPEe zcOJ;MO?2&66ft1!l8(#sw&WjF`#O?n$uKxBu%IS{zKZMzesn-LR|Olw-SN*FGagf4q5CcUc>9RA3{1{x)I|NM;044Ucaf zO!5RrPQ6aksGo2On+a4Jn!^SLIv)o<7g@jg$)+sv=Vex4Ht(PK;y9%Yw>8I%h|GX< zV|EVEBCpfoze9P?8??t&RL%*tn;vYIddhFTh3R` zGn74)HuG-01!d!sj5+2t$$z3#gP&#%Fz-CshTej# z^Ec87l*h`Ub|hoYqXeoq^Ert1+>dl@KNhlg^$UbejbtsxozZ7+_#h+pBJXFD|BzM8 z=a1hV)ttHf=2y#QbXu%Bt?iuO#aws(x_((?_pCj?+5J;x8AM6@1rK#tb3cT$DV*Tk zlArlP+Il3debtd!*7U(NXPHYM;_@Bk+31hjZ`0cOPfd-itFFeJT34mEJmy0ehOYy8 zz?%O9VaxY~L7tycA#0dud>eJp8tJWhdv>)oS)}<$vi7Jq5_R%8x?^R;Sk2d78Pct; zY1zsmGCq=buzg|sRa1Ko?+H*xP-p#K^AaV$(9Ba|!A_WL>KWM_dy3X2uVrYlmb`~d z6FaqDgVVJ;C)o=hF@MT`Me1Zm`>$<*| zuVR+^DN-ThtnV9jG~qd3y)HxFthw+KbRkOLy_-Gsx-e@Q%7(si?$pn;HR(Bb`~nI} z{W;XLyiU$Wn4hS*oxiPXP|u` zTAYgJ9PPHgjg+yh>u*!vM!L4At_!O%44bQ>LzNUU!Fscw>24E?_Ez(rz5QL*jc2X+ zg&MWY;Z?5D@hkIL=)!14jRc(k;kF6+V4S zhzit%WJ?@+2h+OXCGxy0Vvz~F*Zzewlk`>U`*8QJxOtQwMaxLotSize) + LotSize=MaxLotSize; +//Limit the lot size in case it is greater than the maximum allowed by the broker + if(LotSize>SymbolInfoDouble(Symb,SYMBOL_VOLUME_MAX)) + LotSize=SymbolInfoDouble(Symb,SYMBOL_VOLUME_MAX); + Print("Lot ", LotSize, " Max lot ", SymbolInfoDouble(Symb,SYMBOL_VOLUME_MAX)); +//If the lot size is too small then set it to 0 and don't trade + if(LotSizeMaxStopLoss) + { + IsPreChecksOk=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(DefaultTakeProfitMaxTakeProfit) + { + IsPreChecksOk=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(DefaultLotSizeMaxLotSize) + { + IsPreChecksOk=false; + Print("Default Lot Size must be between Minimum and Maximum Lot Size Allowed"); + return; + } +//Slippage must be >= 0 + if(Slippage<0) + { + IsPreChecksOk=false; + Print("Slippage must be a positive value"); + return; + } +//MaxSpread must be >= 0 + if(MaxSpread<0) + { + IsPreChecksOk=false; + Print("Maximum Spread must be a positive value"); + return; + } +//MaxRiskPerTrade is a % between 0 and 100 + if(MaxRiskPerTrade<0 || MaxRiskPerTrade>100) + { + IsPreChecksOk=false; + Print("Maximum Risk Per Trade must be a percentage between 0 and 100"); + return; + } + } diff --git a/Include/DL_ScanPositions.mqh b/Include/DL_ScanPositions.mqh new file mode 100644 index 0000000..4cb5d70 --- /dev/null +++ b/Include/DL_ScanPositions.mqh @@ -0,0 +1,49 @@ +//+------------------------------------------------------------------+ +//| DL_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 +bool ScanPositions() + { + +//Scan all the orders, retrieving some of the details + TotalOpenOrders = 0; + TotalOpenBuy = 0; + TotalOpenSell = 0; + for(int i=0; iLastBarTraded || LastBarTraded==0) + LastBarTraded=(datetime)PositionGetInteger(POSITION_TIME); + } + Print("Total positions ", TotalOpenOrders, " - Total buys ", TotalOpenBuy, " - Total sells ", TotalOpenSell); + return true; + } \ No newline at end of file diff --git a/Include/DL_TradeManagement.mqh b/Include/DL_TradeManagement.mqh new file mode 100644 index 0000000..99524ff --- /dev/null +++ b/Include/DL_TradeManagement.mqh @@ -0,0 +1,20 @@ +//+------------------------------------------------------------------+ +//| DL_TradeManagement.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +bool ShouldTrade() + { + //double minProfitAllow = ((AccountInfoDouble(ACCOUNT_BALANCE)*MaxRiskPerTrade)/100)*(TakeProfitPercent*MinStopTradeProfit); +Print("1 Profit ", lt.profit, " Hist time ", lt.time, " current time ", TimeToString(TimeCurrent(), TIME_DATE)); + if(lt.time == TimeToString(TimeCurrent(), TIME_DATE) && lt.profit > 0) + { + Print("2 Profit ", lt.profit); + return false; + } + return true; + } +//+------------------------------------------------------------------+ diff --git a/Include/DL_TradingBoundaries.mqh b/Include/DL_TradingBoundaries.mqh new file mode 100644 index 0000000..d3b231b --- /dev/null +++ b/Include/DL_TradingBoundaries.mqh @@ -0,0 +1,112 @@ +//+------------------------------------------------------------------+ +//| DL_TradingBoundaries.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +double newHigh, newLow; +bool rangeUpdated = false; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void drawRange() + { + string candles_times; + int time_to_string; + ushort a; + string d_time = TimeToString(iTime(Symb,PERIOD_M5,0), TIME_MINUTES); + string open_hour[]; + string obj_name = "Upper boundary", obj_name_l = "Lower boundary"; + + ArraySetAsSeries(High,true); + CopyHigh(_Symbol,_Period,0,MaxCandleIteration,High); + + ArraySetAsSeries(Low,true); + CopyLow(_Symbol,_Period,0,MaxCandleIteration,Low); + +//--- Get the separator code + a = StringGetCharacter(":",0); + + int k = StringSplit(d_time, a, open_hour); + + if(k>0) + { + server_time = "Server time on last 5 Min candle => Hour = " +open_hour[0]+ ", Minute = " +open_hour[1]; + } + +// Get trading range + for(int j = 0; j <= MaxCandleIteration; j++) + { + string result[]; + candles_times = TimeToString(iTime(Symb,_Period,j), TIME_MINUTES); + time_to_string = StringSplit(candles_times, a, result); + //Print("Is trading boundary "+(result[0] == TradingBoundaryHour && result[1] == TradingBoundaryMin)); + if(result[0] == TradingBoundaryHour && result[1] == TradingBoundaryMin) + { + if(!rangeUpdated) + { + upper_boundary = iHigh(Symb, _Period, j) + rangemargin; + lower_boundary = iLow(Symb, _Period, j)- rangemargin; + } + + UpdateRange(); + //Print("Iteration no "+iTime(Symb,PERIOD_M5,j)); + ObjectCreate(current_chart_id, obj_name, OBJ_HLINE, 0, iTime(Symb,_Period,j), upper_boundary); + + //--- set color to Red + ObjectSetInteger(current_chart_id, obj_name, OBJPROP_COLOR, clrRed); + //--- set object width + ObjectSetInteger(current_chart_id, obj_name, OBJPROP_WIDTH, 2); + //--- Move the line + ObjectMove(current_chart_id, obj_name, 0, iTime(Symb,_Period,j), upper_boundary); + + ObjectCreate(current_chart_id, obj_name_l, OBJ_HLINE, 0, iTime(Symb,_Period,j), lower_boundary); + + //--- set color to Red + ObjectSetInteger(current_chart_id, obj_name_l, OBJPROP_COLOR, clrRed); + //--- set object width + ObjectSetInteger(current_chart_id, obj_name_l, OBJPROP_WIDTH, 2); + //--- Move the line + ObjectMove(current_chart_id, obj_name_l, 0, iTime(Symb,_Period,j), lower_boundary); + + if(!rangedetection) + { + upper_boundary = upperboundary; + lower_boundary = lowerboundary; + } + + //Print("upper_boundary ", upper_boundary, " lower_boundary ", lower_boundary); + //Print("Real high ", iHigh(Symb, PERIOD_M5, j), " Real low ", iLow(Symb, PERIOD_M5, j), " as of ", TimeToString(iTime(Symb,PERIOD_M5, j))); + In_Trade = true; + rangeScope = fabs(upper_boundary-lower_boundary); + break; + } + ObjectDelete(current_chart_id, obj_name_l); + ObjectDelete(current_chart_id, obj_name); + In_Trade = false; + } + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void UpdateRange() + { + newHigh = iHigh(Symb, PERIOD_CURRENT, 0); + newLow = iLow(Symb, PERIOD_CURRENT, 0); + Print("Updating range high from ", upper_boundary, "to ", newHigh, " and low from ", lower_boundary, " to ", newLow); + if(newHigh > upper_boundary && TotalOpenBuy > 0) + { + upper_boundary = newHigh; + rangeUpdated = true; + } + if(lower_boundary > newLow && TotalOpenSell > 0) + { + lower_boundary = newLow; + rangeUpdated = true; + } + } +//+------------------------------------------------------------------+ diff --git a/Include/E_CheckHistory.mqh b/Include/E_CheckHistory.mqh new file mode 100644 index 0000000000000000000000000000000000000000..aa967ff0957a7cbffdf4a11b375ae5b73ff64be2 GIT binary patch literal 4886 zcmd5=T~8B16ur+T{)e$9rVW)36JJC~lvX7HA-0(CL@F%USSWV4ng;#9@+Z`D=JqIzMZSppr=uxHvL){&kz@HFucRxf zWYU*`jAU8PB(c<9mD4HoIQ(#pZl`5 zZ-yK=Z*egj6(HcYb5!w&nPx!`IJiL0<2+P6F6N1~%3ah-JpoEjy?;b&?BV~q50$z| zNHq3XB%A&RyUv&O#mw0!a6%WX>`MDXRcgM<>E+e0J10Z%G#Q<2t|Nma_Ll@Kv;pp4 zk5-fShw={JknK5?wOB`4VPyw1l+hjc2D^*pv464G1pO(P?;INX&=IdJTIulR2-=h1 ztYSZ+j?s7>(XE!Bpg&Ewu!Z@KXJLm3IBAc4*n;l^43)`|=&r^pSxU?%8SB zBU7p3T~pr3w(Lm*-MfK4TFY6S@8bNLu|0+bRs1w|!JhgITk>*;KC0~BHn>xuUp@Gg z*V=$a&Zm%WYv^4Ze^wxKkjbvc3~jr_Oc&n{po4K*%YCu$W5VcHr4mVYh>YrU-bROh z67OUjR&%cr>@`b5?oMIJ0CIzu-7!`v^J(<$IwW0>ZWt`vc50v7R-r3_aaSWtD)r4bRbWl_++OfZGFP zlP5KvVCVUw1q*gCoIJoVj?i6zlY3s%D$ZPGjHGca<0XCDgC)!O+5RE!#Pde10Y+f7 zEK(|Y@@l$tN1@#;&ogxGq#}%RS;~CB4q+L3b$C`C0T15WjNwL^Lxn>jdM3^z8 zp^g!?IpT}R}&&|%#*NL9Y$QNhBv)+*h7U`7q6A8y}DgXcg literal 0 HcmV?d00001 diff --git a/Include/E_ClosePositions.mqh b/Include/E_ClosePositions.mqh new file mode 100644 index 0000000..7b061e4 --- /dev/null +++ b/Include/E_ClosePositions.mqh @@ -0,0 +1,81 @@ +//+------------------------------------------------------------------+ +//| E_ClosePositions.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; + +// We declare a function CloseOpenPositions of type int and we want to return +// the number of positions that are closed. +void CloseOpenPositions() + { + + int TotalClose=0; // We want to count how many orders have been closed. + int c_slippage = Slippage; +Print("Close position status ", ClosePosition); +// Normalization of the slippage. + if(_Digits==3 || _Digits==5) + { + c_slippage=c_slippage*10; + } + +// We scan all the orders backwards. +// This is required as if we start from the first order, we will have problems with the counters and the loop. + for(int i=PositionsTotal()-1; i>=0; i--) + { + + ulong ticket = PositionGetTicket(i); + + Print("Position profit is ", PositionGetDouble(POSITION_PROFIT)); + PositionProfit = PositionGetDouble(POSITION_PROFIT); + if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && iClose(Symb, PERIOD_CURRENT, 1) < Senkouspanb && iClose(Symb, PERIOD_CURRENT, 1) < Senkouspana) + { + // We select the order of index i, selecting by position and from the pool of market/pending trades. + //If the selection is successful we try to close the order. + if(trade.PositionClose(ticket, c_slippage)) + { + TotalClose++; + } + else + { + // If the order fails to be closed, we print the error. + Print("Order failed to close with error - ",GetLastError()); + } + } + + if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && iClose(Symb, PERIOD_CURRENT, 1) > Senkouspanb && iClose(Symb, PERIOD_CURRENT, 1) > Senkouspana) + { + // We select the order of index i, selecting by position and from the pool of market/pending trades. + //If the selection is successful we try to close the order. + if(trade.PositionClose(ticket, c_slippage)) + { + TotalClose++; + } + else + { + // If the order fails to be closed, we print the error. + Print("Order failed to close with error - ",GetLastError()); + } + } + + if(ClosePosition) + { + if(trade.PositionClose(ticket, c_slippage)) + { + TotalClose++; + ClosePosition = false; + } + else + { + // If the order fails to be closed, we print the error. + Print("Order failed to close with error - ",GetLastError()); + } + } + // We can use a delay if the execution is too fast. + // Sleep() will wait X milliseconds before proceeding with the code. + // Sleep(300); + } + } +//+------------------------------------------------------------------+ diff --git a/Include/E_EntriesManagement.mqh b/Include/E_EntriesManagement.mqh new file mode 100644 index 0000000000000000000000000000000000000000..d69973d97d3cdc9ef5640bd721ceb171be5e4681 GIT binary patch literal 20382 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 F@L#s;__F{2 literal 0 HcmV?d00001 diff --git a/Include/E_ScanPositions.mqh b/Include/E_ScanPositions.mqh new file mode 100644 index 0000000..53f5789 --- /dev/null +++ b/Include/E_ScanPositions.mqh @@ -0,0 +1,49 @@ +//+------------------------------------------------------------------+ +//| E_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 +bool ScanPositions() + { + +//Scan all the orders, retrieving some of the details + TotalOpenOrders = 0; + TotalOpenBuy = 0; + TotalOpenSell = 0; + for(int i=0; iLastBarTraded || LastBarTraded==0) + LastBarTraded=(datetime)PositionGetInteger(POSITION_TIME); + } + Print("Total positions ", TotalOpenOrders, " - Total buys ", TotalOpenBuy, " - Total sells ", TotalOpenSell); + return true; + } \ No newline at end of file diff --git a/Include/E_TradeManagement.mqh b/Include/E_TradeManagement.mqh new file mode 100644 index 0000000..9b95978 --- /dev/null +++ b/Include/E_TradeManagement.mqh @@ -0,0 +1,57 @@ +//+------------------------------------------------------------------+ +//| E_TradeManagement.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +//Done for the day after a profitable trade +//If closed trade was opened the day before, look for trade opportunities +double minProfitAllow = AccountInfoDouble(ACCOUNT_BALANCE)*(Breakevent/100); +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void TradeManager() + { + CanSell = true; + CanBuy = true; + + if(lt.time == TimeToString(TimeCurrent(), TIME_DATE)) + { + if(lt.type == DEAL_TYPE_BUY && lt.profit < 0) + { + CanBuy = false; + } + if(lt.type = DEAL_TYPE_SELL && lt.profit < 0) + { + CanSell = false; + } + } + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void ProfitRunner() + { + Print("Min acceptablbe profit ", minProfitAllow); + ClosePosition = false; + if(PositionProfit > minProfitAllow) + FollowProfit=true; + + if(FollowProfit) + { + if(Kijunsen > iClose(Symb, _Period, 1) && TotalOpenBuy > 0) + { + ClosePosition = true; + } + if(Kijunsen < iClose(Symb, _Period, 1) && TotalOpenSell > 0) + { + ClosePosition = true; + } + } + Print("Looking to close this position ", ClosePosition, " Follow profit ", FollowProfit); + } +//+------------------------------------------------------------------+