欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

AK-47 Scalper EA - MetaTrader 5 专家

author emer | 302 人阅读 | 0 人评论 |

1. 输入参数

#定义外部机器人名称“AK-47 EA” //机器人名称
#定义  版本“1.00”

//导入输入类
#包括<交易\PositionInfo.mqh>#包括<贸易\贸易.mqh>#包括<交易\SymbolInfo.mqh>  #包括<交易\AccountInfo.mqh>#包括<交易\OrderInfo.mqh>//--- 引入预定义变量以提高代码可读性
#定义问    符号信息双_象征,SYMBOL_ASK#定义出价    符号信息双_象征,SYMBOL_BID//--- 输入参数
输入 细绳  ESettings         =“—————————————————”;//--------  --------
输入 整数      InpMagicNumber    =124656;  //幻数
输入 细绳  金钱设置      =“—————————————————”;//-------- <货币设置> --------
输入 布尔值     isVolume_Percent=真的;    //允许体积百分比
输入 双倍的   InpRisk           =3;        //余额风险百分比(%)
输入 细绳  交易设置    =“—————————————————”;//-------- <交易设置> --------
输入 双倍的   Inpuser_lot       =0.01;    //很多
输入 双倍的   InpSL_Pips        =3.5;      //止损(以点为单位)
输入 双倍的   InpTP_Pips        =7;        //TP(以点为单位)(0 = 无 TP)
输入 整数      InpMax_slippage   =3;        //最大滑点allow_Pips。
输入 双倍的   InpMax_spread     =5;        //允许的最大点差(以点为单位)(0 =浮动)
输入 细绳   时间设置      =“—————————————————”;//-------- <交易时间设置> --------
输入 布尔值     InpTimeFilter     =真的;    //交易时间过滤器
输入 整数      InpStartHour      =2;        //开始时间
输入 整数      InpStartMinute =30;      //开始分钟
输入 整数      InpEndHour        =21;      //结束时间
输入 整数      InpEndMinute      =0;        //结束分钟

2.局部变量初始化

//--- 变量
整数      Pips2Points;    // 滑点  3 点    3=点    30=点
双倍的   点数2双;    // 止损 15 点    0.015      0.0150
布尔值     是订单=错误的;整数      滑移;长的     ac传播;细绳   字符串注释 =””;

CPositionInfo  m_position;                  // 交易头寸对象CTrade         m_trade;                      // 交易对象CSymbolInfo    m_symbol;                    // 交易品种信息对象CAccountInfo   m_account;                    // 账户信息包装COrderInfo     m_order;                      // 挂单对象

3. 主要代码

a/ 专家初始化函数

//+------------------------------------------------------------------+
//|专家初始化函数                                   |
//+------------------------------------------------------------------+
整数 初始化时() {

  //3位或5位检测  //点和点  如果_数字%2==1){
      Pips2Double=_观点*10;
      Pips2Points =10;
      滑点=10* InpMax_slippage;
   }
  别的{
      Pips2Double=_观点;
      Pips2Points =  1;
      滑点 = InpMax_slippage;
   }
     
  如果(!m_symbol.名称(象征()))// 设置交易品种名称      返回初始化失败);
      
   刷新率();//---   m_trade.SetExpertMagicNumber(InpMagicNumber);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetDeviationInPoints(滑点);//---  返回初始化成功);
}

b/ 专家勾选功能

//+------------------------------------------------------------------+
//|专家勾选功能                                            |
//+------------------------------------------------------------------+
空白 勾选() {

  如果终端信息整数TERMINAL_TRADE_ALLOWED) ==错误的){
      评论“LazyBot\n不允许交易。”);
      返回;
   }
     
  Mql日期时间结构时间;
  时间当前(结构时间);
   结构时间.sec =0;
   
  //设置开始时间   structTime.hour = InpStartHour;
   structTime.min = InpStartMinute;       
  日期时间开始时间 =结构到时间(结构时间);
   
  //设置结束时间   structTime.hour = InpEndHour;
   structTime.min = InpEndMinute;
  日期时间时间结束 =结构到时间(结构时间);
   
   ac传播 =符号信息整数_象征,符号_传播);
   
   
   字符串注释 =“\n”+ 外部机器人名称 +“-v”+ (细绳)版本;
   str注释 +="\n服务器时间 = "+字符串时间时间当前(),TIME_DATE|TIME_SECONDS) +“——”+ DayOfWeekDescription(structTime.day_of_week);
   str注释 +="\n交易时间 = ["+ (细绳)InpStartHour +“h”+ (细绳)Inp开始分钟 +“-->”+  (细绳)InpEndHour +“h”+ (细绳)InpEndMinute +“]”;
   
   str注释 +="\n当前价差 = "+ (细绳)acSpread +「积分」;
   
  评论(strComment);
   
  //更新值   更新订单();
   
   追踪止损();
      
  //Dieu kien giao dich theo phien My  如果(InpTimeFilter) {
      如果时间当前() >= 开始时间 &&时间当前() < 时间结束) {
        如果(!isOrder) OpenOrder();
      }
   }
  别的{
      如果(!isOrder) OpenOrder();
   }
   
}//---结束函数

