If any one could spare just a few seconds to help me it would really be appreciated. I have this EA and it works except that it executes orders at the wrong times. What happens is that it will open an order the way it is supposed to but then, when that order closes either by hitting the TP or SL it opens an order in the same direction on the next bar. This is a problem because the second time it opens an order there is no signal so it should not be opening any orders.
What I am looking for is a new set of eyes that can help me spot the bug in my code. My guess is right now there is some loop or something that when an entry signal is given the EA does not reset itself after it executes an order.
Here is the code:
What I am looking for is a new set of eyes that can help me spot the bug in my code. My guess is right now there is some loop or something that when an entry signal is given the EA does not reset itself after it executes an order.
Here is the code:
PHP Code
extern string SEP01 = "*----Execution Options-----*";
extern int EA_Mode = 0; // 0 = trade and manage, 1 = trade only, 2 = manage only
extern string SEP02 = "*----Parameter Values------*";
extern double Lot_Size = 0.1;
extern int Lot_Divider = 1; // Lot_Size must be dividable by this number; number must be 1 or higher. Also Broker must support the resulting Lotsize
extern int Stop_Loss = 200;
extern int TP_Increment = 50;
extern bool LetLastLotRun = false; // if true, last Lot-part will run till manual closed, BE, or reversing signal
extern int Trade_Window = 5; // number of minutes after open of bar to set new trades
extern int Magic_Number = 914189114;
int k;
int iTicket;
int iTradeDir;
double dLastTP;
double dThisProfit;
double iTradesClosed;
double dSL;
double dSignal;
double TP_Increment_Int;
double Lot_Part;
int BarsCount = 0;
int init()
{
iTicket = 0;
iTradeDir = 0;
dLastTP = 0.0;
dThisProfit = 0.0;
iTradesClosed = 0;
dSL = -Stop_Loss * Point;
dSignal = 0.0;
TP_Increment_Int = TP_Increment * Point;
Lot_Part = Lot_Size / Lot_Divider;
return(0);
}
int deinit()
{
return(0);
}
int start()
{
//------------------//
// GET TRADE INFO //
//------------------//
iTicket = 0;
iTradeDir = 0;
iTradesClosed = 0;
for (k = 0; k < OrdersTotal(); k++)
if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES) == true)
if (OrderSymbol() == Symbol()
&& (OrderType() == OP_BUY || OrderType() == OP_SELL))
iTicket = OrderTicket();
if ((EA_Mode == 0 || EA_Mode == 1) && OrderMagicNumber() != Magic_Number)
iTicket = 0;
if (iTicket == 0)
{
ObjectDelete("StopLine");
ObjectDelete("TPLine");
}
if (iTicket != 0)
{
OrderSelect(iTicket, SELECT_BY_TICKET);
if (OrderType() == OP_BUY)
{
iTradeDir = 1;
dThisProfit = Bid - OrderOpenPrice();
}
if (OrderType() == OP_SELL)
{
iTradeDir = -1;
dThisProfit = OrderOpenPrice() - Ask;
}
iTradesClosed = Lot_Divider - (OrderLots() / Lot_Part); //number of closed Trades (x of Lot_Divider)
dSL = -Stop_Loss * Point;
if (iTradesClosed > 0) //StopLoss to BE when first Lot-part is closed
dSL = 0.0;
dLastTP = iTradesClosed * TP_Increment_Int;
}
//----------------//
// MANAGE TRADE //
//----------------//
if (iTicket != 0 && (EA_Mode == 0 || EA_Mode == 2))
{
ObjectDelete("StopLine");
switch (iTradeDir)
{
case 1:
ObjectCreate("StopLine", OBJ_HLINE, 0, 0, OrderOpenPrice() + dSL);
break;
case -1:
ObjectCreate("StopLine", OBJ_HLINE, 0, 0, OrderOpenPrice() - dSL);
break;
}
ObjectSet("StopLine", OBJPROP_COLOR, Red);
ObjectSet("StopLine", OBJPROP_STYLE, STYLE_DASHDOTDOT);
if (dThisProfit <= dSL) //close lots if SL reached
{
if (iTradeDir == 1)
OrderClose(OrderTicket(), OrderLots(), Bid, 5, Blue);
if (iTradeDir == -1)
OrderClose(OrderTicket(), OrderLots(), Ask, 5, Red);
iTicket = 0;
iTradeDir = 0;
dLastTP = 0.0;
dThisProfit = 0.0;
iTradesClosed = 0;
dSL = -Stop_Loss * Point;
return(0);
}
ObjectDelete("TPLine");
switch (iTradeDir)
{
case 1:
ObjectCreate("TPLine", OBJ_HLINE, 0, 0, OrderOpenPrice() + (dLastTP + TP_Increment_Int));
break;
case -1:
ObjectCreate("TPLine", OBJ_HLINE, 0, 0, OrderOpenPrice() - (dLastTP + TP_Increment_Int));
break;
}
ObjectSet("TPLine", OBJPROP_COLOR, Green);
ObjectSet("TPLine", OBJPROP_STYLE, STYLE_DASHDOTDOT);
if (dThisProfit >= dLastTP + TP_Increment_Int)
{
dSL = 0.0;
if (Lot_Divider == 1) //if single TP, close whole Lot_Size when price reaches TP
{
switch(iTradeDir)
{
case 1:
OrderClose (OrderTicket(), Lot_Size, Bid, 3, Violet);
case -1:
OrderClose (OrderTicket(), Lot_Size, Ask, 3, Violet);
}
}
else if (LetLastLotRun == true)
{
if (iTradesClosed <= (Lot_Divider - 2)) //if multiple TP, close 1 part of Lot_Size for each TP increment; let last part run till manual closed, till BE, or reverse signal
{
dLastTP += TP_Increment_Int;
switch(iTradeDir)
{
case 1:
OrderClose (OrderTicket(), Lot_Part, Bid, 3, Green);
case -1:
OrderClose (OrderTicket(), Lot_Part, Ask, 3, Green);
}
}
}
else if (LetLastLotRun == false)
{
if (iTradesClosed <= (Lot_Divider - 1)) //if multiple TP, close 1 part of Lot_Size for each TP increment
{
dLastTP += TP_Increment_Int;
switch(iTradeDir)
{
case 1:
OrderClose (OrderTicket(), Lot_Part, Bid, 3, Green);
case -1:
OrderClose (OrderTicket(), Lot_Part, Ask, 3, Green);
}
}
}
}
}
//-----------------------//
// INITIATE NEW TRADES //
//-----------------------//
if (Bars > BarsCount)
{
if (EA_Mode == 0 || EA_Mode == 1)
{
if ((iLow(NULL, 0, 0) < iCustom(NULL, 0, "Donchian_Channels",49, 3, -2, 0, 700, 0, 0)) && (iLow(NULL, 0, 1) > iCustom(NULL, 0, "Donchian_Channels",49, 3, -2, 0, 700, 0, 1))) dSignal = 1.0;
if ((iHigh(NULL, 0, 0) > iCustom(NULL, 0, "Donchian_Channels",49, 3, -2, 0, 700, 1, 0)) && (iHigh(NULL, 0, 1) < iCustom(NULL, 0, "Donchian_Channels",49, 3, -2, 0, 700, 1, 1))) dSignal = -1.0;
if (dSignal > 0)
switch (iTradeDir)
{
case -1:
if (OrderSelect(iTicket, SELECT_BY_TICKET) == true)
OrderClose(iTicket, OrderLots(), Ask, 3, DarkOrange);
case 0:
OrderSend(Symbol(), OP_BUY, Lot_Size, Ask, 3, 0, 0, NULL, Magic_Number, 0, Blue);
}
if (dSignal < 0)
switch (iTradeDir)
{
case 1:
if (OrderSelect(iTicket, SELECT_BY_TICKET) == true)
OrderClose(iTicket, OrderLots(), Bid, 3, DarkOrange);
case 0:
OrderSend(Symbol(), OP_SELL, Lot_Size, Bid, 3, 0, 0, NULL, Magic_Number, 0, Red);
}
}
BarsCount = Bars;
}
//-------------------------//
// REPORT TRADING STATUS //
//-------------------------//
string zTradeDir = "No Trade";
if (iTradeDir == 1) zTradeDir = "Long";
if (iTradeDir == -1) zTradeDir = "Short";
string zProfit = DoubleToStr(dThisProfit / Point, 0);
string zStop = DoubleToStr(dSL / Point, 0);
string zNextTP = DoubleToStr((dLastTP + TP_Increment_Int) / Point, 0);
Comment("Current Position: ", zTradeDir, "\n",
" Current Profit: ", zProfit, "\n",
" Stop Loss: ", zStop, "\n",
" Next TP: ", zNextTP);
return(0);
}
Rhoman