Lazy Bot MT5(每日突破 EA) - MetaTrader 5 专家
//导入外部类 #包括<交易\PositionInfo.mqh>#包括<贸易\贸易.mqh>#包括<交易\SymbolInfo.mqh> #包括<交易\AccountInfo.mqh>#包括<交易\OrderInfo.mqh>//--- 引入预定义变量以提高代码可读性 #定义问 符号信息双(_象征,SYMBOL_ASK)#定义出价 符号信息双(_象征,SYMBOL_BID)//--- 输入参数 输入 细绳 EA 设置 =“—————————————————”;//---------------- 输入 整数 InpMagicNumber =123456; //幻数 输入 细绳 InpBot 名称 =“LazyBot_V1”;//机器人名称 输入 细绳 交易设置 =“—————————————————”;//-------- <交易设置> -------- 输入 双倍的 输入用户手数 =0.01; //很多 输入 双倍的 输入用户_SL =5.0; //止损(以点为单位) 输入 双倍的 InpAddPrice_pip =0; //从[H]、[L]到OP_Price的距离(以点为单位) 输入 整数 输入用户_SLippage =3; // 最大滑点allow_Pips。 输入 双倍的 InpMax_spread =0; //允许的最大点差(以点数为单位)(0 = 浮动) 输入 细绳 时间设置 =“—————————————————”;//-------- <交易时间设置> -------- 输入 布尔值 正在交易时间 =真的; //允许交易时间 输入 整数 Inp开始时间 =7; //开始时间 输入 整数 InpEndHour =22; //结束时间 输入 细绳 资金管理设置 =“—————————————————”;//-------- <货币设置> -------- 输入 布尔值 isVolume_Percent =错误的; //允许体积百分比 输入 双倍的 Inp风险 =1; //余额风险百分比(%)
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. 主要代码
解释该策略,Everyday Bot 将删除所有旧订单并找到前一天柱的最高和最低值并发送到两个挂单“买入_止损“,”卖出_止损“。(无止盈)。
a/ 专家初始化函数
整数 初始化时() {//--- //3位或5位检测 //点和点 如果(_数字%2==1) { Pips2Double=_观点*10; Pips2Points =10; 滑点=10* Inpuser_SLippage; } 别的 { Pips2Double=_观点; Pips2Points = 1; 滑移= Inpuser_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不允许交易。”); 返回; } //获取交易时间, // 打开部分 // 伦敦 14 小时 - 23 小时 GMT 越南 // 纽约 19 点 - 04 点 GMT 越南 Mql日期时间本地时间; Mql日期时间时间服务器; 时间本地(本地时间); 时间当前(时间服务器); // 节假日不工作。 如果(timeServer.day_of_week ==0|| timeServer.day_of_week ==6) 返回; 整数hourLocal = timeLocal.hour;//TimeHour(TimeLocal()); 整数当前时间 = timeServer.hour;//时间小时(TimeCurrent()); ac传播 =符号信息整数(_象征,符号_传播); 字符串注释 =“\n当地时间=”+ 小时本地; str注释 +="\n当前时间 = "+ 小时当前; str注释 +=“\n传播=”+ (细绳)acSpread; str注释 +="\n总条数 = "+ (细绳) 总条数; 评论(strComment); //检查尾随 尾随SL();//--- 如果(最后!=爱时(m_symbol.Name(),PERIOD_D1,0))// && 当前小时 > InpStartHour) { //查看交易时间 如果(是交易时间) { 如果(当前小时 >= InpStartHour)// && 当前小时 < InpEndHour){ { 删除旧订单(); //发送订单 BUY_STOP 和 SELL_STOP 打开订单(); 最后=爱时(m_symbol.Name(),PERIOD_D1,0); } } 别的 { 删除旧订单(); //发送订单 BUY_STOP 和 SELL_STOP 打开订单(); 最后=爱时(m_symbol.Name(),PERIOD_D1,0); } } }
3.1 计算信号并发送订单
//+------------------------------------------------------------------+ //|计算信号并发送指令 | //+------------------------------------------------------------------+ 空白开仓订单() { 双倍的TP_买入=0, TP_卖出 =0; 双倍的SL_买入 =0, SL_卖出 =0; //检查最大点差 如果(InpMax_spread !=0){ 如果(acSpread > InpMax_spread){ 打印(__功能__,“ > 当前点差大于用户点差!...”); 返回; } } 双倍的Bar1High = m_symbol.NormalizePrice(爱高(m_symbol.Name(),PERIOD_D1,1)); 双倍的Bar1Low = m_symbol.NormalizePrice(低(m_symbol.Name(),PERIOD_D1,1)); //计算手数 双倍的手数1 = 计算成交量(); 双倍的OpenPrice = m_symbol.NormalizePrice(Bar1High + InpAddPrice_pip * Pips2Double);// + NormalizeDouble((acSpread/Pips2Points) * Pips2Double, Digits); //对于BUY_STOP -------------------------------- TP_买入=0;//Bar1High + NormalizeDouble(min_sl* Pips2Double, Digits); SL_Buy = m_symbol.NormalizePrice(OpenPrice - Inpuser_SL * Pips2Double); 总柱数 =酒吧(m_symbol.Name(),PERIOD_D1); 细绳评论 = InpBotName +“;”+ m_symbol.Name() +“;”+ 总条数; 如果(检查成交量值(lot1) && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_BUY_STOP, 开盘价) && CheckMoneyForTrade(m_symbol.Name(),lot1,订单类型购买) && 检查止损(OpenPrice, SL_Buy)) { 如果(!m_trade.BuyStop(lot1, OpenPrice, m_symbol.Name(), SL_Buy, TP_Buy,ORDER_TIME_GTC,0, 评论))// 当到期日期 = 0 时使用“ORDER_TIME_GTC” 打印(__功能__,“--> 购买错误”); } //对于SELL_STOP -------------------------------- OpenPrice = m_symbol.NormalizePrice(Bar1Low - InpAddPrice_pip * Pips2Double);// - NormalizeDouble((acSpread/Pips2Points) * Pips2Double, Digits); TP_卖出 =0;//Bar1Low - NormalizeDouble(min_sl* Pips2Double, Digits); SL_Sell = m_symbol.NormalizePrice(OpenPrice + Inpuser_SL * Pips2Double); 如果(检查成交量值(lot1) && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_SELL_STOP, 开盘价) && CheckMoneyForTrade(m_symbol.Name(),lot1,订单类型_卖出) && 检查止损(OpenPrice, SL_Sell)) { 如果(!m_trade.SellStop(lot1, OpenPrice, m_symbol.Name(), SL_Sell, TP_Sell,ORDER_TIME_GTC,0, 评论)) 打印(__功能__,“--> 销售错误”); } }
3.2 新的一天,删除所有旧订单
//+------------------------------------------------------------------+ //|删除旧订单 | //+------------------------------------------------------------------+ 空白删除旧订单() { 细绳九月=“;”; // 作为字符的分隔符 超短u_sep; // 分隔符的代码 细绳结果[]; // 获取字符串的数组 为了(整数我=订单总数()-1;我 >=0;我 - ) // 返回当前订单数量 { 如果(m_order.SelectByIndex(i)) // 按索引选择挂单以进一步访问其属性 { //--- 获取分隔符代码 u_sep =字符串获取字符(九月,0); 细绳订单注释 = m_order.评论(); //拆分OrderComment(EAName;Symbol;totalBar)得到Ordersymbol 整数k =字符串分割(Ordcomment,u_sep,结果); 如果(k>2) { 细绳sym = m_symbol.Name(); 如果((m_order.Magic() == InpMagicNumber) && (sym == 结果[1])) { m_trade.OrderDelete(m_order.Ticket()); } } } } }
3.3 EA具有“追踪止损”功能, 每次价格变化SL都会变化,使利润增加
//+------------------------------------------------------------------+ //|追踪止损 | //+------------------------------------------------------------------+ 空白尾随SL() { 双倍的SL_in_Pip =0; 为了(整数我=持仓总数()-1;我 >=0;我 - ) { 如果(m_position.SelectByIndex(i)) // 按索引选择订单以进一步访问其属性 { 如果((m_position.Magic() == InpMagicNumber) && (m_position.象征() == m_symbol.Name())) //m_symbol.Name() { 双倍的order_stoploss1 = m_position.StopLoss(); // 对于购买订单 如果(m_position.PositionType() ==POSITION_TYPE_BUY) { //--价格变化时计算止损 SL_in_Pip =规范化双精度((出价 - order_stoploss1),_数字) / Pips2Double; //Print(__FUNCTION__, "修改订单买入" + (string)SL_in_Pip); 如果(SL_in_Pip > Inpuser_SL) { 订单_止损1 =规范化双精度(Bid - (Inpuser_SL * Pips2Double), _数字); m_trade.PositionModify(m_position.Ticket(), order_stoploss1, m_position.TakeProfit()); } } //对于卖单 如果(m_position.PositionType() ==POSITION_TYPE_SELL) { //--价格变化时计算止损 SL_in_Pip =规范化双精度((m_position.StopLoss() - 询问),_数字) / Pips2Double; 如果(SL_in_Pip > Inpuser_SL) { 订单_止损1 =规范化双精度(询问+(Inpuser_SL * Pips2Double),_数字); m_trade.PositionModify(m_position.Ticket(), order_stoploss1, m_position.TakeProfit()); } } } } } }
3.4 检查体积值
//+------------------------------------------------------------------+ //|检查订单量是否正确 | //+------------------------------------------------------------------+ 布尔值检查成交量值(双倍的体积) {//--- 交易操作的最小允许交易量 双倍的min_volume = m_symbol.LotsMin(); //--- 最大允许交易操作量 双倍的max_volume = m_symbol.LotsMax();//--- 获得音量变化的最小步长 双倍的Volume_step = m_symbol.LotsStep(); 如果(音量 < 最小音量 || 音量 > 最大音量) { 返回(错误的); } 整数比率=(整数)数学轮(体积/体积步长); 如果(数学抗体(比率*体积_步长-体积)>0.0000001) { 返回(错误的); } 返回(真的); }
3.5 检查自由级别
//+------------------------------------------------------------------+ //|检查冻结级别 | //+------------------------------------------------------------------+ 布尔值CheckOrderForFREEZE_LEVEL(ENUM_ORDER_TYPE类型,双倍的价格)//改变这个函数的名称{ 整数冻结级别 = (整数)符号信息整数(_象征, SYMBOL_TRADE_FREEZE_LEVEL); 布尔值检查=错误的; //--- 仅检查两种订单类型 转变(类型) { //--- 买入操作 案件 ORDER_TYPE_BUY_STOP: { //--- 检查开盘价到激活价的距离 检查 = ((价格-询问) > freeze_level*_观点); //--- 返回检查结果 返回(查看); } //--- 卖出操作 案件 ORDER_TYPE_SELL_STOP: { //--- 检查开盘价到激活价的距离 检查 = ((出价)>freeze_level*_观点); //--- 返回检查结果 返回(查看); } 休息; }//--- 挂单需要一个稍微不同的函数 返回 错误的; }
3.6 检查交易资金
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 布尔值检查交易货币(细绳符号,双倍的很多,ENUM_ORDER_TYPE类型) {//--- 获取开盘价 MQTickMQLTICK; 符号信息勾选(符号,MQLTICK); 双倍的价格=mqltick.ask; 如果(类型==订单类型_卖出) 价格=mqltick.bid;//--- 所需保证金和可用保证金的值 双倍的保证金,free_margin=帐户信息双(ACCOUNT_MARGIN_FREE); //--- 调用检查函数 如果(!订单计算保证金(类型、符号、手数、价格、保证金)) { //--- 出了问题,报告并返回 false 打印(“错误于”,__功能__,“代码=”,获取最后一个错误()); 返回(错误的); } //--- 如果没有足够的资金来执行操作 如果(保证金>自由保证金) { //--- 报告错误并返回 false 打印(“钱不够”,枚举转字符串(类型),” “,很多,” “,符号,“错误代码=”,获取最后一个错误()); 返回(错误的); }//--- 检查成功 返回(真的); }
3.7 检查止损
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 布尔值检查止损(双倍的价格,双倍的SL) {//--- 获取 SYMBOL_TRADE_STOPS_LEVEL 水平 整数停止级别 = (整数)符号信息整数(m_symbol.Name(),SYMBOL_TRADE_STOPS_LEVEL); 如果(停止级别!=0) { 打印格式(“SYMBOL_TRADE_STOPS_LEVEL=%d:必须设置止损和获利”+ “距离收盘价不超过 %d 点”、 停止级别、 停止级别); }//--- 布尔值SL_检查=错误的; //--- 检查止损 返回SL_检查=数学抗体(价格 - 止损) > (stops_level * m_symbol。观点()); }
视频 MQL4:
附件下载
📎 lazybot_mt5_v1.mq5 (17.21 KB)
Source: MQL5 #41732
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录
