AK-47 Scalper EA - MetaTrader 5 专家
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小时后评论,即可解锁附件下载
立即登录
