第六节 交易函数平仓及修改止损止盈

俗话说进场是徒弟,出场是师傅,一款程序想要盈利,那就得学会如何出场,要出场那我们还是有必要学一学离场的函数。首先和大家说一下,离场一般就分为两类,一种是主动离场,一种是被动离场。所谓主动离场,便是当价格达到某一个条件后主动平仓,被动离场便是打掉止损止盈或者被强行平仓。

如果做趋势交易,我的建议是不要设置止盈,让市场来决定我们可以盈利多少,主动平仓和移动止损最好都做,这个时候主动平仓也称之为柔性止损,而止损称为刚性止损。

下面我们为这两类止损打一个基础。

1平仓

平仓我们可以用OrderClose()函数来做,其实也没有多么复杂,最关键的还是要从一大堆单子中筛选出我们想要平掉的那个单子。那么我们先从OrderClose()函数说起,打开帮助文件可以看到这个函数有5个参数:

第一个参数需要平仓的订单的号码,每个订单都有一个识别码,后面会讲到;

第二个参数是订单的手数;

第三个参数是订单的平仓价格;

第四个参数是平仓的滑点控制;

第五个参数是平仓显示的箭头的颜色。

以上参数和之前的开单有点类似,所以不细讲。

下面我们要在GBPUSD、USDJPY以及EURUSD这三个品种各开一个单子,然后从这些单子里面筛选出EURUSD的单子并把它平掉。

在MQL4中,有一个函数能够返回单子的总数量,这个函数是OrdersTotal()函数,还有一个函数可以用于选择订单,这个函数就是OrderSelect()函数。参考一下帮助文件我们发现OrderSelect()函数有三个参数:

第一个参数是订单的标志,这个根据第二参数不同而有变化;

第二个参数是选择订单的模式,SELECT_BY_POS是根据订单的位置编号来选择订单,MT4把订单从上往下依次从零开始编号,如下图,这个模式就是依据这个编号来选择订单,采用这种模式时,第一个参数应该输入订单的位置编号。第二种模式是SELECT_BY_TICKET,这个模式是根据订单号码来选择订单,就如下图的215325180号订单,这个号码就是第一个参数应该输入的数字。

第三个参数是订单的性质,MODE_TRADES是现有的订单,MODE_HISTORY是历史订单,有时我们会根据历史订单来安排仓位,比如说上一单盈利了下一单就不做,这时我们就要参考上一个订单了,这也是MODE_HISTORY的作用。默认的情况下第三个参数是MODE_TRADE,所以如果不涉及历史订单,这个参数我们可以不用填。

另外还有几个函数如OrderTicket(),返回的是订单的订单号,OrderLots()返回的是订单的手数,OrderType()返回的是订单的类型(OP_BUY、OP_SELL、OP_BUYSTOP等等),OrderTakeProfit()返回的是订单的止盈价位,OrderStopLoss()返回的是订单的止损价位,OrderMagicNumber()返回的是订单的魔术号,还有一些Order系列的函数就不说了,大家可以通过帮助文件查看,以上的函数都是需要先选中了一个订单才能使用的,也就是说必须先用OrderSelect()函数,以上几个函数才有用。

有了这几个函数,我们就能通过循环来选择需要平掉的订单了,代码如下:

void OnStart(){int i;string sym= "EURUSD";int huadian=10;int check;for(i=OrdersTotal()-1;i>=0;i--){if(OrderSelect(i,SELECT_BY_POS)){if(OrderSymbol()==sym && OrderType()==OP_SELL){
check=OrderClose(OrderTicket(),OrderLots(),MarketInfo(sym,
MODE_ASK),huadian);}else if(OrderSymbol()==sym && OrderType()==OP_BUY){
check=OrderClose(OrderTicket(),OrderLots(),MarketInfo(sym,
MODE_BID),huadian);}}}}

以上代码将订单的数量赋给了i,之所以要减1是因为MT4的订单是根据位置从上到下来编号的,而第一个订单的编号是0,那么最后一个订单的编号就是订单总数减1了,注意,挂单也算在订单总数里面,所以我们在循环时一定要注意把挂单区别开,否则会把挂单给删掉。然后我们选择位置为i的订单,如果选中了,那么就继续判断,没有选中那就跳过。选中的情况下,如果这个订单的品种是”EURUSD”而且是卖单,那么我们就以买入价平仓,如果这个订单品种是”EURUSD”而且是买单,那么我们就以卖出价平仓。

我们运行一下这个脚本,结果如下:

可以看出我们把两个欧美的订单平掉了。

理解了这一段代码其实可以注意到,我们平仓时是从最后一个订单向前寻找的,那是因为如果需要平掉两个以上的单子,从前向后寻找订单有可能会出问题。现在我们来编写一个从前向后找订单平仓的脚本,代码如下:

