mirror of
https://github.com/rithsila/MT5-EA-Sniper-Strategy.git
synced 2026-08-23 15:48:12 +00:00
Managing weird order placing
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -11,8 +11,9 @@
|
|||||||
#include <Nkanven\GeminiHedge\TradingHour.mqh> //Trading hours checks
|
#include <Nkanven\GeminiHedge\TradingHour.mqh> //Trading hours checks
|
||||||
#include <Nkanven\GeminiHedge\Prechecks.mqh> //Trading conditions checks
|
#include <Nkanven\GeminiHedge\Prechecks.mqh> //Trading conditions checks
|
||||||
#include <Nkanven\GeminiHedge\ScanPositions.mqh> //Trading conditions checks
|
#include <Nkanven\GeminiHedge\ScanPositions.mqh> //Trading conditions checks
|
||||||
|
#include <Nkanven\GeminiHedge\DCAManager.mqh> //DCA manager
|
||||||
#include <Nkanven\GeminiHedge\LotSizeCal.mqh> //Lot size calculator
|
#include <Nkanven\GeminiHedge\LotSizeCal.mqh> //Lot size calculator
|
||||||
#include <Nkanven\GeminiHedge\EntriesManager.mqh> //Lot size calculator
|
#include <Nkanven\GeminiHedge\EntriesManager.mqh> //Trade entries manager
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
//| Expert initialization function |
|
//| Expert initialization function |
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
@@ -45,18 +46,28 @@ void OnTick()
|
|||||||
|
|
||||||
if(InpActivateDCAHedging)
|
if(InpActivateDCAHedging)
|
||||||
{
|
{
|
||||||
string instruments[] = {InpInstrument1, InpInstrument2};
|
Print("DCA Hedging is activated");
|
||||||
|
ArrayResize(instruments,2);
|
||||||
|
instruments[0] = InpInstrument1;
|
||||||
|
instruments[1] = InpInstrument2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string instruments[] = {InpInstrument1};
|
Print("DCA Hedging is not activated");
|
||||||
|
ArrayResize(instruments,1);
|
||||||
|
instruments[0] = InpInstrument1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Print("Instrument size", ArraySize(instruments));
|
||||||
for(int i=0; i<ArraySize(instruments); i++)
|
for(int i=0; i<ArraySize(instruments); i++)
|
||||||
{
|
{
|
||||||
Spread = SymbolInfoInteger(instruments[i], SYMBOL_SPREAD);
|
Spread = SymbolInfoInteger(instruments[i], SYMBOL_SPREAD);
|
||||||
SymbolInfoTick(instruments[i],last_tick);
|
SymbolInfoTick(instruments[i],last_tick);
|
||||||
|
Print("last_tick ask ", last_tick.ask, " instruments ", instruments[i]);
|
||||||
gSymbol = instruments[i];
|
gSymbol = instruments[i];
|
||||||
|
point = SymbolInfoDouble(gSymbol, SYMBOL_POINT);
|
||||||
|
|
||||||
|
Print("Point ", InpDefaultTakeProfit);
|
||||||
|
|
||||||
|
|
||||||
CheckOperationHours();
|
CheckOperationHours();
|
||||||
@@ -66,10 +77,7 @@ void OnTick()
|
|||||||
if(!gIsPreChecksOk)
|
if(!gIsPreChecksOk)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//Check if positions not exist
|
DcaManager();
|
||||||
|
|
||||||
|
|
||||||
//Check pending orders
|
|
||||||
|
|
||||||
Print("Good for trading...");
|
Print("Good for trading...");
|
||||||
ExecuteEntry();
|
ExecuteEntry();
|
||||||
|
|||||||
@@ -12,6 +12,33 @@
|
|||||||
void DcaManager()
|
void DcaManager()
|
||||||
{
|
{
|
||||||
//Compute pending orders levels
|
//Compute pending orders levels
|
||||||
|
ENUM_DCA_STATUS dcaStatus = DcaWatcher();
|
||||||
|
|
||||||
|
switch(dcaStatus)
|
||||||
|
{
|
||||||
|
case NO_DEALS :
|
||||||
|
signal = NO_SIGNAL;
|
||||||
|
break;
|
||||||
|
case NO_BUY_POSITIONS :
|
||||||
|
signal = BUY_SIGNAL;
|
||||||
|
break;
|
||||||
|
case BUY_PENDING_ORDERS :
|
||||||
|
signal = PENDING_ORDERS;
|
||||||
|
break;
|
||||||
|
case NO_UPPER_BUY_ORDERS :
|
||||||
|
signal = BUY_STOP_SIGNAL;
|
||||||
|
break;
|
||||||
|
case NO_LOWER_BUY_ORDERS :
|
||||||
|
signal = BUY_LIMIT_SIGNAL;
|
||||||
|
break;
|
||||||
|
case BUY_POSITION_EXISTS :
|
||||||
|
signal = NO_SIGNAL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
signal = NO_SIGNAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
@@ -19,11 +46,84 @@ void DcaManager()
|
|||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
//| |
|
//| |
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
void DcaWatcher()
|
ENUM_DCA_STATUS DcaWatcher()
|
||||||
{
|
{
|
||||||
if(gTotalBuyPositions > 0)
|
if(gTotalBuyPositions > 0)
|
||||||
{
|
{
|
||||||
//return position exists
|
//Get last opened position id
|
||||||
}
|
int lastTicketId = gTotalBuyPositions;
|
||||||
|
|
||||||
|
bool hasOrderAbove = false, hasOrderBelow = false;
|
||||||
|
|
||||||
|
if(PositionGetTicket(lastTicketId) == 0)
|
||||||
|
{
|
||||||
|
int Error=GetLastError();
|
||||||
|
Print("ERROR - Unable to select the order - ",Error," - ",Error);
|
||||||
|
return NO_DEALS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(PositionGetSymbol(lastTicketId)==gSymbol && PositionGetInteger(POSITION_MAGIC)==InpMagicNumber)
|
||||||
|
{
|
||||||
|
//Compute above and below orders price
|
||||||
|
|
||||||
|
Print("Last ticket id ", lastTicketId, " last ticket price ", PositionGetDouble(POSITION_PRICE_OPEN));
|
||||||
|
gUpOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN) + (InpBuyCallBack * point);
|
||||||
|
gDownOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN) - (InpBuyCallBack * point);
|
||||||
|
|
||||||
|
//Check orders around the last opened position
|
||||||
|
for(int i=0; i<gTotalOrders; i++)
|
||||||
|
{
|
||||||
|
//If there is a problem reading the order print the error, exit the function and return false
|
||||||
|
if(OrderGetTicket(i) == 0)
|
||||||
|
{
|
||||||
|
int Error=GetLastError();
|
||||||
|
Print("ERROR - Unable to select the order - ",Error," - ",Error);
|
||||||
|
return NO_DEALS;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Check existence of above and below orders to last opened position
|
||||||
|
if(OrderGetString(ORDER_SYMBOL)==gSymbol && OrderGetInteger(ORDER_MAGIC)==InpMagicNumber)
|
||||||
|
{
|
||||||
|
if(gUpOpenPrice == OrderGetDouble(ORDER_PRICE_OPEN))
|
||||||
|
{
|
||||||
|
hasOrderAbove = true;
|
||||||
|
}
|
||||||
|
if(gDownOpenPrice == OrderGetDouble(ORDER_PRICE_OPEN))
|
||||||
|
{
|
||||||
|
hasOrderBelow = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Do nothing if both orders exist
|
||||||
|
if(hasOrderAbove && hasOrderBelow)
|
||||||
|
{
|
||||||
|
return NO_DEALS;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Report non existence of one or both orders
|
||||||
|
if(!hasOrderAbove && hasOrderBelow)
|
||||||
|
{
|
||||||
|
return NO_UPPER_BUY_ORDERS;
|
||||||
|
}
|
||||||
|
if(hasOrderAbove && !hasOrderBelow)
|
||||||
|
{
|
||||||
|
return NO_LOWER_BUY_ORDERS;
|
||||||
|
}
|
||||||
|
if(!hasOrderAbove && !hasOrderBelow)
|
||||||
|
{
|
||||||
|
return BUY_PENDING_ORDERS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return BUY_POSITION_EXISTS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return NO_BUY_POSITIONS;
|
||||||
|
}
|
||||||
|
return NO_DEALS;
|
||||||
}
|
}
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
|||||||
Binary file not shown.
@@ -42,6 +42,7 @@ void LotSizeCalculate(double SL=0)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Normalize the Lot Size to satisfy the allowed lot increment and minimum and maximum position size
|
//Normalize the Lot Size to satisfy the allowed lot increment and minimum and maximum position size
|
||||||
|
Print("gLotSize " , gLotSize, " SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_STEP)) ", SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_STEP), " gSymbol ", gSymbol, " SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_STEP)", SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_STEP));
|
||||||
gLotSize=MathFloor(gLotSize/SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_STEP);
|
gLotSize=MathFloor(gLotSize/SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(gSymbol,SYMBOL_VOLUME_STEP);
|
||||||
|
|
||||||
Print("LotSize ", gLotSize);
|
Print("LotSize ", gLotSize);
|
||||||
|
|||||||
@@ -55,19 +55,25 @@ enum ENUM_MODE_TRADING_TIME
|
|||||||
enum ENUM_MODE_TRADE_SIGNAL
|
enum ENUM_MODE_TRADE_SIGNAL
|
||||||
{
|
{
|
||||||
BUY_SIGNAL=0, //Buy trade
|
BUY_SIGNAL=0, //Buy trade
|
||||||
SELL_SIGNAL=1, //Sell trade
|
BUY_STOP_SIGNAL=1, //Sell trade
|
||||||
NO_SIGNAL=2, //No trade
|
BUY_LIMIT_SIGNAL=2,
|
||||||
|
NO_SIGNAL=3, //No trade
|
||||||
|
PENDING_ORDERS=4
|
||||||
};
|
};
|
||||||
|
|
||||||
//Enumerative for the Take Profit Mode
|
//Enumerative for the DCA mode
|
||||||
enum ENUM_DCA_STATUS
|
enum ENUM_DCA_STATUS
|
||||||
{
|
{
|
||||||
NO_DEALS=0,
|
NO_DEALS=0,
|
||||||
NO_BUY_POSITIONS=1, //FIXED TAKE PROFIT
|
NO_BUY_POSITIONS=1,
|
||||||
NO_UPPER_BUY_ORDERS=2, //AUTOMATIC TAKE PROFIT
|
NO_UPPER_BUY_ORDERS=2,
|
||||||
NO_LOWER_BUY_ORDERS=3,
|
NO_LOWER_BUY_ORDERS=3,
|
||||||
|
BUY_POSITION_EXISTS=4,
|
||||||
|
UPPER_BUY_ORDERS=5,
|
||||||
|
LOWER_BUY_ORDERS=6,
|
||||||
|
BUY_PENDING_ORDERS=7
|
||||||
};
|
};
|
||||||
v
|
|
||||||
//
|
//
|
||||||
// Input Section
|
// Input Section
|
||||||
//
|
//
|
||||||
@@ -87,7 +93,7 @@ input int InpDefaultStopLoss=200; //Defaul
|
|||||||
input int InpMinStopLoss=0; //Minimum Allowed Stop Loss In Points
|
input int InpMinStopLoss=0; //Minimum Allowed Stop Loss In Points
|
||||||
input int InpMaxStopLoss=5000; //Maximum Allowed Stop Loss In Points
|
input int InpMaxStopLoss=5000; //Maximum Allowed Stop Loss In Points
|
||||||
input string Comment_02="----------------------"; //Take profit settings
|
input string Comment_02="----------------------"; //Take profit settings
|
||||||
input int InpDefaultTakeProfit=60; //Default Take Profit In Points (0=No Take Profit)
|
input int InpDefaultTakeProfit=100; //Default Take Profit In Points (0=No Take Profit)
|
||||||
input int InpMinTakeProfit=0; //Minimum Allowed Take Profit In Points
|
input int InpMinTakeProfit=0; //Minimum Allowed Take Profit In Points
|
||||||
input int InpMaxTakeProfit=5000; //Maximum Allowed Take Profit In Points
|
input int InpMaxTakeProfit=5000; //Maximum Allowed Take Profit In Points
|
||||||
input double InpTakeProfitPercent=1.0; //Take Profit percent on risk base
|
input double InpTakeProfitPercent=1.0; //Take Profit percent on risk base
|
||||||
@@ -101,15 +107,14 @@ input int InpNightTradingHourStart=1; //Night
|
|||||||
input int InpNightTradingHourEnd=5; //Night Trading End Hour (Broker Server Hour)
|
input int InpNightTradingHourEnd=5; //Night Trading End Hour (Broker Server Hour)
|
||||||
|
|
||||||
input string Comment_04="----------------------"; //DCA settings
|
input string Comment_04="----------------------"; //DCA settings
|
||||||
input bool InpActivateDCAHedging=false; //Active DCA Hedging
|
input bool InpActivateDCAHedging=true; //Active DCA Hedging
|
||||||
input string InpInstrument1="EURUSD.i"; //Instrument 1
|
input string InpInstrument1="EURUSD"; //Instrument 1
|
||||||
input string InpInstrument2="USDCHF.i"; //Instrument 2
|
input string InpInstrument2="USDCHF"; //Instrument 2
|
||||||
|
input int InpBuyCallBack=100; //Buy call back pips
|
||||||
|
input int InpMaxCallBack=10; //Call back limit
|
||||||
|
input int InpWholePositionTP=0; //Whole position TP percent. 0 to disable
|
||||||
|
|
||||||
input string Comment_05="----------------------"; //Stop loss settings
|
input string Comment_05="----------------------"; //Stop loss settings
|
||||||
// Fast moving average
|
|
||||||
input int InpPeriods = 21; // Fast periods
|
|
||||||
input ENUM_MA_METHOD InpMethod = MODE_SMA; // Fast method
|
|
||||||
input ENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE; // Fast price
|
|
||||||
input string InpComment = __FILE__; //Default trade comment
|
input string InpComment = __FILE__; //Default trade comment
|
||||||
input int InpMagicNumber = 198901; //Magic Number
|
input int InpMagicNumber = 198901; //Magic Number
|
||||||
input ENUM_TIMEFRAMES InpTimeFrame = PERIOD_CURRENT;
|
input ENUM_TIMEFRAMES InpTimeFrame = PERIOD_CURRENT;
|
||||||
@@ -126,15 +131,17 @@ bool gIsPreChecksOk=false; //Indica
|
|||||||
bool gIsSpreadOK=false; //Indicates if the spread is low enough to trade
|
bool gIsSpreadOK=false; //Indicates if the spread is low enough to trade
|
||||||
bool IsSpreadOK=false;
|
bool IsSpreadOK=false;
|
||||||
bool gEmergencyClose=false; //Urgently close losing trade
|
bool gEmergencyClose=false; //Urgently close losing trade
|
||||||
|
double gUpOpenPrice, gDownOpenPrice;
|
||||||
|
|
||||||
|
double gLotSize=InpDefaultLotSize, point;
|
||||||
double gLotSize=InpDefaultLotSize;
|
|
||||||
|
|
||||||
int gTickValue=0;
|
int gTickValue=0;
|
||||||
long Spread;// = SymbolInfoInteger(gSymbol,SYMBOL_SPREAD) / 100; //Check the impact. It's originally a double
|
long Spread;// = SymbolInfoInteger(gSymbol,SYMBOL_SPREAD) / 100; //Check the impact. It's originally a double
|
||||||
|
|
||||||
int gOrderOpRetry = 10;
|
int gOrderOpRetry = 1;
|
||||||
|
|
||||||
MqlTick last_tick, blast_tick;
|
MqlTick last_tick, blast_tick;
|
||||||
MqlDateTime dt;
|
MqlDateTime dt;
|
||||||
|
|
||||||
|
ENUM_MODE_TRADE_SIGNAL signal = NO_SIGNAL;
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
|
|||||||
@@ -37,11 +37,9 @@ void ScanPositions()
|
|||||||
//If it is a buy order then increment the total count of buy orders
|
//If it is a buy order then increment the total count of buy orders
|
||||||
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
|
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
|
||||||
gTotalBuyPositions++;
|
gTotalBuyPositions++;
|
||||||
|
Print(gSymbol, " Position ticket ",PositionGetTicket(i), " POSITION_PRICE_OPEN ", PositionGetDouble(POSITION_PRICE_OPEN));
|
||||||
Print("POSITION_TYPE_BUY ", POSITION_TYPE_BUY, " PositionGetInteger(POSITION_TYPE) ", PositionGetInteger(POSITION_TYPE));
|
|
||||||
}
|
}
|
||||||
Print("Total positions ", gTotalPositions, " - Total buys ", gTotalBuyPositions);
|
Print("Total ", gSymbol, " buy position ", gTotalBuyPositions);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for(int i=0; i<gTotalOrders; i++)
|
for(int i=0; i<gTotalOrders; i++)
|
||||||
@@ -62,15 +60,11 @@ void ScanPositions()
|
|||||||
if(OrderGetInteger(ORDER_MAGIC)!=InpMagicNumber)
|
if(OrderGetInteger(ORDER_MAGIC)!=InpMagicNumber)
|
||||||
continue;
|
continue;
|
||||||
//If it is a buy order then increment the total count of buy orders
|
//If it is a buy order then increment the total count of buy orders
|
||||||
if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY)
|
if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_LIMIT || OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_STOP)
|
||||||
gTotalBuyPositions++;
|
gTotalBuyOrders++;
|
||||||
|
|
||||||
Print("ORDER_TYPE_BUY ", ORDER_TYPE_BUY, " PositionGetInteger(ORDER_TYPE) ", OrderGetInteger(ORDER_TYPE));
|
|
||||||
}
|
}
|
||||||
//+------------------------------------------------------------------+
|
Print("Total ", gSymbol, " Orders ", gTotalOrders, " - Total ", gSymbol, " buy orders ", gTotalBuyOrders);
|
||||||
//| |
|
|
||||||
//+------------------------------------------------------------------+
|
|
||||||
Print("Total Orders ", gTotalOrders, " - Total buys ", gTotalBuyOrders);
|
|
||||||
}
|
}
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
|
|
||||||
|
//+------------------------------------------------------------------+
|
||||||
|
|||||||
Reference in New Issue
Block a user