MQL4 交易收盘错误

Wrongs in close of trades in MQL4

提问人:Hilal Frikol 提问时间:10/8/2023 最后编辑:halferHilal Frikol 更新时间:10/12/2023 访问量:37

问:

我创建了此代码,以便在条件为真时打开交易,如果条件为真,则关闭它们 但他只开放交易,不关闭它们。

这是我的代码



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);

}

}

}

}

//}

}

我编写了此代码,以便在满足条件时进行交易。如果满足买入条件,则开启买入交易,如果满足卖出条件,则开启卖出交易。此外,当满足特定条件时,还有关闭交易的条件。还有一个条件是,当总利润达到一定金额时,可以关闭交易。但是,我的问题是,此代码仅打开交易,并且在满足条件时不会关闭交易。

datetime 条件运算符 MQL4 MetaTrader4 fclose

评论

0赞 halfer 10/8/2023
@PaulB - 编辑问题时,请不要更改代码。您可能会引入您不打算的破损或修复,这将使问题无效。

答:

0赞 Mark SdS 10/9/2023 #1

在您的交易中,您正在迭代未平仓交易并关闭它们,这与买入相关。CloseAllOrdersIfProfitReachedMarketInfo(OrderSymbol(), MODE_BID)

最好在方向中立的地方关闭它们。OrderClosePrice()

评论

0赞 PaulB 10/12/2023
如果这是在 MQL5 中编程的,您的评论可能是正确的,但是该问题专门与 MQL4 有关,因此必须或必须用于根据订单类型确定正确的收盘价。AskBid
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;
}