3.1 计算信号以发送订单

//+------------------------------------------------------------------+
//|计算信号并发送指令                                  |
//+------------------------------------------------------------------+
空白打开订单(){
   
  ENUM_ORDER_TYPE订单类型 =订单类型_卖出;//-1;  
  双倍的TP =0;
  双倍的SL =0;
  细绳评论 = ExtBotName;
   
  //计算手数  双倍的手数1 = 计算成交量();
   
  如果(订单类型==订单类型_卖出){
      双倍的开盘价 = 出价 -规范化双精度(InpSL_Pips/2* Pips2Double,_数字);
      
      TP = 开盘价 -规范化双精度(InpTP_Pips * Pips2Double,_数字);
      SL = 询问 +规范化双精度(InpSL_Pips/2* Pips2Double,_数字);
         
      如果(检查SpreadAllow()                                            //检查点差         && 检查成交量值(lot1)                                      //检查音量         && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_SELL_STOP, 开盘价)  //检查从 openPrice 到 Bid 的距离         && 检查止损(开盘价、止损、止盈)                          //检查SL、TP到OpenPrice的距离         && CheckMoneyForTrade(m_symbol.Name(),lot1,订单类型_卖出))//检查余额 khi lenh cho duoc Hit      {
        如果(!m_trade.SellStop(lot1, OpenPrice, m_symbol.Name(), SL, TP,ORDER_TIME_GTC,0, 评论))
        打印__功能__,“--> 订单发送错误”, m_trade.ResultComment());
      }
   }
  别的 如果(订单类型==订单类型购买){
      双倍的开盘价 = 卖价 +规范化双精度(InpSL_Pips/2* Pips2Double,_数字);
      SL = 出价 -规范化双精度(InpSL_Pips/2* Pips2Double,_数字);
      
      如果(检查SpreadAllow()                                            //检查点差         && 检查成交量值(lot1)                                      //检查音量         && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_BUY_STOP, 开盘价)  //检查从 openPrice 到 Bid 的距离         && 检查止损(开盘价、止损、止盈)                          //检查SL、TP到OpenPrice的距离                 && CheckMoneyForTrade(m_symbol.Name(),lot1,订单类型购买))  //检查余额 khi lenh cho duoc Hit      {
        如果(!m_trade.BuyStop(lot1, OpenPrice, m_symbol.Name(), SL, TP,ORDER_TIME_GTC,0, 评论))// 当到期日期 = 0 时使用“ORDER_TIME_GTC”        打印__功能__,“--> 订单发送错误”, m_trade.ResultComment());
      }
   }
   
}

3.2 计算体积

