天天看點

【漆學軍】如何編寫健壯的一鍵平倉腳本

在MT4的各種快捷工具中,一鍵平倉腳本是非常有用的一個小腳本程式。

在面對賬戶有幾十個甚至幾百個單子的時候,一個一個去手動平倉将會是非常痛苦麻煩的事情,使用MT4自帶的MQL4語言,編寫一個小程式,隻需要幾十行代碼,就可以輕松解決平倉難的問題。

但是在實際應用中,有些程式員編寫的程式,總是無法一次性将所有單子平倉,需要運作好幾次一鍵平倉腳本,才能真正實作全部平倉,怎麼解決這個問題呢?繼續往下看:

1.首先建立腳本

【漆學軍】如何編寫健壯的一鍵平倉腳本

2.給腳本起個名字"一鍵平倉”

【漆學軍】如何編寫健壯的一鍵平倉腳本

3.點“完成”,得到預設的程式代碼

【漆學軍】如何編寫健壯的一鍵平倉腳本

4.在第16行加入如下代碼

while(total())
     {
      for(int i=0; i<OrdersTotal(); i++)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               RefreshRates();
               bool res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
               if(res)
                 {
                  Print("平倉成功。#"+IntegerToString(OrderTicket()));
                 }
               else
                 {
                  Print("平倉失敗。#"+IntegerToString(OrderTicket())+",出錯:"+IntegerToString(GetLastError()));
                 }
              }
           }
        }
     }
           

注意,核心代碼就在此處,使用while循環語句,當單子沒有平倉時,就不斷去平倉,直到平完為止。

5.以上代碼中用到了一個自定義函數,這個函數的功能是計算還有幾個持倉單子需要平倉,在程式最後面加上:

int total()
  {
   int result=0,cmd=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         cmd=OrderType();
         if(cmd<=1)
            result++;
        }
     }
   return result;
  }
           

6.将腳本從導航裡面拖動到任意K線圖表上,可看到賬戶所有單子依次被全部平倉。

【漆學軍】如何編寫健壯的一鍵平倉腳本

此代碼在2021年6月7日下午測試通過。

下面附上全部源碼,一共54行,供大家下載下傳下去研究使用。

//+------------------------------------------------------------------+
//|                                                     一鍵平倉.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                          http://www.study-ea.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "http://www.study-ea.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   while(total())
     {
      for(int i=0; i<OrdersTotal(); i++)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               RefreshRates();
               bool res=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
               if(res)
                 {
                  Print("平倉成功。#"+IntegerToString(OrderTicket()));
                 }
               else
                 {
                  Print("平倉失敗。#"+IntegerToString(OrderTicket())+",出錯:"+IntegerToString(GetLastError()));
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
int total()
  {
   int result=0,cmd=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         cmd=OrderType();
         if(cmd<=1)
            result++;
        }
     }
   return result;
  }
//+------------------------------------------------------------------+
           

舉一反三:

一、以上程式隻是将賬戶上面所有的多單和空單全部平倉了,沒有區分交易品種,使用者可以在此代碼基礎上,增加區分交易品種,還可以限制隻平倉多單,隻平倉空單,隻平盈利單,隻平虧損單,等等細分功能。這樣就可以衍生出很多個腳本了。

二、随着MT4的更新,圖表按鈕的出現,腳本的單一功能,可以使用按鈕來實作了,真正實作一鍵平倉。如下圖所示,下次分享。

【漆學軍】如何編寫健壯的一鍵平倉腳本

使用按鈕做的功能面闆還有一個好處就是可以在曆史複盤測試的時候,可以在曆史資料裡面手動下單,進而就成了一個複盤示範工具,用來周末練習交易,對訓練盤感很有幫助。