在 MT4 上一键快速设定止盈和止损价位的脚本程序

楼主  收藏   举报   帖子创建时间:  2019-05-05 10:11 回复:0 关注量:791
前阵子一位年轻朋友提到在操作时下单后常忘记设止盈和止损价位 (就算大些也是保护住了), 当时就简单的写了个一键快速设定止盈和止损价位的脚本程序给他, 只要把脚本拉到那个商品的图表, 就能自动对未设定止盈和止损的单子作完设定, 以开仓价作基准, 非常方便且快速.

脚本的程序代码贴在下面, 请自行编译, 脚本程序需放在 MT4 文件夹的 MQL4scripts 文件夹内,  解说如下:

1. TargetProfit, StopLoss 和 FixedTargetProfit 三个参数是可以输入的, TargetProfit 是从开仓价起算的止盈价, StopLoss 是从开仓价算的止损价, FixedTargetProfit 是固定止盈价位.

如在 EURUSD 多单开仓于 1.3600, 止盈 100 点, 止损 100 点, 这样止盈价就变成 1.3700, 止损价为 1.3500, 但如果在 FixedTargetProfit 设 1.3800, 止盈点数的参数就不作用, 会直接使用 FixedTargetProfit 的 1.3800 作为止盈价位.

脚本要能作参数输入功能需要在程序里多个宣告:

#property show_inputs

2. TargetProfit 和 StopLoss 的点位是根据外汇小数点两位和四位来作单位的, 如果交易商是用三位(如 USDJPY) 和五位 (EURUSD), 在这行代码会自动把设定点数放大十倍:  对编程经验刚入门的朋友, TargetProfit*=10 这个意思是 TargetProfit = TargetProfit * 10; 自身乘以十的简单写法.

if (Digits==3 || Digits==5) { TargetProfit*=10; StopLoss*=10; }

3. 脚本的设计只对脚本拉过去的图表的商品的单子作设定动作, 如拉到 EURUSD 的图表, 只对 EURUSD 的单子作处理.  如果想直接对不同商品的单子统一一次性作处理, 可以将下面有两行带有 OrderSymbol() == Symbol() && 对图表商品名称判断的这部分移除即可.

4. 脚本因为是前阵子才写的, 用到 MT4 build 600 后的新函数名 void onStart(), 如果你的 MT4 是还是旧版的, 可以改为 void start()

5. MT4 脚本最大的用途就是在处理一次性的批量执行, 最常用在下单或统计方面, 有兴趣的朋友可以自行研究更多的功能或在 MQL4 官方论坛上观摩代码库里的一些脚本程序: http://www.mql5.com/zh/code/mt4/scripts?orderby=downloads

6. 脚本要能对订单作处理, MT4 设定里的 "启用EA交易系统" 需要开启, 这是许多朋友在使用脚本作批量订单处理时会忘记的:

001T3cxnzy6JAmwqxV345&690.jpg

如果没有开启, 在修改订单时遇到 error code = 4109 也会弹出提示窗口:

001T3cxnzy6JAmACWO8dc&690.jpg

***** SetTargetProfitStopLoss.mq4 脚本代码 ****


#property show_inputs
input int TargetProfit = 100;
input int StopLoss = 100;
input double FixedTargetProfit = 0.0;
int iTp=TargetProfit, iSl=StopLoss;
void onStart()
  {
//---

   bool bOrderModify;
   double dTargetProfit;

   if (Digits==3 || Digits==5) { iTp*=10; iSl*=10; }

   for (int i=OrdersTotal(); i>=0; i--)
   {

      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

      if ( OrderSymbol() == Symbol() && OrderType() == OP_BUY )
      {  
         if (FixedTargetProfit!=0.0) dTargetProfit = FixedTargetProfit;
         else dTargetProfit = OrderOpenPrice() + Point * iTp;

         bOrderModify = OrderModify(OrderTicket(),
                                    OrderOpenPrice(),
                                    NormalizeDouble(OrderOpenPrice() - Point * iSl, Digits),
                                    NormalizeDouble(dTargetProfit,Digits),
                                    0);
         if (GetLastError()==4109)
          {
            MessageBox("请在"工具"->"选项"->"EA交易"里勾选"启用EA交易系统"","设置止盈止损",0);
            return;
          }                          
      }

      if ( OrderSymbol() == Symbol() && OrderType() == OP_SELL )
      {
         if (FixedTargetProfit!=0.0) dTargetProfit = FixedTargetProfit;
         else dTargetProfit = OrderOpenPrice() - Point * iTp;

         bOrderModify = OrderModify(OrderTicket(),
                                    OrderOpenPrice(),
                                    NormalizeDouble(OrderOpenPrice() + Point * iSl, Digits),
                                    NormalizeDouble(dTargetProfit, Digits),
                                    0);
                                    if(!bOrderModify)
        if (GetLastError()==4109)
          {
            MessageBox("请在"工具"->"选项"->"EA交易"里勾选"启用EA交易系统"","设置止盈止损",0);
            return;
          }
      }


    }

}     

**** 顺便分享一键全部平仓的脚本代码, 只针对脚本拉过去的图表商品作平仓动作, 也就是会检查订单的商品名称是否与图表商品名称相同才作平仓动作

CloseAllOrders.mq4


void onStart()
  {
//---
   bool bOrderClose;

   for (int i=OrdersTotal(); i>=0; i--)
   {

      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

      if ( OrderSymbol() == Symbol() && OrderType() == OP_BUY )
          bOrderClose = OrderClose(OrderTicket(),OrderLots(), Bid, 500);

      if ( OrderSymbol() == Symbol() && OrderType() == OP_SELL )
          bOrderClose = OrderClose(OrderTicket(),OrderLots(), Ask, 500);   

      RefreshRates();   
   }
}

打赏