EATC

 找回密码
 立即注册
查看: 551|回复: 2

EA编程速成教程(4)修改止损止盈

[复制链接]

192

主题

1118

帖子

1210

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1210
发表于 2022-12-7 13:18:47 | 显示全部楼层 |阅读模式
本课程的目标是给之前下的单子添加止损止盈价。
首选添加外部参数
  • input int SL=600;      //止损点数
  • input int TP=200;      //止盈点数
复制代码

给单子添加止损止盈有两个方法:
一、在下单函数里面带上相应的止损和止盈。
OrderSend函数有11个参数,其中第六个(stoploss)和第七个(takeprofit)分别是止损价和止盈价。
  • int OrderSend(
  • string symbol, // symbol
  • int cmd, // operation
  • double volume, // volume
  • double price, // price
  • int slippage, // slippage
  • double stoploss, // stop loss
  • double takeprofit, // take profit
  • string comment=NULL, // comment
  • int magic=0, // magic number
  • datetime expiration=0, // pending order expiration
  • color arrow_color=clrNONE // color
  • );
复制代码

具体使用方法如下:
  • int ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"My order",16384,0,clrGreen);
复制代码

注意:有些平台下单的时候不允许同时带上止损和止盈,否则会报错,之前的东航金融平台就是,也有的平台要求止损止盈至少要距离当前价格一定的点数,如果设置太小的话,可能造成下单失败。所以,设置止损止盈的方法我们通常使用第二种。

二、下单成功后,通过修改订单设置上止损和止盈。
    修改订单用到的函数是OrderModify,这个函数有6个参数,其中第三个和第四个分别是止损价和止盈价
  • bool OrderModify(
  • int ticket, // ticket
  • double price, // price
  • double stoploss, // stop loss
  • double takeprofit, // take profit
  • datetime expiration, // expiration
  • color arrow_color // color
  • );
复制代码
第一个参数ticket是订单编号,订单编号一般是需要通过遍历账户的所有单子来获取,修改止损止盈的全部代码如下:
  
  • for(int i=0; i<OrdersTotal(); i++)
  •      {
  •       if(OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES))
  •         {
  •          if(OrderSymbol()==Symbol() && OrderMagicNumber()==16384 && OrderType()==OP_BUY)
  •            {
  •             if(OrderStopLoss()==0)
  •               {
  •                bool res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-SL*Point,OrderOpenPrice()+TP*Point,0);
  •                if(res)
  •                   Print("订单修改成功");
  •               }
  •            }
  •         }
  •      }
复制代码
  • 整个EA的全部代码如下:
复制代码
  • //+------------------------------------------------------------------+
  • //|                                                   Test_EA_04.mq4 |
  • //|                                                             云开 |
  • //|                                             https://www.mql5.com |
  • //+------------------------------------------------------------------+
  • #property copyright "http://www.forexmt4.cn"
  • #property link      "http://www.forexmt4.cn"
  • #property description "【漆天编程】 测试EA"
  • #property description "  "
  • #property description "这是一款测试EA,作者QQ:80364276"
  • #property description "  "
  • #property description "发布时间:2020.04.16"
  • #property strict
  • #property icon "//Images//sea.ico"
  • input double lots=0.1; //交易手数
  • input int SL=600;      //止损点数
  • input int TP=200;      //止盈点数
  • bool isgo=true;
  • //+------------------------------------------------------------------+
  • //| Expert initialization function                                   |
  • //+------------------------------------------------------------------+
  • int OnInit()
  •   {
  • //---
  • //---
  •    return(INIT_SUCCEEDED);
  •   }
  • //+------------------------------------------------------------------+
  • //| Expert deinitialization function                                 |
  • //+------------------------------------------------------------------+
  • void OnDeinit(const int reason)
  •   {
  • //---
  •   }
  • //+------------------------------------------------------------------+
  • //| Expert tick function                                             |
  • //+------------------------------------------------------------------+
  • void OnTick()
  •   {
  •    for(int i=0; i<OrdersTotal(); i++)
  •      {
  •       if(OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES))
  •         {
  •          if(OrderSymbol()==Symbol() && OrderMagicNumber()==16384 && OrderType()==OP_BUY)
  •            {
  •             if(OrderStopLoss()==0)
  •               {
  •                bool res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-SL*Point,OrderOpenPrice()+TP*Point,0);
  •                if(res)
  •                   Print("订单修改成功");
  •               }
  •            }
  •         }
  •      }
  • //---
  •    if(isgo)
  •      {
  •       int ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,3,0,0,"My order",16384,0,clrGreen);
  •       if(ticket<0)
  •         {
  •          Print("OrderSend failed with error #",GetLastError());
  •         }
  •       else
  •         {
  •          isgo=false;
  •          Print("OrderSend placed successfully");
  •         }
  •      }
  •   }
  • //+------------------------------------------------------------------+

复制代码

回复

使用道具 举报

2405

主题

4181

帖子

1万

积分

交易元老

Rank: 8Rank: 8

积分
17411
发表于 2023-12-12 10:52:38 | 显示全部楼层
分享值得点赞!
回复

使用道具 举报

2290

主题

3822

帖子

2万

积分

交易元老

Rank: 8Rank: 8

积分
26881
发表于 2024-4-6 08:54:04 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

收藏本站|法律声明|Archiver|小黑屋|support@ea198.com|EATC ( 桂ICP备2022005787号 )

风险提示与免责声明:擅自从事外汇保证金交易的双方不受法律保护!社区内展示内容,均为网友自发分享,不构成投资建议,社区无法全面监控由第三方上传至社区的资源,因此不保证资源的合法性、安全性、完整性、真实性或品质等。您下载时,同意自行判断并承担所有风险。社区内的资源,仅限用于学习和研究目的,不得将用于商业或者非法用途,否则,一切后果请用户自负。社区信息来自网络,版权争议与社区无关,您下载后须在24个小时之内进行删除。如果您喜欢该内容,请支持正版。如有侵权请邮件与我们联系处理。