mql4 - 带有 OrderModify 的 EA,可修改所有未结订单
问题描述
编辑:这个问题是由缺少 {} 引起的。
if(OrderComment() == myTradeID)
并且该行下的大量代码应该在 {} 内
所以我正在构建一个 EA,它从计算机上的一个文件中读取,该文件包含一个字符串,其中包含关于什么类型的订单(NewOrder、AdjustOrder 或 CancelOrder)的信息。
void AdjustTradeOrder(string myType,string mySymbole,string myTradeID,int myPosition,double myEntry,double myStopLoss,double myTakeProfit)
我遇到的问题是,在 EA 下方的代码中,有时只是更改了正确的订单,但有时它会更改所有未结订单,这是一个大问题。
我正在尝试检查 myTradeID 是否与所选订单 ID 上的评论相同,然后才应该修改订单。但有时它会修改所有订单。
知道为什么吗?
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
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);
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
解决方案
您永远不应该使用comment
参数OrderSend()
来存储任何关键信息。它如果经常被您的经纪人覆盖或附加,因此被认为非常不可靠。
该magic number
参数专门用于过滤交易,这是您应该使用的。
如果无法访问完整的 EA,就很难更正您的代码,但以下内容应该对您有所帮助。
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));
}
}
}
推荐阅读
- mysql - Replace Null value to infinite
- java - 为什么 Files.deleteIfExists 需要这么长时间来处理大文件?
- javascript - 在取消对话时使选择菜单恢复
- android - viewpager 内的内容在左右滚动时左右移动
- javascript - 使用基于分组的源对象数组的属性创建对象数组
- autodesk-forge - 由于未捕获的 Promise,实时部署时的 Forge Extension 未加载
- android - 在 Android 中创建日历事件,在 iOS 中编辑
- kubernetes - 部署 2 个 GKE 集群,第一个集群专用于 Spinnaker,其他集群用于我的应用程序
- r - 按组创建新的 POSIXct 序列
- vmware-player - VMware 工作站播放器在软件升级到版本 15 时无法使用暂停按钮