void OnStart(){int i;string sym= "EURUSD";int huadian=10;int check;for(i=0;i=<OrdersTotal()-1;i++){if(OrderSelect(i,SELECT_BY_POS)){if(OrderSymbol()==sym && OrderType()==OP_SELL){
check=OrderClose(OrderTicket(),OrderLots(),MarketInfo(sym,
MODE_ASK),huadian);}else if(OrderSymbol()==sym && OrderType()==OP_BUY){
check=OrderClose(OrderTicket(),OrderLots(),MarketInfo(sym,
MODE_BID),huadian);}}}}

我们再试一下程序的效果。如下图所示,现在有三个订单,两个欧美的单子和一个镑美的单子,按MT4的编号那么两张欧美的单子编号分别是0和1,镑美编号是2,现在从上往下循环平掉欧美的订单。当i=0时,程序选中了一个单子,确实是欧美的单子,平掉了,结果很好,然后再往下走,i变成了1,接下来我们要选中的是编号为1的单子看看是不是欧美的单子。就在这个时候我们发现,由于之前我们选中的0号单子被平掉了,原来的1号单子变成了现在的0号单子,而原来的2号单子变成了现在的1号单子,于是我们选择的1号单子就成了镑美的单子,于是一个循环下来,我们发现我们只平掉了一个欧美的单子,另外一个单子没有平掉。

那如果我非想用从上到下寻找订单的方法可不可以?当然可以,你只要在循环的最后加一句i—就行了,原来由于平仓造成的位置错位就被纠正回来了,代码如下:

void OnStart(){int i;string sym= "EURUSD";int huadian=10;int check;for(i=0;i=<OrdersTotal()-1;i++){if(OrderSelect(i,SELECT_BY_POS)){if(OrderSymbol()==sym && OrderType()==OP_SELL){
check=OrderClose(OrderTicket(),OrderLots(),MarketInfo(sym,
MODE_ASK),huadian);}else if(OrderSymbol()==sym && OrderType()==OP_BUY){
check=OrderClose(OrderTicket(),OrderLots(),MarketInfo(sym,
MODE_BID),huadian);}}i--;}}

以上说了这么多是为了让大家少走弯路,笔者在刚开始学的时候用的就是从上往下寻找订单平仓的方法,过了很久才意识到这个方法是有问题的。

当然有人会问,如果是不同的EA下的单子,怎么筛选出特定EA的单子并平仓?之前已经说过了,EA的单子是可以根据魔术号来识别的,只要在判定条件里加入OrderMagicNumber()的判断就可以实现区分不同EA的订单了。

2修改订单

有了以上选择订单的基础,我们就可以开始后面的修改订单的操作了。修改订单还是比较简单的,只不过把上面的OrderClose()函数换成OrderModify()函数。函数不用记,看字面意思就知道了,Modify是修改的意思,OrderModify就是修改订单的意思了。

同样打开帮助文件查找OrderModify函数,可以看到这个函数需要输入6个参数,下面一一讲解:

第一个参数是订单的号码,就是之前的Ticket;

第二个参数是修改后单子的价位,修改挂单的时候用得上;

第三个参数是修改后单子的止损位置;

第四个参数是修改后单子的止盈位置;

第五个参数是修改后单子的持续时间,一般不用,设置为0即可;

第六个参数是修改后显示的箭头颜色。

下面我们在EURUSD上开一个多单,然后把它的止损修改到市价以下10个点,再把止盈修改到市价以上10个点,代码如下:

void OnStart(){
int i;
string sym= "EURUSD";
double sl=MarketInfo(sym,MODE_BID)-10*
( MarketInfo(sym,MODE_POINT)*10);
double tp=MarketInfo(sym,MODE_BID)+10*
( MarketInfo(sym,MODE_POINT)*10);
int check;for(i=OrdersTotal()-1;i>=0;i--){if(OrderSelect(i,SELECT_BY_POS)){if(OrderSymbol()==sym && OrderType()==OP_BUY){
check= OrderModify (OrderTicket(),OrderOpenPrice(),
sl,tp, 0, clrAliceBlue);}}}}

以上代码中将止损的价格赋给了sl,将止盈的价格赋给了tp,然后挑选订单,选出欧美的的买单,然后将止损止盈的价格写入单子中。

这是修改已经开仓的订单,如果我们要修改挂单,只需要把OrderModify函数的第二个参数改成需要的挂单价格即可,在这里不作介绍,权且当做大家的课后作业。

下节课我们会介绍一下移动止损和保平止损,之后我们会开始编写一个简单的双均线策略并对其测试,希望之前的基本功大家好好掌握。

