關於寫mql4程序寫單子管理的問題

 

我最近在寫EA,關於單子管理的部分,在編寫上遇到了困難,例如我開了張設了止損300點,獲利是0的單子,想在單子獲利300點後,EA能把止損修改成止損設為0,獲利0,可是在應用OrderModify方面,語法對了EA却沒有照我所寫的運行

在已有的單子獲利300點後把止損設為0這個想法,在編寫上可行不可行?

以下是程式碼

void orderselection2()
  {
   int rtt;

   for(int i=0;i<OrdersTotal()+1;i++)
     {int orderselectionsss;

      orderselectionsss=OrderSelect(i,SELECT_BY_POS);
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MYSTO && OrderType()==OP_BUY&&OrderTakeProfit()==OrderOpenPrice()+300*Point)
        {
            rtt=OrderModify(OrderTicket(),OrderLots(),0,OrderStopLoss()-OrderStopLoss(),0,Green);

            }
         orderselectionsss=OrderSelect(i,SELECT_BY_POS);
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MYSTO && OrderType()==OP_SELL
         &&OrderTakeProfit()==OrderOpenPrice()-300*Point)
              {
               rtt=OrderModify(OrderTicket(),OrderLots(),0,OrderStopLoss()-OrderStopLoss(),0,Green);

              }
          
        }
     }

 

// 在已有的單子獲利300點後把止損設為0這個想法,在編寫上可行不可行?

 不是止损设置为0,是止损设置为单子开仓价格。


 
input int Magic=0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   TrailStop(300);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TrailStop(double stopLevel)
  {
   bool res=false;
   double newSL=0.0;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()<=1)
           {
            if(OrderType()==OP_BUY && OrderStopLoss()<OrderOpenPrice() && Bid>OrderOpenPrice()+stopLevel*Point)
              {
               ResetLastError();
               newSL=OrderOpenPrice();
               res=OrderModify(OrderTicket(),OrderOpenPrice(),newSL,OrderTakeProfit(),0,clrBlue);
               if(!res)Print("Modify Order Error#",GetLastError());
              }
            else if(OrderType()==OP_SELL && (OrderStopLoss()>OrderOpenPrice() || OrderStopLoss()==0.0) && Ask<OrderOpenPrice()-stopLevel*Point)
              {
               ResetLastError();
               newSL=OrderOpenPrice();
               res=OrderModify(OrderTicket(),OrderOpenPrice(),newSL,OrderTakeProfit(),0,clrRed);
               if(!res)Print("Modify Order Error#",GetLastError());
              }
           }
        }

     }
  }
//+------------------------------------------------------------------+
 
Ziheng Zhuang:
做歷史回測的時候OederModify()是不是不啟動的?為什麼OrderModify()寫了下去不啟動的?
 
don98814462:
做歷史回測的時候OederModify()是不是不啟動的?為什麼OrderModify()寫了下去不啟動的?

历史回测是都可以的。

结果取决于你的参数,参数太小了,要设置的SL过于靠近市价则会导致修改SL失败。