From 2bb08167122641fb7e59dcc86e2c04f45abb5859 Mon Sep 17 00:00:00 2001 From: Nkondog Anselme Date: Sat, 1 Jan 2022 15:32:05 +0100 Subject: [PATCH] Gervis DCA --- Experts/Nkanven/Framework EA/Gervis.mq5 | 197 +++++++++ Experts/Nkanven/Gervis.ex5 | Bin 0 -> 85360 bytes Experts/Nkanven/Gervis.mq5 | 129 ++++++ .../Nkanven/Frameworks/Gervis/CommonBase.mqh | 78 ++++ .../Nkanven/Frameworks/Gervis/ExpertBase.mqh | 380 ++++++++++++++++++ .../Nkanven/Frameworks/Gervis/Framework.mqh | 36 ++ .../Frameworks/Gervis/IndicatorBase.mqh | 59 +++ .../Nkanven/Frameworks/Gervis/SignalBase.mqh | 112 ++++++ .../Nkanven/Frameworks/Gervis/TPSLBase.mqh | 39 ++ .../Nkanven/Frameworks/Gervis/Trade/Trade.mqh | 16 + .../Frameworks/Gervis/Trade/Trade_mql4.mqh | 123 ++++++ .../Frameworks/Gervis/Trade/Trade_mql5.mqh | 66 +++ Include/Nkanven/Frameworks/Gervis/Updates.txt | 7 + Include/Nkanven/Frameworks/GervisFrame.mqh | 12 + Include/Nkanven/GDea/ScanPositions.mqh | 4 +- Include/Nkanven/GDea/TradingHour.mqh | 5 +- Include/Nkanven/Gervis/CheckHistory.mqh | 27 ++ Include/Nkanven/Gervis/ClosePositions.mqh | 38 ++ Include/Nkanven/Gervis/EntriesManager.mqh | Bin 0 -> 17866 bytes Include/Nkanven/Gervis/EntriesManagerDCA.mqh | Bin 0 -> 12932 bytes Include/Nkanven/Gervis/HighestPriceLevel.mqh | 33 ++ Include/Nkanven/Gervis/LotSizeCal.mqh | 59 +++ Include/Nkanven/Gervis/Parameters.mqh | 172 ++++++++ Include/Nkanven/Gervis/Prechecks.mqh | 62 +++ Include/Nkanven/Gervis/ScanPositions.mqh | 49 +++ Include/Nkanven/Gervis/TradeManager.mqh | 27 ++ Include/Nkanven/Gervis/TradingHour.mqh | 49 +++ 27 files changed, 1777 insertions(+), 2 deletions(-) create mode 100644 Experts/Nkanven/Framework EA/Gervis.mq5 create mode 100644 Experts/Nkanven/Gervis.ex5 create mode 100644 Experts/Nkanven/Gervis.mq5 create mode 100644 Include/Nkanven/Frameworks/Gervis/CommonBase.mqh create mode 100644 Include/Nkanven/Frameworks/Gervis/ExpertBase.mqh create mode 100644 Include/Nkanven/Frameworks/Gervis/Framework.mqh create mode 100644 Include/Nkanven/Frameworks/Gervis/IndicatorBase.mqh create mode 100644 Include/Nkanven/Frameworks/Gervis/SignalBase.mqh create mode 100644 Include/Nkanven/Frameworks/Gervis/TPSLBase.mqh create mode 100644 Include/Nkanven/Frameworks/Gervis/Trade/Trade.mqh create mode 100644 Include/Nkanven/Frameworks/Gervis/Trade/Trade_mql4.mqh create mode 100644 Include/Nkanven/Frameworks/Gervis/Trade/Trade_mql5.mqh create mode 100644 Include/Nkanven/Frameworks/Gervis/Updates.txt create mode 100644 Include/Nkanven/Frameworks/GervisFrame.mqh create mode 100644 Include/Nkanven/Gervis/CheckHistory.mqh create mode 100644 Include/Nkanven/Gervis/ClosePositions.mqh create mode 100644 Include/Nkanven/Gervis/EntriesManager.mqh create mode 100644 Include/Nkanven/Gervis/EntriesManagerDCA.mqh create mode 100644 Include/Nkanven/Gervis/HighestPriceLevel.mqh create mode 100644 Include/Nkanven/Gervis/LotSizeCal.mqh create mode 100644 Include/Nkanven/Gervis/Parameters.mqh create mode 100644 Include/Nkanven/Gervis/Prechecks.mqh create mode 100644 Include/Nkanven/Gervis/ScanPositions.mqh create mode 100644 Include/Nkanven/Gervis/TradeManager.mqh create mode 100644 Include/Nkanven/Gervis/TradingHour.mqh diff --git a/Experts/Nkanven/Framework EA/Gervis.mq5 b/Experts/Nkanven/Framework EA/Gervis.mq5 new file mode 100644 index 0000000..36f92a1 --- /dev/null +++ b/Experts/Nkanven/Framework EA/Gervis.mq5 @@ -0,0 +1,197 @@ +/* + + MA Crossover.mq5 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + + Description: + +*/ + +#property copyright "Copyright 2013-2020, Orchard Forex" +#property link "https://www.orchardforex.com" +#property version "1.00" +#property strict + +// +// This is where we pull in the framework +// +#include + +// +// Input Section +// +// Fast moving average +input int InpFastPeriods = 10; // Fast periods +input ENUM_MA_METHOD InpFastMethod = MODE_SMA; // Fast method +input ENUM_APPLIED_PRICE InpFastAppliedPrice = PRICE_CLOSE; // Fast price + +// Slow moving average +input int InpSlowPeriods = 20; // Slow periods +input ENUM_MA_METHOD InpSlowMethod = MODE_SMA; // Slow method +input ENUM_APPLIED_PRICE InpSlowAppliedPrice = PRICE_CLOSE; // Slow price + +// Bar numbers for comparison +//input int InpBar2 = 2; // Base bar number +//input int InpBar1 = 1; // Crossover bar number + +// +// Some standard inputs, +// remember to change the default magic for each EA +// +input double InpVolume = 0.01; // Default order size +input string InpComment = __FILE__; // Default trade comment +input int InpMagicNumber = 20200701; // Magic Number + +// +// Declare the expert, use the child class name +// +#define CExpert CExpertBase +CExpert *Expert; + +// +// Signals, use the child class names if applicable +// +CSignalBase *EntrySignal; +CSignalBase *ExitSignal; + +// +// Indicators - use the child class name here +// +CIndicatorMA *FastIndicator; +CIndicatorMA *SlowIndicator; + +int OnInit() { + + // + // Instantiate the expert + // + Expert = new CExpert(); + + // + // Assign the default values to the expert + // + Expert.SetVolume(InpVolume); + Expert.SetTradeComment(InpComment); + Expert.SetMagic(InpMagicNumber); + + // + // Create the indicators + // + FastIndicator = new CIndicatorMA(InpFastPeriods, 0, InpFastMethod, InpFastAppliedPrice); + SlowIndicator = new CIndicatorMA(InpSlowPeriods, 0, InpSlowMethod, InpSlowAppliedPrice); + + // + // Set up the signals + // + EntrySignal = new CSignalCrossover(); + EntrySignal.AddIndicator(FastIndicator, 0); + EntrySignal.AddIndicator(SlowIndicator, 0); + + //ExitSignal = Not needed, using the same signal as entry + + // + // Add the signals to the expert + // + Expert.AddEntrySignal(EntrySignal); + Expert.AddExitSignal(EntrySignal); // Same signal + + // + // Finish expert initialisation and check result + // + int result = Expert.OnInit(); + + return(result); + +} + +void OnDeinit(const int reason) { + + EventKillTimer(); + + delete Expert; + //delete ExitSignal; + delete EntrySignal; + delete FastIndicator; + delete SlowIndicator; + + return; + +} + +void OnTick() { + + Expert.OnTick(); + return; + +} + +void OnTimer() { + + Expert.OnTimer(); + return; + +} + +void OnTrade() { + + Expert.OnTrade(); + return; + +} + +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) { + + Expert.OnTradeTransaction(trans, request, result); + return; + +} + +double OnTester() { + + return(Expert.OnTester()); + +} + +void OnTesterInit() { + + Expert.OnTesterInit(); + return; + +} + +void OnTesterPass() { + + Expert.OnTesterPass(); + return; + +} + +void OnTesterDeinit() { + + Expert.OnTesterDeinit(); + return; + +} + +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) { + + Expert.OnChartEvent(id, lparam, dparam, sparam); + return; + +} + +void OnBookEvent(const string &symbol) { + + Expert.OnBookEvent(); + return; + +} + + diff --git a/Experts/Nkanven/Gervis.ex5 b/Experts/Nkanven/Gervis.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..3dc95b3b2f9952a63e1f14211e4cf377af6c0f37 GIT binary patch literal 85360 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%0D)p4DPQVDn9!H}YUBsZme9Oaq&<5Gj(`5c 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 literal 0 HcmV?d00001 diff --git a/Experts/Nkanven/Gervis.mq5 b/Experts/Nkanven/Gervis.mq5 new file mode 100644 index 0000000..c948b51 --- /dev/null +++ b/Experts/Nkanven/Gervis.mq5 @@ -0,0 +1,129 @@ +//+------------------------------------------------------------------+ +//| Gervis.mq5 | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" +#property version "1.00" + + +#include +#include + +CiMA* sma; +CiMA* ssma; + +#include // Description of variables +#include // Error library +#include // Prechecks +#include // +#include +#include // Scan for opened positions +#include //Check transaction history +#include //Manage trade dynamic open and close conditions +#include // Check buy and sell entries signals and execute them +#include // Lot size calculate +#include // Close opened positions +#include +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- + //sma = new CiMA(); + //ssma = new CiMA(); + + //sma.Create(gSymbol, PERIOD_CURRENT, InpMAPeriods, InpMAAppliedPrice, InpMAMethod, PRICE_CLOSE); + //ssma.Create(gSymbol, PERIOD_CURRENT, 200, InpMAAppliedPrice, InpMAMethod, PRICE_CLOSE); + InitializeVariables(); +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + SymbolInfoTick(_Symbol,last_tick); + + //sma.Refresh(-1); + //ssma.Refresh(-1); + TimeCurrent(dt); + + //gSma = sma.Main(1); + //gSsma = ssma.Main(1); + CheckOperationHours(); + + gCandleHigh = iHigh(gSymbol, PERIOD_CURRENT, 1); + gCandleLow = iLow(gSymbol, PERIOD_CURRENT, 1); + gCandleOpen = iOpen(gSymbol, PERIOD_CURRENT, 1); + gCandleClose = iClose(gSymbol, PERIOD_CURRENT, 1); + + gMinStopLoss =MathAbs(SymbolInfoInteger(gSymbol, SYMBOL_TRADE_STOPS_LEVEL))+20; + +//isQualifiedCandle(0); + OrderClose(); + ScanPositions(); + if(gTotalOpenPositions==0) + gSignalEntry = SIGNAL_ENTRY_BUY; + + CheckSpread(); + entryConditions(); + EvaluateEntry(); + drawLine(); + ExecuteEntry(); + + Comment( + "Expert Advisor by Anselme Nkondog (c) 2021\n "+ + " Hour " + dt.hour + " Min "+ dt.min+"\n" + " Last Highest Price " + gLastHighestPrice + " Price %change "+ gPriceChange); + + } +//+------------------------------------------------------------------+ + +//Initialize variables +void InitializeVariables() + { + gIsNewCandle=false; + gIsTradedThisBar=false; + gIsOperatingHours=false; + gIsSpreadOK=false; + + gLotSize=InpDefaultLotSize; + gTickValue=0; + + gTotalOpenBuy=0; + gTotalOpenSell=0; + + gSignalEntry=SIGNAL_ENTRY_NEUTRAL; + gSignalExit=SIGNAL_EXIT_NEUTRAL; + Print("Variables intialized"); + } + +//Check and return if the spread is not too high +void CheckSpread() + { +//Get the current spread in points, the (int) transforms the double coming from MarketInfo into an integer to avoid a warning when compiling + long SpreadCurr=SymbolInfoInteger(gSymbol, SYMBOL_SPREAD); + Print("Spread ", SpreadCurr); + if(SpreadCurr<=InpMaxSpread) + { + gIsSpreadOK=true; + } + else + { + gIsSpreadOK=false; + } + } +//+------------------------------------------------------------------+ diff --git a/Include/Nkanven/Frameworks/Gervis/CommonBase.mqh b/Include/Nkanven/Frameworks/Gervis/CommonBase.mqh new file mode 100644 index 0000000..46edb6a --- /dev/null +++ b/Include/Nkanven/Frameworks/Gervis/CommonBase.mqh @@ -0,0 +1,78 @@ +/* + CommonBase.mqh + For framework version 1.0 + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#define _INIT_CHECK_FAIL if (mInitResult!=INIT_SUCCEEDED) return(mInitResult); +#define _INIT_ERROR(msg) return(InitError(msg, INIT_PARAMETERS_INCORRECT)); +#define _INIT_ASSERT(condition, msg) if (!condition) return(InitError(msg, INIT_FAILED)); + +class CCommonBase { + +private: + +protected: // Members + + int mDigits; + string mSymbol; + ENUM_TIMEFRAMES mTimeframe; + + string mInitMessage; + int mInitResult; + +protected: // Constructors + + // + // Constructors + // + CCommonBase() { Init(_Symbol, (ENUM_TIMEFRAMES)_Period); } + CCommonBase(string symbol) { Init(symbol, (ENUM_TIMEFRAMES)_Period); } + CCommonBase(int timeframe) { Init(_Symbol, (ENUM_TIMEFRAMES)timeframe); } + CCommonBase(ENUM_TIMEFRAMES timeframe) { Init(_Symbol, timeframe); } + CCommonBase(string symbol, int timeframe) { Init(symbol, (ENUM_TIMEFRAMES)timeframe); } + CCommonBase(string symbol, ENUM_TIMEFRAMES timeframe) { Init(symbol, timeframe); } + + // + // Destructors + // + ~CCommonBase() {}; + + int Init(string symbol, ENUM_TIMEFRAMES timeframe); + +protected: // Functions + + int InitError(string initMessage, int initResult) + { mInitMessage = initMessage; + mInitResult = initResult; + if (initMessage!="") Print(initMessage); + return(initResult); } + + double PointsToDouble(int points) { return(points*SymbolInfoDouble(mSymbol, SYMBOL_POINT)); } + +public: // Properties + + int InitResult() { return(mInitResult); } + string InitMessage() { return(mInitMessage); } + +public: // Functions + + bool TradeAllowed() { return(SymbolInfoInteger(mSymbol, SYMBOL_TRADE_MODE)!=SYMBOL_TRADE_MODE_DISABLED); } + +}; + +int CCommonBase::Init(string symbol, ENUM_TIMEFRAMES timeframe) { + + InitError("", INIT_SUCCEEDED); + + mSymbol = symbol; + mTimeframe = timeframe; + mDigits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS); + + return(INIT_SUCCEEDED); + +} + diff --git a/Include/Nkanven/Frameworks/Gervis/ExpertBase.mqh b/Include/Nkanven/Frameworks/Gervis/ExpertBase.mqh new file mode 100644 index 0000000..e5afc1d --- /dev/null +++ b/Include/Nkanven/Frameworks/Gervis/ExpertBase.mqh @@ -0,0 +1,380 @@ +/* + ExpertBase.mqh + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + + +#include "CommonBase.mqh" +#include "SignalBase.mqh" +#include "TPSLBase.mqh" +#include "Trade/Trade.mqh" + +class CExpertBase : public CCommonBase { + +protected: + + int mMagicNumber; + string mTradeComment; + + double mVolume; + + datetime mLastBarTime; + datetime mBarTime; + + ////Changed + // Arrays to hold the signal objects + CSignalBase *mEntrySignals[]; + CSignalBase *mExitSignals[]; + ////CSignalBase *mEntrySignal; + ////CSignalBase *mExitSignal; + + double mTakeProfitValue; + double mStopLossValue; + CTPSLBase *mTakeProfitObj; + CTPSLBase *mStopLossObj; + + CTradeCustom Trade; + +private: + +protected: + + virtual bool LoopMain(bool newBar, bool firstTime); + +protected: + + int Init(int magicNumber, string tradeComment); + +public: + + // + // Constructors + // + CExpertBase() : CCommonBase() + { Init(0, ""); } + CExpertBase(string symbol, int timeframe, int magicNumber, string tradeComment) + : CCommonBase(symbol, timeframe) + { Init(magicNumber, tradeComment); } + CExpertBase(string symbol, ENUM_TIMEFRAMES timeframe, int magicNumber, string tradeComment) + : CCommonBase(symbol, timeframe) + { Init(magicNumber, tradeComment); } + CExpertBase(int magicNumber, string tradeComment) + : CCommonBase() + { Init(magicNumber, tradeComment); } + + // + // Destructors + // + ~CExpertBase(); + +public: // Default properties + + // + // Assign the default values to the expert + // + virtual void SetVolume(double volume) { mVolume = volume; } + + virtual void SetTakeProfitValue(int takeProfitPoints) + { mTakeProfitValue = PointsToDouble(takeProfitPoints); } + virtual void SetTakeProfitObj(CTPSLBase *takeProfitObj) + { mTakeProfitObj = takeProfitObj; } + + virtual void SetStopLossValue(int stopLossPoints) + { mStopLossValue = PointsToDouble(stopLossPoints); } + virtual void SetStopLossObj(CTPSLBase *stopLossObj) + { mStopLossObj = stopLossObj; } + + virtual void SetTradeComment(string comment) { mTradeComment = comment; } + virtual void SetMagic(int magicNumber) { mMagicNumber = magicNumber; + Trade.SetExpertMagicNumber(magicNumber); } + +public: // Setup + + ////Changed + virtual void AddEntrySignal(CSignalBase *signal) { AddSignal(signal, mEntrySignals); } + virtual void AddExitSignal(CSignalBase *signal) { AddSignal(signal, mExitSignals); } + virtual void AddSignal(CSignalBase *signal, CSignalBase* &signals[]); + ////virtual void AddEntrySignal(CSignalBase *signal) { mEntrySignal=signal; } + ////virtual void AddExitSignal(CSignalBase *signal) { mExitSignal=signal; } + +public: // Event handlers + + virtual int OnInit(); + virtual void OnTick(); + virtual void OnTimer() { return; } + virtual double OnTester() { return(0.0); } + virtual void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}; + +#ifdef __MQL5__ + virtual void OnTrade() { return; } + virtual void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { return; } + virtual int OnTesterInit() { return(INIT_SUCCEEDED); } + virtual void OnTesterPass() { return; } + virtual void OnTesterDeinit() { return; } + virtual void OnBookEvent() { return; } +#endif + +public: // Functions + + virtual void GetMarketPrices(ENUM_ORDER_TYPE orderType, MqlTradeRequest &request); + ////New + virtual ENUM_OFX_SIGNAL_DIRECTION GetCurrentSignal(CSignalBase* &signals[], + ENUM_OFX_SIGNAL_TYPE signalType); + +}; + +CExpertBase::~CExpertBase() { + +} + +int CExpertBase::OnInit() { + + int i = 0; + for (i=ArraySize(mEntrySignals)-1; i>=0; i--) { + if (mEntrySignals[i].InitResult()!=INIT_SUCCEEDED) return(mEntrySignals[i].InitResult()); + } + for (i=ArraySize(mExitSignals)-1; i>=0; i--) { + if (mExitSignals[i].InitResult()!=INIT_SUCCEEDED) return(mExitSignals[i].InitResult()); + } + if (mTakeProfitObj!=NULL) { + if (mTakeProfitObj.InitResult()!=INIT_SUCCEEDED) return(mTakeProfitObj.InitResult()); + } + if (mStopLossObj!=NULL) { + if (mStopLossObj.InitResult()!=INIT_SUCCEEDED) return(mStopLossObj.InitResult()); + } + + return(INIT_SUCCEEDED); + +} + +int CExpertBase::Init(int magicNumber, string tradeComment) { + + if (mInitResult!=INIT_SUCCEEDED) return(mInitResult); + + mTradeComment = tradeComment; + SetMagic(magicNumber); + + mTakeProfitValue = 0.0; + mStopLossValue = 0.0; + + mLastBarTime = 0; + + ////New + ArrayResize(mEntrySignals, 0); // Just make sure these are initialised + ArrayResize(mExitSignals, 0); + + return(INIT_SUCCEEDED); + +} + +void CExpertBase::OnTick(void) { + + if (!TradeAllowed()) return; + + mBarTime = iTime(mSymbol, mTimeframe, 0); + + bool firstTime = (mLastBarTime==0); + bool newBar = (mBarTime!=mLastBarTime); + + if (LoopMain(newBar, firstTime)) { + mLastBarTime = mBarTime; + } + + return; + +} + +bool CExpertBase::LoopMain(bool newBar,bool firstTime) { + + // + // To start I will only trade on a new bar + // and not on the first bar after start + // + if (!newBar) return(true); + if (firstTime) return(true); + + // + // Update the signals + // + ////Changed + ENUM_OFX_SIGNAL_DIRECTION entrySignal = GetCurrentSignal(mEntrySignals, OFX_ENTRY_SIGNAL); + ENUM_OFX_SIGNAL_DIRECTION exitSignal = GetCurrentSignal(mExitSignals, OFX_EXIT_SIGNAL); + ////if (mEntrySignal!=NULL) mEntrySignal.UpdateSignal(); + ////if (mEntrySignal!=mExitSignal) { + //// if (mExitSignal!=NULL) mExitSignal.UpdateSignal(); + ////} + + // + // Should any trades be closed + // + ////Changed + if (exitSignal==OFX_SIGNAL_BOTH) { + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); + } else + if (exitSignal==OFX_SIGNAL_BUY) { + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); + } else + if (exitSignal==OFX_SIGNAL_SELL) { + Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); + } + ////if (mExitSignal!=NULL) { + //// if (mExitSignal.ExitSignal()==OFX_SIGNAL_BOTH) { + //// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); + //// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); + //// } else + //// if (mExitSignal.ExitSignal()==OFX_SIGNAL_BUY) { + //// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_BUY); + //// } else + //// if (mExitSignal.ExitSignal()==OFX_SIGNAL_SELL) { + //// Trade.PositionCloseByType(mSymbol, POSITION_TYPE_SELL); + //// } + ////} + + // + // Should a trade be opened + // + MqlTradeRequest request = {}; // Just initialising + ////Changed + if (entrySignal==OFX_SIGNAL_BOTH) { + + GetMarketPrices(ORDER_TYPE_BUY, request); + Trade.Buy(mVolume, mSymbol, request.price, request.sl, request.tp); + + GetMarketPrices(ORDER_TYPE_SELL, request); + Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); + + } else + if (entrySignal==OFX_SIGNAL_BUY) { + + GetMarketPrices(ORDER_TYPE_BUY, request); + Trade.Buy(mVolume, mSymbol, request.price, request.sl, request.tp); + + } else + if (entrySignal==OFX_SIGNAL_SELL) { + + GetMarketPrices(ORDER_TYPE_SELL, request); + Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); + + } +//// if (mEntrySignal!=NULL) { +//// if (mEntrySignal.EntrySignal()==OFX_SIGNAL_BOTH) { +//// +//// GetMarketPrices(ORDER_TYPE_BUY, request); +//// Trade.Buy(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// GetMarketPrices(ORDER_TYPE_SELL, request); +//// Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// } else +//// if (mEntrySignal.EntrySignal()==OFX_SIGNAL_BUY) { +//// +//// GetMarketPrices(ORDER_TYPE_BUY, request); +//// Trade.Buy(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// } else +//// if (mEntrySignal.EntrySignal()==OFX_SIGNAL_SELL) { +//// +//// GetMarketPrices(ORDER_TYPE_SELL, request); +//// Trade.Sell(mVolume, mSymbol, request.price, request.sl, request.tp); +//// +//// } +//// } + + return(true); + +} + +void CExpertBase::GetMarketPrices(ENUM_ORDER_TYPE orderType, MqlTradeRequest &request) { + + double sl = (mStopLossObj==NULL) ? mStopLossValue : mStopLossObj.GetStopLoss(); + double tp = (mTakeProfitObj==NULL) ? mTakeProfitValue : mTakeProfitObj.GetTakeProfit(); + + if (orderType==ORDER_TYPE_BUY) { + if (request.price==0.0) request.price = SymbolInfoDouble(mSymbol, SYMBOL_ASK); + request.tp = (tp==0.0) ? 0.0 : NormalizeDouble(request.price+tp, mDigits); + request.sl = (sl==0.0) ? 0.0 : NormalizeDouble(request.price-sl, mDigits); + } + + if (orderType==ORDER_TYPE_SELL) { + if (request.price==0.0) request.price = SymbolInfoDouble(mSymbol, SYMBOL_BID); + request.tp = (tp==0.0) ? 0.0 : NormalizeDouble(request.price-tp, mDigits); + request.sl = (sl==0.0) ? 0.0 : NormalizeDouble(request.price+sl, mDigits); + } + + return; + +} + +////New +void CExpertBase::AddSignal(CSignalBase *signal, CSignalBase* &signals[]) { + + int index = ArraySize(signals); + ArrayResize(signals, index+1); + signals[index] = signal; + +} + +////New +ENUM_OFX_SIGNAL_DIRECTION CExpertBase::GetCurrentSignal(CSignalBase* &signals[], + ENUM_OFX_SIGNAL_TYPE signalType) { + + ENUM_OFX_SIGNAL_DIRECTION result = OFX_SIGNAL_NONE; + ENUM_OFX_SIGNAL_DIRECTION r2 = OFX_SIGNAL_NONE; // Just working value + int index = ArraySize(signals); + + if (index<=0) { + + return(result); + + } else { + + signals[0].UpdateSignal(); + result = signals[0].GetSignal(signalType); + + // I have chosen to update all signals in case there is some + // behavour that needs it. The penalty is some performance + // If performance is an issue just add an exit inside the loop + // as the commented line + for (int i = 1; i0); +} + +bool CTradeCustom::Sell(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="") { + if (price==0.0) price = SellPrice(symbol); + int ticket = OrderSend(symbol, ORDER_TYPE_SELL, volume, price, 0, sl, tp, comment, mMagic); + return(ticket>0); +} + +bool CTradeCustom::PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType, const int deviation=ULONG_MAX) { + + int slippage = (deviation==ULONG_MAX) ? 0 : deviation; + + bool result = true; + int cnt = OrdersTotal(); + for (int i = cnt-1; i>=0; i--) { + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + if (OrderSymbol()==symbol && OrderMagicNumber()==mMagic && OrderType()==positionType) { + result &= OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage); + } + } + } + + return(result); + +} + +////New +void CTradeCustom::PositionCountByType(const string symbol, int &count[]) { + + ArrayResize(count, 6); + ArrayInitialize(count, 0); + int cnt = OrdersTotal(); + for (int i = cnt-1; i>=0; i--) { + if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { + if (OrderSymbol()==symbol && OrderMagicNumber()==mMagic) { + count[(int)OrderType()]++; + } + } + } + + return; + +} diff --git a/Include/Nkanven/Frameworks/Gervis/Trade/Trade_mql5.mqh b/Include/Nkanven/Frameworks/Gervis/Trade/Trade_mql5.mqh new file mode 100644 index 0000000..3bae1c9 --- /dev/null +++ b/Include/Nkanven/Frameworks/Gervis/Trade/Trade_mql5.mqh @@ -0,0 +1,66 @@ +/* + Trade.mqh + (For MQL5) + + Copyright 2013-2020, Orchard Forex + https://www.orchardforex.com + +*/ + +#include + +class CTradeCustom : public CTrade { + +private: + +protected: // member variables + +public: // constructors + +public: + + bool PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType,const ulong deviation=ULONG_MAX); + ////New + void PositionCountByType(const string symbol, int &count[]); + +}; + +bool CTradeCustom::PositionCloseByType(const string symbol, ENUM_POSITION_TYPE positionType, const ulong deviation=ULONG_MAX) { + + bool result = true; + int cnt = PositionsTotal(); + for (int i = cnt-1; i>=0; i--) { + ulong ticket = PositionGetTicket(i); + if (PositionSelectByTicket(ticket)) { + if (PositionGetString(POSITION_SYMBOL)==symbol && PositionGetInteger(POSITION_TYPE)==positionType && PositionGetInteger(POSITION_MAGIC)==m_magic) { + result &= PositionClose(ticket, deviation); + } + } else { + m_result.retcode=TRADE_RETCODE_REJECT; + result = false; + } + } + + return(result); + +} + +////New +void CTradeCustom::PositionCountByType(const string symbol, int &count[]) { + + ArrayResize(count, 6); + ArrayInitialize(count, 0); + + int cnt = PositionsTotal(); + for (int i = cnt-1; i>=0; i--) { + ulong ticket = PositionGetTicket(i); + if (PositionSelectByTicket(ticket)) { + if (PositionGetString(POSITION_SYMBOL)==symbol && PositionGetInteger(POSITION_MAGIC)==m_magic) { + count[(int)PositionGetInteger(POSITION_TYPE)]++; + } + } + } + + return; + +} diff --git a/Include/Nkanven/Frameworks/Gervis/Updates.txt b/Include/Nkanven/Frameworks/Gervis/Updates.txt new file mode 100644 index 0000000..281bf10 --- /dev/null +++ b/Include/Nkanven/Frameworks/Gervis/Updates.txt @@ -0,0 +1,7 @@ +Version 2.03 + +Added macros to CommonBase to standardise init checking + +Moved base classes up one level and removed unnecessary folders + +Updated framework number \ No newline at end of file diff --git a/Include/Nkanven/Frameworks/GervisFrame.mqh b/Include/Nkanven/Frameworks/GervisFrame.mqh new file mode 100644 index 0000000..faa324f --- /dev/null +++ b/Include/Nkanven/Frameworks/GervisFrame.mqh @@ -0,0 +1,12 @@ +//+------------------------------------------------------------------+ +//| GervisFrame.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + + +#ifndef _FRAMEWORK_VERSION_ + #include "Gervis/Framework.mqh" +#endif \ No newline at end of file diff --git a/Include/Nkanven/GDea/ScanPositions.mqh b/Include/Nkanven/GDea/ScanPositions.mqh index 7adfdb0..9125ec1 100644 --- a/Include/Nkanven/GDea/ScanPositions.mqh +++ b/Include/Nkanven/GDea/ScanPositions.mqh @@ -38,7 +38,9 @@ bool ScanPositions() if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) gTotalOpenSell++; //Increment the total orders count - gTotalOpenOrders++; + gTotalOpenPositions++; + + gPositionOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN); //Find what is the open time of the most recent trade and assign it to LastBarTraded //this is necessary to check if we already traded in the current candle if((datetime)PositionGetInteger(POSITION_TIME)>gLastBarTraded || gLastBarTraded==NULL) diff --git a/Include/Nkanven/GDea/TradingHour.mqh b/Include/Nkanven/GDea/TradingHour.mqh index 7933ad8..249ec7b 100644 --- a/Include/Nkanven/GDea/TradingHour.mqh +++ b/Include/Nkanven/GDea/TradingHour.mqh @@ -31,15 +31,18 @@ void CheckOperationHours() gIsOperatingHours=true; return; } - if(dt.hour > InpTradingHourStart) + if(dt.hour > InpTradingHourStart && dt.hour < InpTradingHourEnd) { gIsOperatingHours=true; } + + } if(InpTradingHourStart>InpTradingHourEnd && ((dt.hour>=InpTradingHourStart && dt.hour<=23) || (dt.hour<=InpTradingHourEnd && dt.hour>=0))) { gIsOperatingHours=true; } + } //+------------------------------------------------------------------+ diff --git a/Include/Nkanven/Gervis/CheckHistory.mqh b/Include/Nkanven/Gervis/CheckHistory.mqh new file mode 100644 index 0000000..8c5f1b0 --- /dev/null +++ b/Include/Nkanven/Gervis/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/Gervis/ClosePositions.mqh b/Include/Nkanven/Gervis/ClosePositions.mqh new file mode 100644 index 0000000..219a413 --- /dev/null +++ b/Include/Nkanven/Gervis/ClosePositions.mqh @@ -0,0 +1,38 @@ +//+------------------------------------------------------------------+ +//| 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; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool OrderClose() + { + bool result = true; + int cnt = OrdersTotal(); + if(cnt == 1) + { + + + for(int i = cnt-1; i>=0; i--) + { + ulong ticket = OrderGetTicket(i); + if(OrderSelect(ticket)) + { + + result &= trade.OrderDelete(ticket); + } + else + { + result = false; + } + } + } + return(result); + } +//+------------------------------------------------------------------+ diff --git a/Include/Nkanven/Gervis/EntriesManager.mqh b/Include/Nkanven/Gervis/EntriesManager.mqh new file mode 100644 index 0000000000000000000000000000000000000000..9e58a69940c25dab4601bbe225f8888acf430e3f GIT binary patch literal 17866 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 literal 0 HcmV?d00001 diff --git a/Include/Nkanven/Gervis/HighestPriceLevel.mqh b/Include/Nkanven/Gervis/HighestPriceLevel.mqh new file mode 100644 index 0000000..bb464e6 --- /dev/null +++ b/Include/Nkanven/Gervis/HighestPriceLevel.mqh @@ -0,0 +1,33 @@ +//+------------------------------------------------------------------+ +//| HighestPriceLevel.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void drawLine() + { + string obj_name = "Recent high"; + + if(highestPrice != gLastHighestPrice) + { + ObjectDelete(current_chart_id, obj_name); + } + ObjectCreate(current_chart_id, obj_name, OBJ_HLINE, 0, iTime(gSymbol,_Period,0), gLastHighestPrice); + +//--- set color to Red + ObjectSetInteger(current_chart_id, obj_name, OBJPROP_COLOR, clrRed); +//--- set object width + ObjectSetInteger(current_chart_id, obj_name, OBJPROP_WIDTH, 1); +//--- Move the line + ObjectMove(current_chart_id, obj_name, 0, iTime(gSymbol,_Period,0), gLastHighestPrice); + + highestPrice = gLastHighestPrice; + + Print("Drawing line"); + } +//+------------------------------------------------------------------+ diff --git a/Include/Nkanven/Gervis/LotSizeCal.mqh b/Include/Nkanven/Gervis/LotSizeCal.mqh new file mode 100644 index 0000000..2fafb5b --- /dev/null +++ b/Include/Nkanven/Gervis/LotSizeCal.mqh @@ -0,0 +1,59 @@ +//+------------------------------------------------------------------+ +//| 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(InpRiskDefaultSize==RISK_DEFAULT_AUTO) + { + //If the stop loss is not zero then calculate the lot size + if(SL!=0) + { + double RiskBaseAmount=0; + double RiskBase=0; + + //TickValue is the value of the individual price increment for 1 lot of the instrument, expressed in the account currenty + double TickValue=SymbolInfoDouble(gSymbol,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 + LotSize=((RiskBaseAmount*InpMaxRiskPerTrade/100)/(SL*TickValue)); + } + //If the stop loss is zero then the lot size is the default one + if(SL==0) + { + LotSize=InpDefaultLotSize; + } + } +//Normalize the Lot Size to satisfy the allowed lot increment and minimum and maximum position size + LotSize=MathFloor(LotSize/SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_STEP); + + printf("Lot size ", LotSize); + +//Limit the lot size in case it is greater than the maximum allowed by the user + if(LotSize>InpMaxLotSize) + LotSize=InpMaxLotSize; +//Limit the lot size in case it is greater than the maximum allowed by the broker + if(LotSize>SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_MAX)) + LotSize=SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_MAX); + Print("Lot ", LotSize, " Max lot ", SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_MAX)); +//If the lot size is too small then set it to 0 and don't trade + if(LotSizeInpMaxStopLoss) + { + 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; + } + } diff --git a/Include/Nkanven/Gervis/ScanPositions.mqh b/Include/Nkanven/Gervis/ScanPositions.mqh new file mode 100644 index 0000000..7adfdb0 --- /dev/null +++ b/Include/Nkanven/Gervis/ScanPositions.mqh @@ -0,0 +1,49 @@ +//+------------------------------------------------------------------+ +//| 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 + gTotalOpenOrders = 0; + gTotalOpenBuy = 0; + gTotalOpenSell = 0; + for(int i=0; igLastBarTraded || gLastBarTraded==NULL) + gLastBarTraded=(datetime)PositionGetInteger(POSITION_TIME); + } + Print("Total positions ", gTotalOpenOrders, " - Total buys ", gTotalOpenBuy, " - Total sells ", gTotalOpenSell); + return true; + } \ No newline at end of file diff --git a/Include/Nkanven/Gervis/TradeManager.mqh b/Include/Nkanven/Gervis/TradeManager.mqh new file mode 100644 index 0000000..3bf43bd --- /dev/null +++ b/Include/Nkanven/Gervis/TradeManager.mqh @@ -0,0 +1,27 @@ +//+------------------------------------------------------------------+ +//| TradeManager.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/Gervis/TradingHour.mqh b/Include/Nkanven/Gervis/TradingHour.mqh new file mode 100644 index 0000000..945f776 --- /dev/null +++ b/Include/Nkanven/Gervis/TradingHour.mqh @@ -0,0 +1,49 @@ +//+------------------------------------------------------------------+ +//| TradingHour.mqh | +//| Copyright 2021, Nkondog Anselme Venceslas | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2021, Nkondog Anselme Venceslas" +#property link "https://www.mql5.com" + +//Check and return if it is operation hours or not +void CheckOperationHours() + { +//If we are not using operating hours then IsOperatingHours is true and I skip the other checks + if(!InpUseTradingHours) + { + gIsOperatingHours=true; + return; + } +//Check if the current hour is between the allowed hours of operations, if so IsOperatingHours is set true + Print("1 this is ", (InpTradingHourStart==InpTradingHourEnd && dt.hour==InpTradingHourStart)); + Print("2 this is ", (InpTradingHourStart= InpTradingStartMin); + + if(InpTradingHourStart==InpTradingHourEnd && dt.hour==InpTradingHourStart) + { + gIsOperatingHours=true; + return; + } + + if(InpTradingHourStart= InpTradingStartMin) + { + gIsOperatingHours=true; + return; + } + if(dt.hour > InpTradingHourStart) + { + gIsOperatingHours=true; + return; + } + } + + if(InpTradingHourStart>InpTradingHourEnd && ((dt.hour>=InpTradingHourStart && dt.hour<=23) || (dt.hour<=InpTradingHourEnd && dt.hour>=0))) + { + gIsOperatingHours=true; + return; + } + } +//+------------------------------------------------------------------+