diff --git a/MQL4/LotCal.ex4 b/MQL4/Experts/Nkanven/LotCal.ex4 similarity index 100% rename from MQL4/LotCal.ex4 rename to MQL4/Experts/Nkanven/LotCal.ex4 diff --git a/MQL4/LotCal.mq4 b/MQL4/Experts/Nkanven/LotCal.mq4 similarity index 100% rename from MQL4/LotCal.mq4 rename to MQL4/Experts/Nkanven/LotCal.mq4 diff --git a/MQL4/LotCalTrader-V2.ex4 b/MQL4/Experts/Nkanven/LotCalTrader-V2.ex4 similarity index 100% rename from MQL4/LotCalTrader-V2.ex4 rename to MQL4/Experts/Nkanven/LotCalTrader-V2.ex4 diff --git a/MQL4/Experts/Nkanven/LotCalTrader.ex4 b/MQL4/Experts/Nkanven/LotCalTrader.ex4 new file mode 100644 index 0000000..a27a50e Binary files /dev/null and b/MQL4/Experts/Nkanven/LotCalTrader.ex4 differ diff --git a/MQL4/LotCalTrader.mq4 b/MQL4/Experts/Nkanven/LotCalTrader.mq4 similarity index 100% rename from MQL4/LotCalTrader.mq4 rename to MQL4/Experts/Nkanven/LotCalTrader.mq4 diff --git a/MQL4/Experts/Nkanven/MuzzlingAlligatorWatcher.mq4 b/MQL4/Experts/Nkanven/MuzzlingAlligatorWatcher.mq4 new file mode 100644 index 0000000..0ca6df9 --- /dev/null +++ b/MQL4/Experts/Nkanven/MuzzlingAlligatorWatcher.mq4 @@ -0,0 +1,126 @@ +//+------------------------------------------------------------------+ +//| MuzzlingAlligatorWatcher.mq4 | +//| Copyright 2022, Nkondog Anselme Venceslas. | +//| https://www.linkedin.com/in/nkondog | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2022, Nkondog Anselme Venceslas." +#property link "ttps://www.linkedin.com/in/nkondog" +#property version "1.00" +#property strict + +#include +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +input string Comment_0="=========="; //Alligator parameters +input ENUM_TIMEFRAMES inpTimeframe = PERIOD_CURRENT; //Timeframe +input int inpJawsPeriod = 13; //Jaws period +input int inpJawsShift = 8; //Jaws shift +input int inpTeethPeriod = 8; //Teeth period +input int inpTeethShift = 5; //Teeth shift +input int inpLipsPeriod = 5; //Lips period +input int inpLipsShift = 3; //Lips shift +input ENUM_MA_METHOD inpMethod = MODE_SMMA; //Method +input ENUM_APPLIED_PRICE inpApplyedTo = PRICE_MEDIAN; //Applied to + +input string Comment_1="=========="; //Moving average parameters +input ENUM_MA_METHOD inpMAMethod = MODE_SMA; //MA method +input int inpMAPeriod = 200; //MA period +input int inpMASHift = 0; //MA shift +input ENUM_APPLIED_PRICE inpMAApplyedTo = PRICE_CLOSE; //MA applied to + +double jaws, teeth, lips, sma, prevCandleHigh, prevCandleLow, currentPrice, candleClose; +string comm = ""; + +int OnInit() + { +//--- + +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + if(!newCandle()) + return; + + jaws=iAlligator(NULL,0,inpJawsPeriod,inpJawsShift,inpTeethPeriod,inpTeethShift,inpLipsPeriod,inpLipsShift,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,0); + teeth=iAlligator(NULL,0,inpJawsPeriod,inpJawsShift,inpTeethPeriod,inpTeethShift,inpLipsPeriod,inpLipsShift,MODE_SMMA,PRICE_MEDIAN,MODE_GATORTEETH,0); + lips=iAlligator(NULL,0,inpJawsPeriod,inpJawsShift,inpTeethPeriod,inpTeethShift,inpLipsPeriod,inpLipsShift,MODE_SMMA,PRICE_MEDIAN,MODE_GATORLIPS,0); + + sma = iMA(NULL,0,inpMAPeriod,inpMASHift,inpMAMethod,inpMAApplyedTo,1); + Print(" Jaws ", jaws, " teeth ", teeth, " lips ", lips, " sma ", sma); + + //Get previous candle + prevCandleHigh = iHigh(NULL, PERIOD_CURRENT, 1); + prevCandleLow = iLow(NULL, PERIOD_CURRENT, 1); + currentPrice = iClose(NULL, PERIOD_CURRENT, 0); + candleClose = iLow(NULL, PERIOD_CURRENT, 0); + +//comm = "jaws " + (string)jaws + " teeth " + (string)teeth + " lips " + (string)lips + " sma " + (string)sma; + comm = "Trade alert on " + Symbol(); + comm += "\n"; + comm += ""; + + if(sma < currentPrice) + { + //Alert for bullish continuation signal + if(prevCandleHigh > jaws && prevCandleHigh > teeth && prevCandleHigh > lips) + { + if(prevCandleLow < jaws || prevCandleLow < teeth ||prevCandleLow < lips) + { + comm += "LONG CONTINUATION SIGNAL: Price above SMA just moves above Alligator. \n"; + Notify(comm); + } + } + + //Alert for bearish counter trend signal + if(lips > teeth && teeth > jaws) + { + + if(candleClose < lips && candleClose < teeth && candleClose < jaws) + { + comm += " SHORT COUNTER TREND SIGNAL: Price above SMA moves below Alligator in a trending market \n"; + Notify(comm); + } + } + } + + + if(sma > currentPrice) + { + //Alert for bearish continuation signal + if(prevCandleLow < jaws && prevCandleLow < teeth && prevCandleLow < lips) + { + if(prevCandleHigh > jaws || prevCandleHigh > teeth ||prevCandleHigh > lips) + { + comm += " SHORT CONTINUATION SIGNAL: Price below SMA just moves below Alligator. \n"; + Notify(comm); + } + } + + //Alert for bearish counter trend signal + if(lips < teeth && teeth < jaws) + { + + if(candleClose > lips && candleClose > teeth && candleClose > jaws) + { + comm += " LONG COUNTER TREND SIGNAL: Price below SMA just closes above Alligator in a down trending market \n"; + Notify(comm); + } + } + } + } +//+------------------------------------------------------------------+ diff --git a/MQL4/NewCandleAlert.ex4 b/MQL4/Experts/Nkanven/NewCandleAlert.ex4 similarity index 100% rename from MQL4/NewCandleAlert.ex4 rename to MQL4/Experts/Nkanven/NewCandleAlert.ex4 diff --git a/MQL4/NewCandleAlert.mq4 b/MQL4/Experts/Nkanven/NewCandleAlert.mq4 similarity index 100% rename from MQL4/NewCandleAlert.mq4 rename to MQL4/Experts/Nkanven/NewCandleAlert.mq4 diff --git a/MQL4/Experts/Nkanven/Telegram2MT4.ex4 b/MQL4/Experts/Nkanven/Telegram2MT4.ex4 new file mode 100644 index 0000000..9388b48 Binary files /dev/null and b/MQL4/Experts/Nkanven/Telegram2MT4.ex4 differ diff --git a/MQL4/Experts/Nkanven/Telegram2MT4.mq4 b/MQL4/Experts/Nkanven/Telegram2MT4.mq4 new file mode 100644 index 0000000..1838f45 --- /dev/null +++ b/MQL4/Experts/Nkanven/Telegram2MT4.mq4 @@ -0,0 +1,236 @@ +//+------------------------------------------------------------------+ +//| Telegram2MT4.mq4 | +//| Copyright 2022, Nkondog Anselme Venceslas. | +//| https://www.linkedin.com/in/nkondog | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2022, Nkondog Anselme Venceslas." +#property link "https://www.linkedin.com/in/nkondog" +#property version "1.00" +#property strict +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +enum ENUM_RISK_DEFAULT + { + RISK_DEFAULT_FIXED = 1, + RISK_DEFAULT_AUTO = 2, + + }; + +input ENUM_RISK_DEFAULT inpRiskDefault = RISK_DEFAULT_FIXED; //Lot sizing mode + +input double inpDefaultLotSize = 0.01; //Default lot +input double inpRiskPercent = 0.1; //Risk percentage +input double inpMaxLotSize = 10; //Max lot +input int inpMaxSlippage = 3; //Max slippage +input int inpMagicNumber = 1987; //Magic number +input string inpSymbolPrefix = ""; //Symbol prefix +input string inpSymbolSuffix = ""; //Symbol suffix + +double vbid,vask,vpoint; +int vdigits, vspread; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- + checkForPermissions(); +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- +//read file writen by TelegramReader + readTelegramFile(); + + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void readTelegramFile() + { + +//--- open the file + string fileName = "order.bin"; + ResetLastError(); + string table[]; + + int file_handle=FileOpen("Telegramreader"+"//"+fileName,FILE_READ|FILE_ANSI, " "); + if(file_handle!=INVALID_HANDLE) + { + PrintFormat("%s file is available for reading",fileName); + PrintFormat("File path: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH)); + //--- additional variables + int str_size; + string str; + int i = 0; + //--- read data from the file + while(!FileIsEnding(file_handle)) + { + //--- find out how many symbols are used for writing the time + str_size=FileReadInteger(file_handle,INT_VALUE); + //--- read the string + str=FileReadString(file_handle,str_size); + + //--- print the string + Print("i" + i + " " + str); + ArrayResize(table, ArraySize(table) + 1); + table[i] = str; + i += 1; + } + //--- close the file + FileClose(file_handle); + //PrintFormat("Data is read, %s file is closed",fileName); + FileDelete("Telegramreader"+"//"+fileName); + + sendOrder(table[2], table[0], table[1], NormalizeDouble(table[3], Digits), NormalizeDouble(table[4], Digits), NormalizeDouble(table[5], Digits)); + } + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void sendOrder(string type, string direction, string symbol, double entryPrice, double takeProfit, double stopLoss) + { + int ticket = 0; + symbol = inpSymbolPrefix+symbol+inpSymbolSuffix; + double lotSize; + + vbid = MarketInfo(symbol,MODE_BID); + vask = MarketInfo(symbol,MODE_ASK); + vpoint = MarketInfo(symbol,MODE_POINT); + vdigits = (int)MarketInfo(symbol,MODE_DIGITS); + vspread = (int)MarketInfo(symbol,MODE_SPREAD); + + Print(type, direction, symbol, entryPrice, takeProfit, stopLoss); + if(type == "NOW") + { + if(direction == "BUY") + { + lotSize = LotSizeCalculate(OP_BUY, stopLoss, symbol, vpoint); + Print("Lot size ", lotSize); + + ticket=OrderSend(symbol,OP_BUY,lotSize,vask,inpMaxSlippage, stopLoss,takeProfit,"Trade from eInvestors",inpMagicNumber,0,Green); + } + + if(direction == "SELL") + { + + lotSize = LotSizeCalculate(OP_SELL, stopLoss, symbol, vpoint); + Print("Lot size ", lotSize); + + ticket=OrderSend(symbol,OP_SELL,lotSize,vbid,inpMaxSlippage, stopLoss,takeProfit,"Trade from eInvestors",inpMagicNumber,0,Green); + } + + if(ticket>0) + { + if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) + Print("BUY order opened : ",OrderOpenPrice()); + } + else + Print("Error opening BUY order : ",GetLastError()); + } + + + } +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+ +//| Compute lot size function | +//+------------------------------------------------------------------+ +double LotSizeCalculate(int ordertype, double stoploss, string symbol, double vpoint) + { + + double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE); + double riskBaseAmount; + double lotSize = 0; + double SL = 0; + + if(stoploss > 0) + { + if(ordertype == OP_BUY) + { + SL = (vask-stoploss)/vpoint; + } + else + if(ordertype == OP_SELL) + { + SL = (stoploss-vbid)/vpoint; + } + } +//Print("SL ", SL, " risk base ", AccountInfoDouble(ACCOUNT_BALANCE), "tick value ", tickValue); + Print("if statement ", SL != 0 && inpRiskDefault == RISK_DEFAULT_AUTO); + if(SL != 0 && inpRiskDefault == RISK_DEFAULT_AUTO) + { + riskBaseAmount = AccountInfoDouble(ACCOUNT_BALANCE); + lotSize = ((riskBaseAmount*inpRiskPercent/100)/(SL*tickValue)); + } + else + { + lotSize = inpDefaultLotSize; + } + + lotSize = MathFloor(lotSize/SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP))*SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP); + + if(lotSize > inpMaxLotSize) + { + lotSize = inpMaxLotSize; + } + + if(lotSize > SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX)) + { + lotSize = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX); + } + + if(lotSize < SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN)) + { + lotSize = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN); + } + + return lotSize; + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void checkForPermissions() + { + + if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) + Alert("Check if automated trading is allowed in the terminal settings!"); + + if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) + Alert("Check if automated trading is allowed in the terminal settings!"); + else + { + if(!MQLInfoInteger(MQL_TRADE_ALLOWED)) + Alert("Automated trading is forbidden in the program settings for ",__FILE__); + } + + if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT)) + Alert("Automated trading is forbidden for the account ",AccountInfoInteger(ACCOUNT_LOGIN), + " at the trade server side"); + + if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)) + Comment("Trading is forbidden for the account ",AccountInfoInteger(ACCOUNT_LOGIN), + ".\n Perhaps an investor password has been used to connect to the trading account.", + "\n Check the terminal journal for the following entry:", + "\n\'",AccountInfoInteger(ACCOUNT_LOGIN),"\': trading has been disabled - investor mode."); + } +//+------------------------------------------------------------------+ diff --git a/MQL4/Include/Nkanven/Lib/Navlib.mqh b/MQL4/Include/Nkanven/Lib/Navlib.mqh new file mode 100644 index 0000000..5b4566c --- /dev/null +++ b/MQL4/Include/Nkanven/Lib/Navlib.mqh @@ -0,0 +1,71 @@ +//+------------------------------------------------------------------+ +//| Navlib.mqh | +//| Copyright 2022, MetaQuotes Software Corp. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2022, MetaQuotes Software Corp." +#property link "https://www.mql5.com" +#property strict + +void Notify(string message) + { + Print("Message sent ", message); + + if(!IsTesting()) + { + +//SendNotification(message); + + string headers; + string url = "https://api.telegram.org/bot5854676759:AAEGN1a1HQ-3uiVtv7FxEf7IXKrMATBzkQg/sendMessage?chat_id=-1001821417162&text="+message; + char data[],result[]; + + int res = WebRequest("GET", + url, + NULL, + NULL, + 3000, + data, + 0, + result, + headers + ); + Print(CharArrayToString(result), " Res ", res, headers); // see the results + + if(res==-1) + { + Print("Error in WebRequest. Error code =",GetLastError()); + //--- Perhaps the URL is not listed, display a message about the necessity to add the address + MessageBox("Add the address '"+url+"' to the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION); + } + else + { + if(res==200) + { + //--- Successful download + Print("Telegran notification sent."); + } + } + } else + { + Comment(message); + } + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool newCandle() + { + static datetime prevTime = 0; + datetime currentTime = iTime(Symbol(), PERIOD_CURRENT, 0); + if(currentTime != prevTime) + { + prevTime = currentTime; + + return(true); + } + return(false); + } +//+------------------------------------------------------------------+