I try to make the DonchianBreakoutSystem as an EA. But the EA place no trade at all
Can you guys help ?
Thx a lot
Code: Select all
//+------------------------------------------------------------------+
//| MonEA.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property strict
extern double LotSize = 0.1;
extern int BreakEvenPips = 200;
extern bool TradeLondonSession = true;
extern bool TradeUSSession = true;
extern bool TradeTokyoSession = false;
// Heures définies pour les sessions en GMT+0
#define LONDON_OPEN 8
#define LONDON_CLOSE 16
#define NEW_YORK_OPEN 13
#define NEW_YORK_CLOSE 22
#define TOKYO_OPEN 0
#define TOKYO_CLOSE 9
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(!IsTradingAllowed())
return;
double upSignal = iCustom(NULL, 0, "DonchianBreakoutSystem_v1.1.2", 5, 30, 0, 10, 0, 0, 1);
double dnSignal = iCustom(NULL, 0, "DonchianBreakoutSystem_v1.1.2", 5, 30, 0, 10, 1, 0, 1);
ManageOrder(OP_BUY, "Buy Order", Ask, BreakEvenPips);
ManageOrder(OP_SELL, "Sell Order", Bid, BreakEvenPips);
}
//+------------------------------------------------------------------+
//| Vérifie si le trading est autorisé selon la session |
//+------------------------------------------------------------------+
bool IsTradingAllowed()
{
int hour = TimeHour(TimeCurrent());
if((TradeLondonSession && hour >= LONDON_OPEN && hour < LONDON_CLOSE) ||
(TradeUSSession && hour >= NEW_YORK_OPEN && hour < NEW_YORK_CLOSE) ||
(TradeTokyoSession && hour >= TOKYO_OPEN && hour < TOKYO_CLOSE))
return true;
return false;
}
//+------------------------------------------------------------------+
//| Fonction pour gérer les ordres |
//+------------------------------------------------------------------+
void ManageOrder(int orderType, string orderComment, double price, int pipsToBreakEven)
{
bool orderFound = false;
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == 0 && OrderType() == orderType)
{
orderFound = true;
double openPrice = OrderOpenPrice();
double currentProfit = NormalizeDouble((price - openPrice) * (orderType == OP_BUY ? 1 : -1) * Point, 2);
// Vérifier si le trade doit être mis en break-even
if(currentProfit >= pipsToBreakEven * Point)
{
double newStopLoss = orderType == OP_BUY ? openPrice + (pipsToBreakEven * Point) : openPrice - (pipsToBreakEven * Point);
if(OrderModify(OrderTicket(), openPrice, newStopLoss, OrderTakeProfit(), 0, clrYellow))
Print("Break-even stop loss set for order #", OrderTicket());
else
Print("Error setting break-even: ", GetLastError());
}
break; // Sortir après la gestion du premier ordre trouvé
}
}
// Si aucun ordre existant n'est modifié, placer un nouvel ordre
if(!orderFound)
{
int ticket = OrderSend(Symbol(), orderType, LotSize, price, 2, 0, 0, orderComment, 0, 0, orderType == OP_BUY ? clrGreen : clrRed);
if(ticket < 0)
{
Print("Order Send failed with error #", GetLastError());
}
else
{
Print("Order successfully placed with ticket #", ticket);
}
}
}
//+------------------------------------------------------------------+