「581獨(dú)家」MT4開(kāi)發(fā)技巧 利用腳本批量修改止盈止損(mt4交易怎么設(shè)置止損)
交易者在交易過(guò)程中都會(huì)給訂單設(shè)置止盈止損價(jià)格,但是如果下了很多單,每個(gè)訂單右鍵點(diǎn)修改,再一個(gè)一個(gè)的設(shè)置止盈止損就太麻煩了,那么我們就自己來(lái)做個(gè)小程序替我們批量修改吧。
我們都知道MT4有一種功能叫腳本,它不同于EA程序。腳本程序只運(yùn)行一次,執(zhí)行完就退出了。這種程序一般都是來(lái)做一些輔助的功能,比如批量平倉(cāng)等。我們就利用這個(gè)來(lái)給訂單批量修改。
首先我們的腳本程序要可以做一些簡(jiǎn)單的過(guò)濾,因?yàn)樵趫?chǎng)單比較多,有些單并不需要修改。那么我們可以根據(jù)訂單的交易品種、交易方向、注釋和Magic來(lái)過(guò)濾訂單,只有符合條件的才會(huì)進(jìn)行修改。腳本的參數(shù)部分代碼如下:
input double tp = 0;//止盈價(jià)
input double sl = 0;//止損價(jià)
input string symbol = "";//品種
input int type = -1;//0為多單1為空單-1為全部
input string comment = "";//注釋
input int magic = 0;//Magic
這里列出來(lái)所有的過(guò)濾條件,所有變量的默認(rèn)值為不做過(guò)濾。 其中下單方向參數(shù)可以做成更人性化的下拉菜單形式,詳細(xì)請(qǐng)看我們的另外一篇文章(鏈接到《MT4開(kāi)發(fā)技巧,更方便的EA參數(shù)》這篇文章,如果那篇文章沒(méi)發(fā)過(guò)就忽略此段文字)
下面是程序部分,我們分別過(guò)濾下這幾個(gè)條件,代碼如下:
for(int i=OrdersTotal()-1;i >= 0;i–)
{
if(OrderSelect(i,SELECT_BY_POS) == false)
{
continue;
}
double temp_tp = tp;
double temp_sl = sl;
//如果給的價(jià)格是0則是去除止盈止損價(jià)格,如果是負(fù)數(shù)則不修改止盈止損,如果大于0才會(huì)修改止盈止損
if(tp < 0)
temp_tp = OrderTakeProfit();
if(sl < 0)
temp_sl = OrderStopLoss();
//Magic過(guò)濾
if((magic == 0) || (magic != 0 && OrderMagicNumber() == magic))
{
//注釋過(guò)濾
if((comment == "") || (comment != "" && OrderComment() == comment))
{
//品種過(guò)濾
if((symbol == "") || (symbol != "" && OrderSymbol() == symbol))
{
if(OrderType() == OP_BUY && type != 1)//方向過(guò)濾
{
bool res = OrderModify(OrderTicket(),OrderOpenPrice(),temp_sl,temp_tp,0);
}
if(OrderType() == OP_SELL && type != 0)//方向過(guò)濾
{
bool res = OrderModify(OrderTicket(),OrderOpenPrice(),temp_sl,temp_tp,0);
}
}
}
}
}
代碼比較長(zhǎng),因?yàn)榕袛嗟倪壿嫳容^多,我們既然要開(kāi)發(fā)一個(gè)輔助功能,那么就讓這個(gè)功能越強(qiáng)大越好。因此,我們做了如下的判斷:
(1)希望我們的腳本既可以設(shè)置止盈止損價(jià)格,又可以去除止盈止損,因此判斷下輸入?yún)?shù),假如tp變量輸入的是負(fù)數(shù),那么就不做修改。如果tp變量的輸入了一個(gè)0,代表要去掉這些訂單的止盈價(jià)格。只有當(dāng)tp變量輸入的是正值時(shí)才會(huì)根據(jù)這個(gè)值來(lái)設(shè)置止盈。
(2)過(guò)濾Magic,如果設(shè)置的是0則不做限制,如果是非0則要判斷下,只有和magic參數(shù)輸入相同的訂單才會(huì)去修改。
(3)過(guò)濾注釋?zhuān)蚆agic的邏輯相同,只有輸入了注釋才會(huì)對(duì)它進(jìn)行過(guò)濾判斷。
(4)過(guò)濾品種,也是相同的邏輯,輸入了指定的品種名稱(chēng)后就會(huì)對(duì)不是該品種的訂單做出過(guò)濾。
(5)過(guò)濾做單方向,此處的判斷和上面的有所不同,以多單為例:當(dāng)判斷訂單為多單時(shí),輸入的方向參數(shù)卻是1,既只有空單才會(huì)被修改,那么所有的多單就被過(guò)濾掉了。只有判斷為多單,并且輸入的參數(shù)不為1時(shí)才可以修改該訂單。
通過(guò)上面的代碼,我們做了一個(gè)非常好用的一鍵修改訂單功能,但是別高興的太早了?,F(xiàn)在請(qǐng)運(yùn)行下這個(gè)腳本程序,發(fā)現(xiàn)并不能輸入?yún)?shù)而是直接運(yùn)行了,這是怎么回事呢?
在MT4的腳本開(kāi)發(fā)中,默認(rèn)情況下腳本的運(yùn)行不會(huì)彈出參數(shù)對(duì)話(huà)框,而是直接運(yùn)行,這是為了快捷運(yùn)行而考慮的。那么我們需要讓參數(shù)框出現(xiàn)則需要在程序里加入這樣一段代碼即可:
#property show_inputs
這句話(huà)的意思就是告訴MT4,我需要這個(gè)腳本彈出對(duì)話(huà)框?,F(xiàn)在再運(yùn)行一次腳本,發(fā)現(xiàn)已經(jīng)可以出現(xiàn)了。如下圖
在MT4開(kāi)發(fā)中,其實(shí)有很多的細(xì)節(jié)我們需要注意。小編希望通過(guò)本篇文章,能夠讓大家少走彎路,順利開(kāi)發(fā)出自己的交易系統(tǒng)。