更多内容请关注公众号【火象】~

MQL4课程-交易函数平仓及修改止损止盈相关推荐

  1. 【漆学军】EA编程速成教程(4)修改止损止盈

    本课程的目标是给之前下的单子添加止损止盈价. 首选添加外部参数 input int SL=600; //止损点数 input int TP=200; //止盈点数 给单子添加止损止盈有两个方法: 一. ...

  2. MQL4课程-交易函数下单及挂单

    第五节 交易函数下单及挂单 交易函数也算是MT4平台的独特函数了,也是最关键的一类,我们写程序最终还是要落到交易上的,那么下单和挂单的函数就必不可少. 1下单 打开帮助文件,我们可以看到交易函数还是有 ...

  3. 快期v2服务器条件单能修改吗,快期V2如何设置止损止盈单

    做过交易的朋友都知道止损止盈是非常重要的,尤其是在行情波动剧烈的时候,设置止损止盈单是保护自己盈利的非常重要的手段之一.那在快期V2上面如何设置止损止盈单呢?下面就是小编给大家整理的相关内容~ 一.登 ...

  4. ctp python接口实现 固定金额 止损 止盈

    手工交易策略实现固定金额 止损止盈  代码很简单 from CTP import * class 止损止盈Strategy(Strategy):def __init__(self):super()._ ...

  5. pads中如何设置等长_期货如何设置止损止盈避免交易中被套-期货学习

    导读:在期货交易中,有一个非常重要的问题,止损止盈,对于一般投资者来讲,止盈比止损要简单一些,毕竟止盈是在获取利润后的操作:可止损呢!止损可不是那... 在期货交易中,有一个非常重要的问题,止损止盈, ...

  6. 期货开户交易止损止盈的详解

    一.条件单,止损止盈 不一定成交.止损单是价格到了你指定的那个价位,软件自动帮你挂单平仓.正常行情,价格到了你指定的止损价,软件会帮你正常平仓,平仓价就是你设置的止损价.但是,如果是极端行情,例如价格 ...

  7. 量化交易,关于止损止盈的一点思考

    如何设置止损止盈指标才能达到 "使损失基本稳定,让盈利充分攀升" , 止损位设置 如果当天可以卖出,止损位就是成本*(1-X),如x设为5%,就是股价跌5%就止损,一般就是5%略多 ...

  8. python股票自动 选股 与 止损 止盈 脚本

    文章目录 论止损的重要性: 一.使用示例 论止损的重要性: 亏10%涨11%回本: 亏20%涨25%回本: 亏30%涨42.86%回本: 亏40%涨66.67%回本: 亏50%涨100%回本: 亏60 ...

  9. python股票自动选股+止损止盈

    股票自动化交易 代码如下: import time from 手机版选股 import * ths_user = Wencai() ths_user.login(Config["userid ...

最新文章

  1. 怎样的架构设计能力,才能成功拿下阿里P7?
  2. 最短路计数(spfa)
  3. 文献记录(part59)--多任务学习
  4. Chrome浏览器常见问题及解决方案集锦
  5. 计算机知识探索怎么写,计算机基础知识及探索.doc
  6. Objective-C基础
  7. tesseract-orc 合并识别结果
  8. 折线图笔记 -python
  9. unity矩阵运算,数学计算
  10. [转载]使用 Abbot 框架自动化测试 Eclipse 插件的用户界面,第 2 部分
  11. 2018成都大数据公司名单总汇!
  12. 机器人周志_关于机器人的日记
  13. Android Tv wifi网络登录认证
  14. 医院pacs系统服务器配置,浪潮为千佛山医院PACS系统开“药方”
  15. 国内比较好的软件接单平台有哪些?
  16. 2022中国开发者影响力年度榜单揭晓,华为、阿里、腾讯等入选年度开源贡献企业 | 美通社头条...
  17. VOD (Video On Demand),视频点播技术
  18. 如何从Linux下载一个文件到本地
  19. 基于Spring Boot的教学论坛系统中回复功能的实现
  20. Java测试服务器的上传速度和下载速度

热门文章

  1. Python之Turtle库绘制简单图形
  2. 本地计算机出现多个网络连接,电脑网络连接出现感叹号?教你一招解决
  3. IDEA连接web网页
  4. 电脑技巧:推荐几款装机必备的软件
  5. matlab三角形外接圆
  6. Touch ID回归,为用户对苹果最期待功能
  7. LaTex 文章正文footnote和表格的footnote合并计数
  8. 1 1 2 3 5 8 java_java for循环完成输出(1,1,2,3,5,8,13,21,34...)求出第10个数是多少?...
  9. Spring Social实现QQ社交登录、注册
  10. 【微商】我和99%的人观点不同