EA with OrderModify that modifys all open orders
EA with OrderModify that modifys all open orders
Loading saved threads...
Mathias Halén · External communityPost link
External question — Stack Overflow Stack Exchange
Author: Mathias Halén
Original post: https://stackoverflow.com/questions/67749267
License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/
Adaptation: HTML converted to plain text; contact email addresses removed.
EDIT:
This problem was caused by missing {}.
if(OrderComment() == myTradeID)
and lots of code under neeth that line should be inside a {}
So I'm building an EA that reads from a file on the computer that has a string with information on what type of Order (NewOrder, AdjustOrder, or CancelOrder).
void AdjustTradeOrder(string myType,string mySymbole,string myTradeID,int myPosition,double myEntry,double myStopLoss,double myTakeProfit)
The problem I'm having is that inside the code below the EA sometimes just changes the right order but sometimes it changes all open orders and that's a big problem.
I'm trying to check if the myTradeID is the same as the comment on the selected order ID and only then should it modify the order. But sometimes it modifies all orders.
Any idea why?
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void AdjustTradeOrder(string myType,string mySymbole,string myTradeID,int myPosition,double
myEntry,double myStopLoss,double myTakeProfit)
{
if(commentOnOpenOrders(myTradeID) && !commentOnOpenHistory(myTradeID))
{
//--- get minimum stop level
double minstoplevel=MarketInfo(mySymbole,MODE_STOPLEVEL);
double price=MarketInfo(mySymbole,MODE_ASK); ;
double minilot = MarketInfo(mySymbole,MODE_MINLOT);
color orderColor;
if(myPosition==0)
{
orderColor = clrGreen;
}
else
{
orderColor = clrRed;
}
//+------------------------------------------------------------------+
int PositionIndex; // <-- this variable is the index used for the loop
int TotalNumberOfOrders; // <-- this variable will hold the number of orders currently in the Trade pool
TotalNumberOfOrders = OrdersTotal(); // <-- we store the number of Orders in the variable
for(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --) // <-- for loop to loop through all Orders . . COUNT DOWN TO ZERO !
{
//Print("----------> AdjustTradeOrder Part 3");
if(! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES))
continue; // <-- if the OrderSelect fails advance the loop to the next PositionIndex
if(OrderComment() == myTradeID)
Print(myEntry + " ;" + myTakeProfit + " ;" + myTakeProfit);
if(myEntry==0 && myTakeProfit==0 && myStopLoss>0)
// MODIFT ONLY SL
{
Print("-----> ONLY SL");
if(! OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(myStopLoss,Digits),OrderTakeProfit(),0,orderColor))
Print("[ONLY SL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else
Print("[ONLY SL] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
if(myEntry>0 && myTakeProfit==0 && myStopLoss>0)
// MODIFT ENTY & SL
{
Print("-----> MODIFT ENTY & SL");
if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), NormalizeDouble(myStopLoss,Digits),OrderTakeProfit(),0,orderColor))
Print("[MODIFT ENTY & SL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else
Print("[MODIFT ENTY & SL] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
if(myEntry>0 && myTakeProfit==0 && myStopLoss==0)
// MODIFT ONLY ENTY
{
Print("-----> MODIFT ONLY ENTY");
if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), OrderStopLoss(),OrderTakeProfit(),0,orderColor))
Print("[MODIFT ONLY ENTY] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else
Print("[MODIFT ONLY ENTY] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
if(myEntry>0 && myTakeProfit>0 && myStopLoss==0)
// MODIFT ENTY & TP
{
Print("-----> MODIFT ENTY & TP");
if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), OrderStopLoss(),NormalizeDouble(myTakeProfit,Digits),0,orderColor))
Print("[MODIFT ENTY & TP] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else
Print("[MODIFT ENTY & TP] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
if(myEntry==0 && myTakeProfit>0 && myStopLoss==0)
// MODIFT ONLY TP
{
Print("-----> ONLY Modify TAKEPROFIT");
if(! OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(myTakeProfit,Digits),0,orderColor))
Print("[ONLY Modify TAKEPROFIT] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else
Print("[ONLY Modify TAKEPROFIT] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
if(myEntry>0 && myTakeProfit>0 && myStopLoss>0)
// MODIFT ALL
{
Print("-----> MODIFT ALL");
if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), NormalizeDouble(myStopLoss,Digits),NormalizeDouble(myTakeProfit,Digits),0,orderColor))
Print("[MODIFT AL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else
Print("[MODIFT AL] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
if(myEntry==0 && myTakeProfit>0 && myStopLoss>0)
// MODIFT SL & TP
{
Print("-----> MODIFT SL & TP");
if(! OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(myStopLoss,Digits),NormalizeDouble(myTakeProfit,Digits),0,orderColor))
Print("[MODIFT SL & TP] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else
Print("[MODIFT SL & TP] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
{
Print("-----> Don't Know What whent wrong.");
Print(
"myType = "+myType + ";"+
"mySymbole = "+mySymbole + ";"+
"myTradeID = "+myTradeID + ";"+
"myPosition = "+IntegerToString(myPosition) + ";"+
"myEntry = "+DoubleToStr(myEntry) + ";"+
"myStopLoss = "+DoubleToStr(myStopLoss) + ";"+
"myTakeProfit = "+DoubleToStr(myTakeProfit)
);
}
}
//+------------------------------------------------------------------+
}
else
{
//Print("TradeID Already exists = "+myTradeID);
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
Quote
Report
PaulB · External communityPost link
External answer — Stack Overflow Stack Exchange
Author: PaulB
Original post: https://stackoverflow.com/a/67753366
License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/
Adaptation: HTML converted to plain text; contact email addresses removed.
You should never use the
comment
parameter of
OrderSend()
to store any critical information. It if often overwritten or appended to by your broker and is therefore considered very unreliable.
The
magic number
parameter is specifically used for filtering trades, and this is what you should be using.
It is difficult to correct your code without having access to the full EA, but the following should help you along your way.
void AdjustTradeOrder(string myType,string mySymbole,int magicNumber,int myPosition,double myEntry,double myStopLoss,double myTakeProfit)
{
//--- get minimum stop level
double minstoplevel=MarketInfo(mySymbole,MODE_STOPLEVEL);
double price=MarketInfo(mySymbole,MODE_ASK); ;
double minilot = MarketInfo(mySymbole,MODE_MINLOT);
color orderColor;
if(myPosition==0) orderColor = clrGreen;
else orderColor = clrRed;
for(int i=OrdersTotal()-1; i>=0; i--)
{
//Print("----------> AdjustTradeOrder Part 3");
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; // <-- if the OrderSelect fails advance the loop to the next PositionIndex
if(OrderSymbol()!=Symbol()) continue; // Not the correct order symbol
if(OrderMagicNumber()!=magicNumber) continue; // Not the correct magic number
Print(DoubleToStr(myEntry, Digits) + " ;" + DoubleToStr(myTakeProfit, Digits) + " ;" + DoubleToStr(myTakeProfit, Digits));
if(myEntry==0 && myTakeProfit==0 && myStopLoss>0)
{
// MODIFT ONLY SL
Print("-----> ONLY SL");
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(myStopLoss,Digits),OrderTakeProfit(),0,orderColor)) Print("[ONLY SL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else Print("[ONLY SL] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
if(myEntry>0 && myTakeProfit==0 && myStopLoss>0)
{
// MODIFT ENTY & SL
Print("-----> MODIFT ENTY & SL");
if(!OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), NormalizeDouble(myStopLoss,Digits),OrderTakeProfit(),0,orderColor)) Print("[MODIFT ENTY & SL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else Print("[MODIFT ENTY & SL] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
if(myEntry>0 && myTakeProfit==0 && myStopLoss==0)
{
// MODIFT ONLY ENTY
Print("-----> MODIFT ONLY ENTY");
if(!OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), OrderStopLoss(),OrderTakeProfit(),0,orderColor)) Print("[MODIFT ONLY ENTY] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else Print("[MODIFT ONLY ENTY] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
if(myEntry>0 && myTakeProfit>0 && myStopLoss==0)
{
// MODIFT ENTY & TP
Print("-----> MODIFT ENTY & TP");
if(!OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), OrderStopLoss(),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[MODIFT ENTY & TP] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else Print("[MODIFT ENTY & TP] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
if(myEntry==0 && myTakeProfit>0 && myStopLoss==0)
{
// MODIFT ONLY TP
Print("-----> ONLY Modify TAKEPROFIT");
if(!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[ONLY Modify TAKEPROFIT] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else Print("[ONLY Modify TAKEPROFIT] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
if(myEntry>0 && myTakeProfit>0 && myStopLoss>0)
{
// MODIFT ALL
Print("-----> MODIFT ALL");
if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), NormalizeDouble(myStopLoss,Digits),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[MODIFT AL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else Print("[MODIFT AL] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
if(myEntry==0 && myTakeProfit>0 && myStopLoss>0)
{
// MODIFT SL & TP
Print("-----> MODIFT SL & TP");
if(! OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(myStopLoss,Digits),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[MODIFT SL & TP] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError());
else Print("[MODIFT SL & TP] - OrderSend placed successfully");
deleteFile_AdjustTrade(fileName_Adjusted);
}
else
{
Print("-----> Don't Know What whent wrong.");
Print("myType = "+myType + ";"+
"mySymbole = "+mySymbole + ";"+
"myMagicNo = "+IntegerToString(magicNumber) + ";"+
"myPosition = "+IntegerToString(myPosition) + ";"+
"myEntry = "+DoubleToStr(myEntry) + ";"+
"myStopLoss = "+DoubleToStr(myStopLoss) + ";"+
"myTakeProfit = "+DoubleToStr(myTakeProfit));
}
}
}
Quote
Report
Post Reply
Quoted from Forex.com.bd-Editorial External answer — Stack Overflow Stack Exchange Author: PaulB Source score (net votes, not local likes): 0 Original post: https://stackoverflow.com/a/67753366 License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/ Adaptation: HTML converted to plain text; contact email addresses removed. You should never use the comment parameter of OrderSend() to store any critical information. It if often overwritten or appended to by your broker and is therefore considered very unreliable. The magic number parameter is specifically used for filtering trades, and this is what you should be using. It is difficult to correct your code without having access to the full EA, but the following should help you along your way. void AdjustTradeOrder(string myType,string mySymbole,int magicNumber,int myPosition,double myEntry,double myStopLoss,double myTakeProfit) { //--- get minimum stop level double minstoplevel=MarketInfo(mySymbole,MODE_STOPLEVEL); double price=MarketInfo(mySymbole,MODE_ASK); ; double minilot = MarketInfo(mySymbole,MODE_MINLOT); color orderColor; if(myPosition==0) orderColor = clrGreen; else orderColor = clrRed; for(int i=OrdersTotal()-1; i>=0; i--) { //Print("----------> AdjustTradeOrder Part 3"); if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; // <-- if the OrderSelect fails advance the loop to the next PositionIndex if(OrderSymbol()!=Symbol()) continue; // Not the correct order symbol if(OrderMagicNumber()!=magicNumber) continue; // Not the correct magic number Print(DoubleToStr(myEntry, Digits) + " ;" + DoubleToStr(myTakeProfit, Digits) + " ;" + DoubleToStr(myTakeProfit, Digits)); if(myEntry==0 && myTakeProfit==0 && myStopLoss>0) { // MODIFT ONLY SL Print("-----> ONLY SL"); if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(myStopLoss,Digits),OrderTakeProfit(),0,orderColor)) Print("[ONLY SL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError()); else Print("[ONLY SL] - OrderSend placed successfully"); deleteFile_AdjustTrade(fileName_Adjusted); } else if(myEntry>0 && myTakeProfit==0 && myStopLoss>0) { // MODIFT ENTY & SL Print("-----> MODIFT ENTY & SL"); if(!OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), NormalizeDouble(myStopLoss,Digits),OrderTakeProfit(),0,orderColor)) Print("[MODIFT ENTY & SL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError()); else Print("[MODIFT ENTY & SL] - OrderSend placed successfully"); deleteFile_AdjustTrade(fileName_Adjusted); } else if(myEntry>0 && myTakeProfit==0 && myStopLoss==0) { // MODIFT ONLY ENTY Print("-----> MODIFT ONLY ENTY"); if(!OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), OrderStopLoss(),OrderTakeProfit(),0,orderColor)) Print("[MODIFT ONLY ENTY] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError()); else Print("[MODIFT ONLY ENTY] - OrderSend placed successfully"); deleteFile_AdjustTrade(fileName_Adjusted); } else if(myEntry>0 && myTakeProfit>0 && myStopLoss==0) { // MODIFT ENTY & TP Print("-----> MODIFT ENTY & TP"); if(!OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), OrderStopLoss(),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[MODIFT ENTY & TP] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError()); else Print("[MODIFT ENTY & TP] - OrderSend placed successfully"); deleteFile_AdjustTrade(fileName_Adjusted); } else if(myEntry==0 && myTakeProfit>0 && myStopLoss==0) { // MODIFT ONLY TP Print("-----> ONLY Modify TAKEPROFIT"); if(!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[ONLY Modify TAKEPROFIT] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError()); else Print("[ONLY Modify TAKEPROFIT] - OrderSend placed successfully"); deleteFile_AdjustTrade(fileName_Adjusted); } else if(myEntry>0 && myTakeProfit>0 && myStopLoss>0) { // MODIFT ALL Print("-----> MODIFT ALL"); if(! OrderModify(OrderTicket(), NormalizeDouble(myEntry,Digits), NormalizeDouble(myStopLoss,Digits),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[MODIFT AL] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError()); else Print("[MODIFT AL] - OrderSend placed successfully"); deleteFile_AdjustTrade(fileName_Adjusted); } if(myEntry==0 && myTakeProfit>0 && myStopLoss>0) { // MODIFT SL & TP Print("-----> MODIFT SL & TP"); if(! OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(myStopLoss,Digits),NormalizeDouble(myTakeProfit,Digits),0,orderColor)) Print("[MODIFT SL & TP] - Order OrderModify failed, order number: ", OrderTicket(), " Error: ", GetLastError()); else Print("[MODIFT SL & TP] - OrderSend placed successfully"); deleteFile_AdjustTrade(fileName_Adjusted); } else { Print("-----> Don't Know What whent wrong."); Print("myType = "+myType + ";"+ "mySymbole = "+mySymbole + ";"+ "myMagicNo = "+IntegerToString(magicNumber) + ";"+ "myPosition = "+IntegerToString(myPosition) + ";"+ "myEntry = "+DoubleToStr(myEntry) + ";"+ "myStopLoss = "+DoubleToStr(myStopLoss) + ";"+ "myTakeProfit = "+DoubleToStr(myTakeProfit)); } } }
Checking account access…