//+------------------------------------------------------------------+
//|计算体积                                                 |
//+------------------------------------------------------------------+
// 我们定义函数来计算头寸大小并返回订单手数。
双倍的计算体积() {

  双倍的手数 =0;

  如果(isVolume_Percent ==错误的){
      手数= Inpuser_lot;
     }
  别的{
      手数 = (InpRisk) * m_account.FreeMargin();
      手数 = 手数 /100000;
      双倍的n =数学地板(手数/Inpuser_lot);
      //评论((字符串)n);      手数 = n * Inpuser_lot;
      
      如果(手数< Inpuser_lot)
         手数= Inpuser_lot;

      如果(LotSize > m_symbol.LotsMax()) LotSize = m_symbol.LotsMax();

      如果(LotSize < m_symbol.LotsMin()) LotSize = m_symbol.LotsMin();
   }
    //---  返回(手数);
}
3.3 EA具有“追踪止损”功能, 每次价格变化(下跌)时SL都会变化
//+------------------------------------------------------------------+
//|追踪止损                                                     |
//+------------------------------------------------------------------+
空白追踪停止() {

  双倍的SL_in_Pip =0;

  为了整数我=持仓总数()-1;我 >=0;我 - ) {
      如果(m_position.SelectByIndex(i)) {    // 按索引选择订单以进一步访问其属性                如果((m_position.Magic() == InpMagicNumber) && (m_position.象征() == m_symbol.Name())) {
            // 对于购买订单            如果(m_position.PositionType() ==POSITION_TYPE_BUY){
              //--价格变化时计算止损               SL_in_Pip =规范化双精度(出价 - m_position.StopLoss(),_数字) / Pips2Double;
              如果(SL_in_Pips > InpSL_Pips) {
                  双倍的新SL =规范化双精度(出价 - InpSL_Pips * Pips2Double,_数字);
                  
                  如果(!m_trade.PositionModify(m_position.Ticket(), newSL, m_position.TakeProfit())) {
                    打印__功能__,“--> 订单修改错误”, m_trade.ResultComment());
                    继续;  
                  }
               }
            }

            //对于卖单            别的 如果(m_position.PositionType() ==POSITION_TYPE_SELL){
              //--价格变化时计算止损               SL_in_Pip =规范化双精度(m_position.StopLoss() - 出价,_数字) / Pips2Double;
              如果(SL_in_Pips > InpSL_Pips){
                  双倍的新SL =规范化双精度(出价 + (InpSL_Pips) * Pips2Double,_数字);
                  如果(!m_trade.PositionModify(m_position.Ticket(), newSL, m_position.TakeProfit())) {
                    打印__功能__,“--> 订单修改错误”, m_trade.ResultComment());
                    //继续;                    }
               }
            }
         }
      }
   }
   
  //--- 修改挂单    为了整数我=订单总数()-1;我>=0;我 - ) {// 返回当前订单数量      如果(m_order.SelectByIndex(i)) {      // 按索引选择挂单以进一步访问其属性        如果(m_订单。象征() == m_symbol.Name() && m_order.Magic()==InpMagicNumber) {
            如果(m_order.OrderType() ==ORDER_TYPE_BUY_STOP){
               SL_in_Pip =规范化双精度(出价 - m_order.StopLoss(),_数字) / Pips2Double;
                  
              如果(SL_in_Pips < InpSL_Pips/2){
                  双倍的新操作 =规范化双精度(出价 + (InpSL_Pips/2) * Pips2Double,_数字);
                  双倍的新TP=  规范化双精度(newOP + InpTP_Pips * Pips2Double,_数字);
                  双倍的新SL =规范化双精度(出价 - (InpSL_Pips/2) * Pips2Double,_数字);                  
                  
                  如果(!m_trade.OrderModify(m_order.Ticket(), newOP, newSL, newTP,ORDER_TIME_GTC,0)){
                    打印__功能__,“--> 修改 PendingOrder 错误!”, m_trade.ResultComment());
                    继续;  
                  }               
               }
            }
            别的 如果(m_order.OrderType() ==ORDER_TYPE_SELL_STOP){
               SL_in_Pip =规范化双精度(m_order.StopLoss() - 询问,_数字) / Pips2Double;
               
              如果(SL_in_Pips < InpSL_Pips/2){
                  双倍的新操作 =规范化双精度(问 - (InpSL_Pips/2) * Pips2Double,_数字);
                  双倍的新TP=  规范化双精度(newOP - InpTP_Pips * Pips2Double,_数字);
                  双倍的新SL =规范化双精度(询问 + (InpSL_Pips/2) * Pips2Double,_数字);
                  
                  如果(!m_trade.OrderModify(m_order.Ticket(), newOP, newSL, newTP,ORDER_TIME_GTC,0)){
                    打印__功能__,“--> 修改 PendingOrder 错误!”, m_trade.ResultComment());
                    //继续;                    }               
               }
            }
            
         }
      }
    }    
}


附件下载

📎 ak-47_scalper_ea__-_mt5.mq5(45.37 KB)

Source: MQL5 #44883

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录