admin 发表于 2022-12-7 13:18:47

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

本课程的目标是给之前下的单子添加止损止盈价。首选添加外部参数
[*]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");
[*]      }
[*]   }
[*]
[*]}
[*]//+------------------------------------------------------------------+
[*]
复制代码

anna 发表于 2023-12-12 10:52:38

分享值得点赞!

yitang 发表于 2024-4-6 08:54:04

谢谢楼主分享
页: [1]
查看完整版本: EA编程速成教程(4)修改止损止盈