自动止盈止损EA

23 篇文章 3 订阅

EA实现功能:

1、自动止盈止损

2、挂单有效期自动设定

//+------------------------------------------------------------------+
//|                                                       自动设置止损.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//--- input parameters
input int      Input1=30;
 
extern int Kperiod=5;
extern int Dperiod=3;
extern int Slowing=3;
input int yksd=300;//盈亏深度,300美元
extern int gyxq_v=60*60*36;//有效期36小时
 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  
 if (Symbol()=="XAGUSD")
  {
  //double v_ms=Point*MarketInfo(Symbol(),MODE_LOTSIZE);//1
  //MarketInfo("XAGUSD",MODE_LOTSIZE)为每手合约大小,例如:易信的XAGUSD的每手合约为1000
  //XAGUSD的Point,小数最后一位每波动1对应的基础货币(XAGUSD的基础货币为USD)价值,XAGUSD的Point=0.0001
  //那么,1手的XAGUSD对应的报价,该报价每波动一个最小值,价值为0.0001*1000=0.1USD
  //Print("Point:",Point);
  //Print("v_ms:",v_ms);  
  //如果容忍1手止盈止损300美元,即0.1手30美元的范围,则该报价需要波动多少个最小单位呢
  //double v_bd=300/v_ms;
  //Print("v_bd:",v_bd); 
  }
  


  //int len_symbol=StringLen("China50");
  //string str_symbol_right3=StringSubstr("China50",len_symbol-3,3);//len_symbol的值=7,返回字符串"a50"
  //string str_symbol_left3=StringSubstr("China50",0,3);//返回字符串"Chi"
//
 

  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    //光标移动至关键字(mt4系统保留字、函数),单击——按F1,MT4系统弹出对应的帮助内容。
   //for (buys=0,sells=1;)
   //-----------------------设置止盈止损
   
   for (int i=0;i<OrdersTotal();i++)
     {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)  && (OrderStopLoss()==0 || OrderTakeProfit()==0) && Symbol()==OrderSymbol())
        {
          
          //逻辑:交易品种损益计算模式分为:1、外汇(货币对,金、银);2、差价合约(指数,金银以外的金属、其他实物)
          //yksd=yksd*Point;
          //if(若交易品种的外汇,基础货币==美元 && 利润货币!=美元) 则{yksd=yksd*Ask*Point;}       

          
          double aa=MarketInfo(OrderSymbol(),MODE_TICKSIZE)*yksd;
          
          string currency_base=SymbolInfoString(OrderSymbol(),SYMBOL_CURRENCY_BASE);
          //currency_base返回交易品种基础货币,例1:EURJPY,值=EUR;例2:China50,值=USD;例3:Corn,值=USD
          
          string currency_profit=SymbolInfoString(OrderSymbol(),SYMBOL_CURRENCY_PROFIT);
          //currency_profit返回交易品种利润货币,例21:EURJPY,值=JPY;例22:China50,值=USD;例23:Corn,值=USD
          
          string currency_margin=SymbolInfoString(OrderSymbol(),SYMBOL_CURRENCY_MARGIN);
          // currency_margin返交易品种预付款货币,currency_margin=currency_base例31:EURJPY,值=EUR(即,基础货币);例32:China50,值=USD;例33:Corn,值=USD
          //--------
          

          //交易品种,例:XAGUSD\XAUUSD\China50\EURUSD\USDJPY\Corn,
          //Point的值以利润货币计量。
          if (currency_base=="USD" &&   currency_base!=currency_profit) {aa=yksd*Ask/(MarketInfo(OrderSymbol(),MODE_LOTSIZE));}
          //例USDJPY、USDCHF
          if (currency_profit=="USD" && currency_base!=currency_profit) {aa=yksd/(MarketInfo(OrderSymbol(),MODE_LOTSIZE));} //例:XAGUSD、XAUUSD、EURUSD
          //若交易品种为外汇,则左侧货币为基础货币,右侧货币为利润货币(报价货币),Point的值以利润货币计量。例:USDJPY的Point=0.001日元。 EURUSD的Point=0.00001美元。         
          
          if (currency_base=="USD" &&   currency_base==currency_profit) {aa=yksd/MarketInfo(OrderSymbol(),MODE_LOTSIZE);} //例:China50、Corn
          //若交易品种为指数\金属(除金、银交易品种属性为外汇外)等差价合约品种,则SYMBOL_CURRENCY_BASE、SYMBOL_CURRENCY_PROFIT、SYMBOL_CURRENCY_MARGIN均为USD。
                    
          if (currency_base !="USD" && currency_base!=currency_profit && currency_profit!="USD")  {aa=yksd*MarketInfo(OrderSymbol(),MODE_TICKSIZE);};     
          //不含美元的外汇交易品种。例:EURJPY,EURJPY的Point=0.001日元。这种品种较多,难以明确,如自动止损不合格,需手动处理。
          
          //Print(aa,Symbol(),Point,currency_base,currency_profit,currency_margin);
          Sleep(5);
          if (OrderType()==OP_SELL && Symbol()==OrderSymbol() ) 
             {
               bool res1=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid+aa,Digits),NormalizeDouble(Bid-aa,Digits),0,CLR_NONE );
               if(!res1) 
                 Print("Error in OrderModify. Error code=",GetLastError()); 
      
             }         
          if (OrderType()==OP_SELLLIMIT  && Symbol()==OrderSymbol()) 
             {
               bool res3=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+aa,Digits),NormalizeDouble(OrderOpenPrice()-aa,Digits),TimeCurrent()+gyxq_v,Blue);
               if(!res3) 
                 Print("Error in OrderModify. Error code=",GetLastError()); 
             }
          if (OrderType()==OP_SELLSTOP  && Symbol()==OrderSymbol()) 
               {
               bool res5=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+aa,Digits),NormalizeDouble(OrderOpenPrice()-aa,Digits),TimeCurrent()+gyxq_v,CLR_NONE );
               if(!res5) 
                 Print("Error in OrderModify. Error code=",GetLastError()); 
               }
//--------------------------------------------------------------------------------------
 
          if (OrderType()==OP_BUY && Symbol()==OrderSymbol() ) 
             {
               bool res0=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask-aa,Digits),NormalizeDouble(Ask+aa,Digits),0,CLR_NONE );
               if(!res0) 
                 Print("Error in OrderModify. Error code=",GetLastError()); 
      
             }         
          if (OrderType()==OP_BUYLIMIT  && Symbol()==OrderSymbol()) 
             {
               bool res3=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-aa,Digits),NormalizeDouble(OrderOpenPrice()+aa,Digits),TimeCurrent()+gyxq_v,Blue);
               if(!res3) 
                 Print("Error in OrderModify. Error code=",GetLastError()); 
             }
          if (OrderType()==OP_BUYSTOP  && Symbol()==OrderSymbol()) 
               {
               bool res5=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-aa,Digits),NormalizeDouble(OrderOpenPrice()+aa,Digits),TimeCurrent()+gyxq_v,CLR_NONE );
               if(!res5) 
                 Print("Error in OrderModify. Error code=",GetLastError()); 
               }
 
 
        }
        
        
     
      //-----------------------设定订单有效期-----------------
   
       
       if (OrderType()>1 && OrderExpiration()==0 && Symbol()==OrderSymbol())
        {
         bool res99=(OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),TimeCurrent()+gyxq_v,clrNONE));
         if (!res99) 
         Print("Error in OrderModify. Error code=",GetLastError()); 
        }        
      
      
      
      }
    
    
    
    }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值