提问人:Hilal Frikol 提问时间:10/8/2023 最后编辑:halferHilal Frikol 更新时间:10/12/2023 访问量:37
MQL4 交易收盘错误
Wrongs in close of trades in MQL4
问:
我创建了此代码,以便在条件为真时打开交易,如果条件为真,则关闭它们 但他只开放交易,不关闭它们。
这是我的代码
extern double lotSize = 0.02;
extern double stopLoss = 50;
extern double takeProfit = 100;
extern double targetProfit = 1;
datetime tradeOpenTime = 0;
int slippage = 3;
// دالة لفتح صفقة شراء
void OnTick() {
//void OpenBuyOrder() {
if (true) {
if (TimeCurrent() > tradeOpenTime + PeriodSeconds()) {
if (TimeMinute(TimeCurrent()) == 0) {
if ((Close[1] < Open[1]) && (Close[2] < Open[2]) && (Close[2] < Open[2])) {
OrderSend(Symbol(), OP_BUY, lotSize, MarketInfo(Symbol(), MODE_ASK), slippage, 0, 0, "", 0, clrNONE);
tradeOpenTime = TimeCurrent();
}
}
}
}
//}
// دالة لشروط فتح صفقة بيع
//void OpenSellOrder() {
if (true) {
if (TimeCurrent() > tradeOpenTime + PeriodSeconds()) {
if (TimeMinute(TimeCurrent()) == 0) {
if ((Close[1] > Open[1]) && (Close[2] > Open[2]) && (Close[2] > Open[2])) {
OrderSend(Symbol(), OP_SELL, lotSize, MarketInfo(Symbol(), MODE_BID), slippage, 0, 0, "", 0, clrNONE);
tradeOpenTime = TimeCurrent();
}
}
}
}
//}
// دالة لإغلاق صفقات شراء وبيع بشروط معينة
//void CloseOrdersBasedOnConditions() {
if (OrdersTotal() == 1) {
//if (true) {
if (TimeCurrent() > tradeOpenTime + PeriodSeconds()) {
if (TimeMinute(TimeCurrent()) == 0) {
if ((Close[1] > Open[1]) && (OrderType() == OP_BUY)) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 2, clrNONE);
} else if ((Close[1] < Open[1]) && (OrderType() == OP_SELL)) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 2, clrNONE);
}
}
}
}
//}
// دالة لإغلاق جميع الصفقات إذا كان الربح الإجمالي يساوي القيمة المحددة
//void CloseAllOrdersIfProfitReached() {
else if (OrdersTotal() > 1) {
//if (true) {
double totalProfit = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
totalProfit += OrderProfit();
}
}
if (totalProfit >= targetProfit) {
for (int x = OrdersTotal() - 1; x >= 0; x--) {
if (OrderSelect(x, SELECT_BY_POS, MODE_TRADES)) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 2, clrNONE);
}
}
}
}
//}
}
我编写了此代码,以便在满足条件时进行交易。如果满足买入条件,则开启买入交易,如果满足卖出条件,则开启卖出交易。此外,当满足特定条件时,还有关闭交易的条件。还有一个条件是,当总利润达到一定金额时,可以关闭交易。但是,我的问题是,此代码仅打开交易,并且在满足条件时不会关闭交易。
答:
0赞
Mark SdS
10/9/2023
#1
在您的交易中,您正在迭代未平仓交易并关闭它们,这与买入相关。CloseAllOrdersIfProfitReached
MarketInfo(OrderSymbol(), MODE_BID)
最好在方向中立的地方关闭它们。OrderClosePrice()
评论
0赞
PaulB
10/12/2023
如果这是在 MQL5 中编程的,您的评论可能是正确的,但是该问题专门与 MQL4 有关,因此必须或必须用于根据订单类型确定正确的收盘价。Ask
Bid
0赞
Mark SdS
10/14/2023
你是对的,我没有意识到这个选项不适用于 MQL4。您在代码中的建议似乎是我们双方都注意到的问题的有效解决方案。
0赞
PaulB
10/12/2023
#2
代码和方法中似乎存在多个错误。我建议进行以下修改:
extern double lotSize = 0.02;
extern double stopLoss = 50;
extern double takeProfit = 100;
extern double targetProfit = 1;
datetime timebar, tradeOpenTime=0;
int slippage = 30;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//CloseAllOrdersIfProfitReached
if(OrdersTotal()>1)
{
double totalProfit = 0;
for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) totalProfit+=OrderProfit();
if(totalProfit>=targetProfit)
{
for(int x=OrdersTotal()-1; x>=0; x--)
{
if(OrderSelect(x, SELECT_BY_POS, MODE_TRADES))
{
if(OrderType()==OP_BUY) bool res=OrderClose(OrderTicket(), OrderLots(), Bid, slippage, clrNONE);
else bool res=OrderClose(OrderTicket(), OrderLots(), Ask, 50, clrNONE);
}
}
}
}
if(timebar==Time[0]) return;
//CloseOrdersBasedOnConditions
for(int x=OrdersTotal()-1; x>=0; x--)
{
if(OrderSelect(x, SELECT_BY_POS, MODE_TRADES))
{
if(Close[1]>Open[1] && OrderType()==OP_BUY) bool res=OrderClose(OrderTicket(), OrderLots(), Bid, 2, clrNONE);
else if(Close[1]<Open[1] && OrderType()==OP_SELL) bool res=OrderClose(OrderTicket(), OrderLots(), Ask, 2, clrNONE);
}
}
//OpenBuyOrder
if(Close[1]<Open[1] && Close[2]<Open[2])
{
bool res=OrderSend(Symbol(), OP_BUY, lotSize, Ask, slippage, 0, 0, "", 0, clrNONE);
tradeOpenTime = TimeCurrent();
}
//OpenSellOrder
if(Close[1]>Open[1] && Close[2]>Open[2])
{
bool res=OrderSend(Symbol(), OP_SELL, lotSize, Bid, slippage, 0, 0, "", 0, clrNONE);
tradeOpenTime = TimeCurrent();
}
timebar=Time[0];
return;
}
评论