mirror of
https://github.com/rithsila/MT5-EA-Sniper-Strategy.git
synced 2026-08-12 18:28:08 +00:00
268 lines
20 KiB
Plaintext
268 lines
20 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| E_EntriesManagement.mqh |
|
|
//| Copyright 2021, Nkondog Anselme Venceslas |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2021, Nkondog Anselme Venceslas"
|
|
#property link "https://www.mql5.com"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| defines |
|
|
//+------------------------------------------------------------------+
|
|
//Evaluate if there is an entry signal
|
|
void EvaluateEntry()
|
|
{
|
|
|
|
//Print("AdxMain ", AdxMain, " AdxPlus ", AdxPlus, " AdxMinus ", AdxMinus);
|
|
|
|
//Print("Kijunsen value "+ Kijunsen+" Tenkansen value "+ Tenkansen+ " Senkouspan B value " + Senkouspanb + " BwSenkouspana " +BwSenkouspana+" Chinkou span " +Chinkouspan);
|
|
|
|
//Print("Evaluating entry possibility, In Signal entry "+SignalEntry);
|
|
|
|
SignalEntry=SIGNAL_ENTRY_NEUTRAL;
|
|
if(!IsSpreadOK)
|
|
{
|
|
Print("Spread is too high to open a position");
|
|
return; //If the spread is too high don't give an entry signal
|
|
}
|
|
if(UseTradingHours && !IsOperatingHours)
|
|
return; //If you are using trading hours and it's not a trading hour don't give an entry signal
|
|
//if(!IsNewCandle) return; //If you want to provide a signal only if it's a new candle opening
|
|
//if(IsTradedThisBar) return; //If you don't want to execute multiple trades in the same bar
|
|
|
|
if(TotalOpenOrders>0)
|
|
{
|
|
Print("Trade activity suspended! Opened position(s) found.");
|
|
return; //If there are already open orders and you don't want to open more
|
|
}
|
|
TradeManager();
|
|
|
|
/*Checking trend momentum
|
|
if(AdxMain > adx_momentum_boundary)
|
|
{
|
|
if(AdxPlus > AdxMinus)
|
|
{
|
|
UpTrendingMarket = true;
|
|
}
|
|
if(AdxPlus < AdxMinus)
|
|
{
|
|
DownTrendingMarket = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
UpTrendingMarket = false;
|
|
DownTrendingMarket = false;
|
|
}
|
|
*/
|
|
|
|
Print("Is it true ", Chinkouspan > BwSenkouspana && Chinkouspan > BwSenkouspanb);
|
|
//Ichimoku trading buy signal
|
|
if(iClose(Symb,_Period,1) > Tenkansen
|
|
&& Kijunsen < Tenkansen
|
|
&& iClose(Symb,_Period,1) > Senkouspanb
|
|
&& iClose(Symb,_Period,1) > Senkouspana
|
|
&& Chinkouspan > BwSenkouspana && Chinkouspan > BwSenkouspanb
|
|
&& Senkouspana > Senkouspanb)
|
|
{
|
|
SignalEntry=SIGNAL_ENTRY_BUY;
|
|
Print("Buy entry signal");
|
|
}
|
|
|
|
Print("Is it true 2 ", Chinkouspan < BwSenkouspana && Chinkouspan < BwSenkouspanb);
|
|
//Ichimoku trading sell signal
|
|
if(iClose(Symb,_Period,1) < Tenkansen
|
|
&& Kijunsen > Tenkansen
|
|
&& iClose(Symb,_Period,1) < Senkouspanb
|
|
&& iClose(Symb,_Period,1) < Senkouspana
|
|
&& Chinkouspan < BwSenkouspana && Chinkouspan < BwSenkouspanb
|
|
&& Senkouspana < Senkouspanb)
|
|
{
|
|
SignalEntry=SIGNAL_ENTRY_SELL;
|
|
Print("Sell entry signal");
|
|
}
|
|
Print("Evaluating entry possibility, Out Signal entry "+IntegerToString(SignalEntry));
|
|
}
|
|
|
|
|
|
//Execute entry if there is an entry signal
|
|
void ExecuteEntry()
|
|
{
|
|
//If there is no entry signal no point to continue, exit the function
|
|
if(SignalEntry==SIGNAL_ENTRY_NEUTRAL)
|
|
return;
|
|
int Operation;
|
|
double OpenPrice=0;
|
|
double StopLossPrice=0;
|
|
double TakeProfitPrice=0;
|
|
//If there is a Buy entry signal
|
|
if(SignalEntry==SIGNAL_ENTRY_BUY)
|
|
{
|
|
Print("In buy execution");
|
|
Operation=ORDER_TYPE_BUY; //Set the operation to BUY
|
|
OpenPrice=last_tick.ask; //Set the open price to Ask price
|
|
//If the Stop Loss is fixed and the default stop loss is set
|
|
if(StopLossMode==SL_FIXED && DefaultStopLoss>0)
|
|
{
|
|
StopLossPrice=OpenPrice-DefaultStopLoss*Point();
|
|
}
|
|
//If the Stop Loss is automatic
|
|
if(StopLossMode==SL_AUTO)
|
|
{
|
|
//Set the Stop Loss to the custom stop loss price
|
|
if(Senkouspanb < Senkouspana && Senkouspanb < Kijunsen && Kijunsen < Senkouspana)
|
|
{
|
|
StopLossPrice=Senkouspanb;
|
|
}
|
|
else
|
|
{
|
|
StopLossPrice=Kijunsen;
|
|
}
|
|
if(Senkouspana < Senkouspanb && Kijunsen > Senkouspana && Kijunsen < Senkouspanb)
|
|
{
|
|
StopLossPrice=Senkouspana;
|
|
}
|
|
}
|
|
//If the Take Profix price is fixed and defined
|
|
if(TakeProfitMode==TP_FIXED && DefaultTakeProfit>0)
|
|
{
|
|
TakeProfitPrice=OpenPrice+DefaultTakeProfit*Point();
|
|
}
|
|
//If the Take Profit is automatic
|
|
if(TakeProfitMode==TP_AUTO)
|
|
{
|
|
//Set the Take Profit to the custom take profit price
|
|
TakeProfitPrice=OpenPrice+((OpenPrice-StopLossPrice)*TakeProfitPercent);
|
|
}
|
|
Print("Stop loss ", StopLossPrice, " Digits ", Digits());
|
|
if(ProfitRun)
|
|
TakeProfitPrice=0;
|
|
//Normalize the digits for the float numbers
|
|
if(AtrStopLoss)
|
|
StopLossPrice=OpenPrice - (Atr*atr_sl_factor);
|
|
|
|
OpenPrice=NormalizeDouble(OpenPrice,Digits());
|
|
StopLossPrice=NormalizeDouble(StopLossPrice,Digits());
|
|
TakeProfitPrice=NormalizeDouble(TakeProfitPrice,Digits());
|
|
//Submit the order
|
|
Print("Sending buy order Stop loss ", StopLossPrice);
|
|
SendOrder(Operation,Symbol(),OpenPrice,StopLossPrice,TakeProfitPrice);
|
|
}
|
|
|
|
|
|
if(SignalEntry==SIGNAL_ENTRY_SELL)
|
|
{
|
|
Operation=ORDER_TYPE_SELL; //Set the operation to SELL
|
|
OpenPrice=last_tick.bid; //Set the open price to Ask price
|
|
//If the Stop Loss is fixed and the default stop loss is set
|
|
if(StopLossMode==SL_FIXED && DefaultStopLoss>0)
|
|
{
|
|
StopLossPrice=OpenPrice+DefaultStopLoss*Point();
|
|
}
|
|
//If the Stop Loss is automatic
|
|
if(StopLossMode==SL_AUTO)
|
|
{
|
|
|
|
//Set the Stop Loss to the custom stop loss price
|
|
if(Senkouspanb > Senkouspana && Senkouspanb > Kijunsen && Kijunsen > Senkouspana)
|
|
{
|
|
StopLossPrice=Senkouspanb;
|
|
}
|
|
else
|
|
{
|
|
StopLossPrice=Kijunsen;
|
|
}
|
|
if(Senkouspana > Senkouspanb && Kijunsen < Senkouspana && Kijunsen > Senkouspanb)
|
|
{
|
|
StopLossPrice=Senkouspana;
|
|
}
|
|
}
|
|
//If the Take Profix price is fixed and defined
|
|
if(TakeProfitMode==TP_FIXED && DefaultTakeProfit>0)
|
|
{
|
|
TakeProfitPrice=OpenPrice-DefaultTakeProfit*Point();
|
|
}
|
|
//If the Take Profit is automatic
|
|
if(TakeProfitMode==TP_AUTO)
|
|
{
|
|
//Set the Take Profit to the custom take profit price
|
|
TakeProfitPrice=OpenPrice-((StopLossPrice-OpenPrice)*TakeProfitPercent);
|
|
//Alert("Take profit ", (rangeScope*takeprofitpercent));
|
|
}
|
|
if(ProfitRun)
|
|
TakeProfitPrice=0;
|
|
|
|
if(AtrStopLoss)
|
|
StopLossPrice=OpenPrice + (Atr*atr_sl_factor);
|
|
//Normalize the digits for the float numbers
|
|
OpenPrice=NormalizeDouble(OpenPrice,Digits());
|
|
StopLossPrice=NormalizeDouble(StopLossPrice,Digits());
|
|
TakeProfitPrice=NormalizeDouble(TakeProfitPrice,Digits());
|
|
//Submit the order
|
|
SendOrder(Operation,Symbol(),OpenPrice,StopLossPrice,TakeProfitPrice);
|
|
}
|
|
|
|
}
|
|
|
|
//Send Order Function adjusted to handle errors and retry multiple times
|
|
void SendOrder(int Command, string Instrument, double OpenPrice, double SLPrice, double TPPrice, datetime Expiration=0)
|
|
{
|
|
MqlTradeRequest request= {};
|
|
MqlTradeResult result= {};
|
|
//Retry a number of times in case the submission fails
|
|
for(int i=1; i<=OrderOpRetry; i++)
|
|
{
|
|
//Set the color for the open arrow for the order
|
|
/*color OpenColor=clrBlueViolet;
|
|
if(Command==OP_BUY)
|
|
{
|
|
OpenColor=clrChartreuse;
|
|
}
|
|
if(Command==OP_SELL)
|
|
{
|
|
OpenColor=clrDarkTurquoise;
|
|
}*/
|
|
//Calculate the position size, if the lot size is zero then exit the function
|
|
double SLPoints=0;
|
|
//If the Stop Loss price is set then find the points of distance between open price and stop loss price, and round it
|
|
if(SLPrice>0)
|
|
SLPoints=MathCeil(MathAbs(OpenPrice-SLPrice)/Point());
|
|
//Call the function to calculate the position size
|
|
Print("Open price - SL Price", OpenPrice, SLPrice);
|
|
CheckHistory();
|
|
|
|
LotSizeCalculate(SLPoints);
|
|
//If the position size is zero then exit and don't submit any orderInit
|
|
|
|
Print("Stop loss en point ", SLPoints);
|
|
if(LotSize==0)
|
|
return;
|
|
|
|
request.action =TRADE_ACTION_DEAL; // type de l'opération de trading
|
|
request.symbol =Instrument; // symbole
|
|
request.volume =LotSize; // volume de 0.1 lot
|
|
request.type =Command; // type de l'ordre
|
|
request.price =SYMBOL_TRADE_EXECUTION_MARKET; // prix d'ouverture
|
|
request.sl =NormalizeDouble(SLPrice,Digits());
|
|
request.tp =NormalizeDouble(TPPrice,Digits());
|
|
request.type_filling =ORDER_FILLING_FOK;
|
|
request.deviation =Slippage;
|
|
request.expiration =Expiration; // déviation du prix autorisée
|
|
//Submit the order
|
|
|
|
if(!OrderSend(request,result))
|
|
PrintFormat("OrderSend erreur %d",GetLastError()); // en cas d'erreur d'envoi de la demande, affiche le code d'erreur
|
|
//--- informations de l'opération
|
|
PrintFormat("retcode=%u transaction=%I64u ordre=%I64u",result.retcode,result.deal,result.order);
|
|
|
|
if(result.retcode == TRADE_RETCODE_DONE && result.deal != 0)
|
|
{
|
|
FollowProfit = false;
|
|
PositionProfit = 0;
|
|
break;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
//+------------------------------------------------------------------+
|