顺水外汇EA交易网MT4

标题: 老易:MQL4编程模版1.03 [打印本页]

作者: laoyee    时间: 2018-1-11 20:06
标题: 老易:MQL4编程模版1.03
520FX真是大大地进步了,老易回来,做点贡献。混迹论坛多年,首次被加精,感谢老大。增加源码附件,顺便赚金币。[ol]
  • #property copyright "Copyright By Laoyee QQ:921795"
  • #property link      "qq:921795"
  • #include
    /*
  • 【程序名称及版本号】
  • 【开发记录】
  • */
  • //----程序预设参数
  • extern string str1 = "====系统预设参数====";
  • extern double 预设开仓量 = 0.1;
  • double Lots;
  • extern string 有效交易开始时间="00:00";
  • string ValidStartTime;
  • extern string 有效交易结束时间="00:00";
  • string ValidEndTime;
  • extern bool 是否采用服务器时间=true;
  • bool ServerTime;
  • //订单控制参数
  • string 订单注释="";
  • string MyOrderComment;
  • int 订单特征码=0;
  • int MyMagicNum;
  • extern string str2 = "====技术指标参数====";
  • //----程序控制参数
  • int BuyGroupOrders, SellGroupOrders; //买入、卖出组成交持仓单数量总计
  • int BuyGroupFirstTicket, SellGroupFirstTicket; //买入、卖出组第一单单号
  • int BuyGroupLastTicket, SellGroupLastTicket; //买入、卖出组最后一单单号
  • int BuyGroupMaxProfitTicket, SellGroupMaxProfitTicket; //买入、卖出组最大盈利单单号
  • int BuyGroupMinProfitTicket, SellGroupMinProfitTicket; //买入、卖出组最小盈利单单号
  • int BuyGroupMaxLossTicket, SellGroupMaxLossTicket; //买入、卖出组最大亏损单单号
  • int BuyGroupMinLossTicket, SellGroupMinLossTicket; //买入、卖出组最小亏损单单号
  • double BuyGroupLots, SellGroupLots; //买入、卖出组成交持仓单开仓量总计
  • double BuyGroupProfit, SellGroupProfit; //买入、卖出组成交持仓单利润总计
  • int BuyLimitOrders, SellLimitOrders; //买入限制挂单、卖出限制挂单数量总计
  • int BuyStopOrders, SellStopOrders; //买入停止挂单、卖出停止挂单数量总计
  • //持仓订单基本信息:0订单号,1开仓时间,2订单利润,3订单类型,4开仓量,5开仓价,
  • //                 6止损价,7止赢价,8订单特征码,9订单佣金,10掉期,11挂单有效日期
  • double OrdersArray[][12];//第1维:订单序号;第2维:订单信息
  • double TempOrdersArray[][12];//临时数组
  • int MyArrayRange; //数组记录数量
  • int Corner = 1; //交易信息显示四个角位置
  • int cnt, i, j; //计数器变量
  • string TextBarString; //蜡烛位置显示文字变量
  • string DotBarString; //蜡烛位置显示文字变量
  • string HLineBarString; //蜡烛位置显示文字变量
  • string VLineBarString; //蜡烛位置显示文字变量
    int start()
  •    {
  •       iMain();
  •       return(0);
  •    }
    /*
  • 函    数:主控程序
  • 输入参数:
  • 输出参数:
  • 算    法:
  • */
  • void iMain()
  •    {
  •       ObjectDelete("myLine");
  •       iTwoPointsLine("myLine",iTime(NULL,0,50),Open[50],Time[0],Bid,2,Blue);
  •       iDrawSign("Text",3,Open[3],Yellow,0,Open[3],14);
  •       iDrawSign("HLine",5,Close[5],Green,0,"",1);
  •       iDrawSign("VLine",6,Close[6],Red,0,"",1);
  •       iShowInfo();
  •       int myTradingSignal=iTradingSignals();
  •    }
  • /*
  • 函    数:计算交易信号
  • 输入参数:
  • 输出参数:9-无信号
  •           0-买入开仓信号
  •           1-卖出开仓信号
  •           2-BuyLimit信号
  •           3-SellLimit信号
  •           4-BuyStop信号
  •           5-SellStop信号
  •           6-买入单平仓信号
  •           7-卖出单平仓信号
  • 算    法:
  • */
  • int iTradingSignals()
  •    {
  •       int myReturn = 9;//预定义返回变量
  •       iDrawSign("Dot", 0, Ask, Green, 241,"",0); //标注买入开仓信号
  •       iDrawSign("Dot", 0, Bid, Red, 242,"",0); //标注卖出开仓信号
  •       if (!iValidTime(ValidStartTime,ValidEndTime,ServerTime))//无效时间段内,不发送交易信号
  •          {
  •             myReturn = 9;
  •          }
  •       return(myReturn);
  •    }
  •    
  • /*
  • 函    数:显示交易信息
  • 输入参数:
  • 输出参数:
  • 算    法:
  • */
  • void iShowInfo()
  •    {
  •       //初始化变量
  •       BuyGroupOrders=0; SellGroupOrders=0; //买入、卖出组成交持仓单数量总计
  •       BuyGroupFirstTicket=0; SellGroupFirstTicket=0; //买入、卖出组第一张订单单号
  •       BuyGroupLastTicket=0; SellGroupLastTicket=0; //买入、卖出组最后一张订单号
  •       BuyGroupMaxProfitTicket=0; SellGroupMaxProfitTicket=0; //买入、卖出组最大盈利单单号
  •       BuyGroupMinProfitTicket=0; SellGroupMinProfitTicket=0; //买入、卖出组最小盈利单单号
  •       BuyGroupMaxLossTicket=0; SellGroupMaxLossTicket=0; //买入、卖出组最大亏损单单号
  •       BuyGroupMinLossTicket=0; SellGroupMinLossTicket=0; //买入、卖出组最小亏损单单号
  •       BuyGroupLots=0; SellGroupLots=0; //买入、卖出组成交单持仓量
  •       BuyGroupProfit=0; SellGroupProfit=0; //买入、卖出组成交单利润
  •       BuyLimitOrders=0; SellLimitOrders=0; //买入限制挂单、卖出限制挂单数量总计
  •       BuyStopOrders=0; SellStopOrders=0; //买入停止挂单、卖出停止挂单数量总计
  •       //初始化订单数组
  •       MyArrayRange=OrdersTotal()+1;
  •       ArrayResize(OrdersArray, MyArrayRange); //重新界定数组
  •       ArrayInitialize(OrdersArray, 0.0); //初始化数组
  •       if (OrdersTotal()>0)
  •          {
  •             //遍历持仓单,创建数组
  •             for (cnt=0; cnt
    Comment("买入组持仓单总计:"+BuyGroupOrders+"  卖出组持仓单总计:"+SellGroupOrders+"\n"+
  •         "买入组第1单单号:"+BuyGroupFirstTicket+"  卖出组第1单单号:"+SellGroupFirstTicket+"\n"+
  •         "买入组最后1单单号:"+BuyGroupLastTicket+"  卖出组最后1单单号:"+SellGroupLastTicket+"\n"+"\n"+
            "买入组最小盈利单单号:"+BuyGroupMinProfitTicket+"  卖出组最小盈利单单号:"+SellGroupMinProfitTicket+"\n"+
  •         "买入组最大盈利单单号:"+BuyGroupMaxProfitTicket+"  卖出组最大盈利单单号:"+SellGroupMaxProfitTicket+"\n"+
  •         "买入组最小亏损单单号:"+BuyGroupMinLossTicket+"  卖出组最小亏损单单号:"+SellGroupMinLossTicket+"\n"+
  •         "买入组最大亏损单单号:"+BuyGroupMaxLossTicket+"  卖出组最大亏损单单号:"+SellGroupMaxLossTicket+"\n"+"\n"+
  •         "买入组开仓量总计:"+BuyGroupLots+"  卖出组开仓量总计:"+SellGroupLots+"\n"+
  •         "买入组利润:"+BuyGroupProfit+"  卖出组利润:"+SellGroupProfit+"\n"+
  •         "买入组限制挂单总计:"+BuyLimitOrders+"  卖出组限制挂单总计:"+SellLimitOrders+"\n"+"\n"+
  •         "买入停止挂单总计:"+BuyStopOrders+"  卖出停止挂单总计:"+SellStopOrders+"\n"+
  •         
  •         "买入组第1单盈利点数:"+iOrderProfitToPoint(BuyGroupFirstTicket)+"\n"+
  •         "2%资金余额本货币对开仓量:"+iFundsToHands(Symbol(),AccountBalance()*2/100)+"\n"+
  •         "资金余额20%作为保证金总量,本货币对最大开仓量:"+iLotsOptimized(AccountBalance(), 20)+"\n"+
  •         "开仓量0.165整形:"+iLotsFormat(0.165));
          return(0);
  •    }
    /*
  • 函    数:计算特定条件的订单
  • 输入参数:myOrderType:订单类型 0-Buy,1-Sell,2-BuyLimit,3-SellLimit,4-BuyStop,5-SellStop
  •          myOrderSort:排序类型 0-按时间,1-按盈利,2-按亏损,3-按开仓价
  •          myMaxMin:最值 0-最大,1-最小
  • 输出参数:返回订单号
  • 算    法:
  • */
  • int iOrderSortTicket(int myOrderType,int myOrderSort,int myMaxMin)
  •    {
  •       int myTicket=0;
  •       int myArraycnt=0; //时间序列
  •       int myArraycnt1=0; //盈亏序列
  •       int myArraycnt2=0; //开仓价序列
  •       int myType;
  •       //创建临时数组
  •       double myTempArray[][12]; //定义临时数组
  •       ArrayResize(myTempArray, MyArrayRange); //重新界定临时数组
  •       ArrayInitialize(myTempArray, 0.0); //初始化临时数组
  •       double myTempOrdersArray[][12]; //定义临时数组
  •       myArraycnt=BuyGroupOrders+SellGroupOrders;
  •       if (myArraycnt==0) return(0);
  •       myArraycnt2=MyArrayRange;
  •       myArraycnt1=myArraycnt;
  •       myArraycnt=myArraycnt-1;
  •       //将原始数组数据复制到myTempOrdersArray数组
  •       ArrayResize(myTempOrdersArray, myArraycnt1); //重新界定临时数组
  •       ArrayInitialize(myTempOrdersArray, 0.0); //初始化临时数组
  •       for (cnt=0; cnti; j--)
  •                      {
  •                         if (OrdersArray[j][1]>OrdersArray[j-1][1])
  •                            {
  •                               myTempArray[0][0]=OrdersArray[j-1][0];
  •                               myTempArray[0][1]=OrdersArray[j-1][1];
  •                               myTempArray[0][2]=OrdersArray[j-1][2];
  •                               myTempArray[0][3]=OrdersArray[j-1][3];
  •                               myTempArray[0][4]=OrdersArray[j-1][4];
  •                               myTempArray[0][5]=OrdersArray[j-1][5];
  •                               myTempArray[0][6]=OrdersArray[j-1][6];
  •                               myTempArray[0][7]=OrdersArray[j-1][7];
  •                               myTempArray[0][8]=OrdersArray[j-1][8];
  •                               myTempArray[0][9]=OrdersArray[j-1][9];
  •                               myTempArray[0][10]=OrdersArray[j-1][10];
  •                               myTempArray[0][11]=OrdersArray[j-1][11];
  •                               
  •                               OrdersArray[j-1][0]=OrdersArray[j][0];
  •                               OrdersArray[j-1][1]=OrdersArray[j][1];
  •                               OrdersArray[j-1][2]=OrdersArray[j][2];
  •                               OrdersArray[j-1][3]=OrdersArray[j][3];
  •                               OrdersArray[j-1][4]=OrdersArray[j][4];
  •                               OrdersArray[j-1][5]=OrdersArray[j][5];
  •                               OrdersArray[j-1][6]=OrdersArray[j][6];
  •                               OrdersArray[j-1][7]=OrdersArray[j][7];
  •                               OrdersArray[j-1][8]=OrdersArray[j][8];
  •                               OrdersArray[j-1][9]=OrdersArray[j][9];
  •                               OrdersArray[j-1][10]=OrdersArray[j][10];
  •                               OrdersArray[j-1][11]=OrdersArray[j][11];
  •                               
  •                               OrdersArray[j][0]=myTempArray[0][0];
  •                               OrdersArray[j][1]=myTempArray[0][1];
  •                               OrdersArray[j][2]=myTempArray[0][2];
  •                               OrdersArray[j][3]=myTempArray[0][3];
  •                               OrdersArray[j][4]=myTempArray[0][4];
  •                               OrdersArray[j][5]=myTempArray[0][5];
  •                               OrdersArray[j][6]=myTempArray[0][6];
  •                               OrdersArray[j][7]=myTempArray[0][7];
  •                               OrdersArray[j][8]=myTempArray[0][8];
  •                               OrdersArray[j][9]=myTempArray[0][9];
  •                               OrdersArray[j][10]=myTempArray[0][10];
  •                               OrdersArray[j][11]=myTempArray[0][11];
  •                            }
  •                      }
  •                }
  •          }
  •       //按利润降序排列数组 myTempOrdersArray
  •       if (myOrderSort==1 || myOrderSort==2)
  •          {
  •             double myTempArray1[][12]; //定义临时数组
  •             ArrayResize(myTempArray1, myArraycnt1); //重新界定临时数组
  •             ArrayInitialize(myTempArray1, 0.0); //初始化临时数组
  •             for (i=0; ii; j--)
  •                      {
  •                         if (myTempOrdersArray[j][2]>myTempOrdersArray[j-1][2])
  •                            {
  •                               myTempArray1[0][0]=myTempOrdersArray[j-1][0];
  •                               myTempArray1[0][1]=myTempOrdersArray[j-1][1];
  •                               myTempArray1[0][2]=myTempOrdersArray[j-1][2];
  •                               myTempArray1[0][3]=myTempOrdersArray[j-1][3];
  •                               myTempArray1[0][4]=myTempOrdersArray[j-1][4];
  •                               myTempArray1[0][5]=myTempOrdersArray[j-1][5];
  •                               myTempArray1[0][6]=myTempOrdersArray[j-1][6];
  •                               myTempArray1[0][7]=myTempOrdersArray[j-1][7];
  •                               myTempArray1[0][8]=myTempOrdersArray[j-1][8];
  •                               myTempArray1[0][9]=myTempOrdersArray[j-1][9];
  •                               myTempArray1[0][10]=myTempOrdersArray[j-1][10];
  •                               myTempArray1[0][11]=myTempOrdersArray[j-1][11];
  •                               
  •                               myTempOrdersArray[j-1][0]=myTempOrdersArray[j][0];
  •                               myTempOrdersArray[j-1][1]=myTempOrdersArray[j][1];
  •                               myTempOrdersArray[j-1][2]=myTempOrdersArray[j][2];
  •                               myTempOrdersArray[j-1][3]=myTempOrdersArray[j][3];
  •                               myTempOrdersArray[j-1][4]=myTempOrdersArray[j][4];
  •                               myTempOrdersArray[j-1][5]=myTempOrdersArray[j][5];
  •                               myTempOrdersArray[j-1][6]=myTempOrdersArray[j][6];
  •                               myTempOrdersArray[j-1][7]=myTempOrdersArray[j][7];
  •                               myTempOrdersArray[j-1][8]=myTempOrdersArray[j][8];
  •                               myTempOrdersArray[j-1][9]=myTempOrdersArray[j][9];
  •                               myTempOrdersArray[j-1][10]=myTempOrdersArray[j][10];
  •                               myTempOrdersArray[j-1][11]=myTempOrdersArray[j][11];
  •                               
  •                               myTempOrdersArray[j][0]=myTempArray1[0][0];
  •                               myTempOrdersArray[j][1]=myTempArray1[0][1];
  •                               myTempOrdersArray[j][2]=myTempArray1[0][2];
  •                               myTempOrdersArray[j][3]=myTempArray1[0][3];
  •                               myTempOrdersArray[j][4]=myTempArray1[0][4];
  •                               myTempOrdersArray[j][5]=myTempArray1[0][5];
  •                               myTempOrdersArray[j][6]=myTempArray1[0][6];
  •                               myTempOrdersArray[j][7]=myTempArray1[0][7];
  •                               myTempOrdersArray[j][8]=myTempArray1[0][8];
  •                               myTempOrdersArray[j][9]=myTempArray1[0][9];
  •                               myTempOrdersArray[j][10]=myTempArray1[0][10];
  •                               myTempOrdersArray[j][11]=myTempArray1[0][11];
  •                            }
  •                      }
  •                }
  •          }
          //按订单开仓价降序排列数组
  •       if (myOrderSort==3)
  •          {
  •             double myTempArray2[][12]; //定义临时数组
  •             ArrayResize(myTempArray2, myArraycnt2); //重新界定临时数组
  •             ArrayInitialize(myTempArray2, 0.0); //初始化临时数组
  •             for (i=0; ii; j--)
  •                      {
  •                         if (OrdersArray[j][5]>OrdersArray[j-1][5])
  •                            {
  •                               myTempArray2[0][0]=OrdersArray[j-1][0];
  •                               myTempArray2[0][1]=OrdersArray[j-1][1];
  •                               myTempArray2[0][2]=OrdersArray[j-1][2];
  •                               myTempArray2[0][3]=OrdersArray[j-1][3];
  •                               myTempArray2[0][4]=OrdersArray[j-1][4];
  •                               myTempArray2[0][5]=OrdersArray[j-1][5];
  •                               myTempArray2[0][6]=OrdersArray[j-1][6];
  •                               myTempArray2[0][7]=OrdersArray[j-1][7];
  •                               myTempArray2[0][8]=OrdersArray[j-1][8];
  •                               myTempArray2[0][9]=OrdersArray[j-1][9];
  •                               myTempArray2[0][10]=OrdersArray[j-1][10];
  •                               myTempArray2[0][11]=OrdersArray[j-1][11];
  •                               
  •                               OrdersArray[j-1][0]=OrdersArray[j][0];
  •                               OrdersArray[j-1][1]=OrdersArray[j][1];
  •                               OrdersArray[j-1][2]=OrdersArray[j][2];
  •                               OrdersArray[j-1][3]=OrdersArray[j][3];
  •                               OrdersArray[j-1][4]=OrdersArray[j][4];
  •                               OrdersArray[j-1][5]=OrdersArray[j][5];
  •                               OrdersArray[j-1][6]=OrdersArray[j][6];
  •                               OrdersArray[j-1][7]=OrdersArray[j][7];
  •                               OrdersArray[j-1][8]=OrdersArray[j][8];
  •                               OrdersArray[j-1][9]=OrdersArray[j][9];
  •                               OrdersArray[j-1][10]=OrdersArray[j][10];
  •                               OrdersArray[j-1][11]=OrdersArray[j][11];
  •                               
  •                               OrdersArray[j][0]=myTempArray2[0][0];
  •                               OrdersArray[j][1]=myTempArray2[0][1];
  •                               OrdersArray[j][2]=myTempArray2[0][2];
  •                               OrdersArray[j][3]=myTempArray2[0][3];
  •                               OrdersArray[j][4]=myTempArray2[0][4];
  •                               OrdersArray[j][5]=myTempArray2[0][5];
  •                               OrdersArray[j][6]=myTempArray2[0][6];
  •                               OrdersArray[j][7]=myTempArray2[0][7];
  •                               OrdersArray[j][8]=myTempArray2[0][8];
  •                               OrdersArray[j][9]=myTempArray2[0][9];
  •                               OrdersArray[j][10]=myTempArray2[0][10];
  •                               OrdersArray[j][11]=myTempArray2[0][11];
  •                            }
  •                      }
  •                }
  •          }
          //X订单类型最低开仓价单
  •       if (myOrderSort==3 && myMaxMin==0)
  •          {
  •             for (cnt=0; cnt
          //X订单类型最高开仓价单
  •       if (myOrderSort==3 && myMaxMin==1)
  •          {
  •             for (cnt=OrdersTotal(); cnt>=0; cnt--)
  •                {
  •                   myType=NormalizeDouble(OrdersArray[cnt][3],0);
  •                   if (OrdersArray[cnt][5]!=0 && myType==myOrderType)
  •                      {
  •                         myTicket=NormalizeDouble(OrdersArray[cnt][0],0);
  •                         break;
  •                      }
  •                }
  •          }
  •       //X订单类型最小亏损单
  •       if (myOrderSort==2 && myMaxMin==1)
  •          {
  •             for (cnt=0; cnt=0; cnt--)
  •                {
  •                   myType=NormalizeDouble(myTempOrdersArray[cnt][3],0);
  •                   if (myTempOrdersArray[cnt][2]0 && myType==myOrderType)
  •                      {
  •                         myTicket=NormalizeDouble(myTempOrdersArray[cnt][0],0);
  •                         break;
  •                      }
  •                }
  •          }
  •       //X订单类型最小盈利单
  •       if (myOrderSort==1 && myMaxMin==1)
  •          {
  •             for (cnt=myArraycnt1; cnt>=0; cnt--)
  •                {
  •                   myType=NormalizeDouble(myTempOrdersArray[cnt][3],0);
  •                   if (myTempOrdersArray[cnt][2]>0 && myType==myOrderType)
  •                      {
  •                         myTicket=NormalizeDouble(myTempOrdersArray[cnt][0],0);
  •                         break;
  •                      }
  •                }
  •          }
          //X订单类型第1开仓单
  •       if (myOrderSort==0 && myMaxMin==1)
  •          {
  •             for (cnt=MyArrayRange; cnt>=0; cnt--)
  •                {
  •                   myType=NormalizeDouble(OrdersArray[cnt][3],0);
  •                   if (OrdersArray[cnt][0]!=0 && myType==myOrderType)
  •                      {
  •                         myTicket=NormalizeDouble(OrdersArray[cnt][0],0);
  •                         break;
  •                      }
  •                }
  •          }
  •       //X类型最后开仓单
  •       if (myOrderSort==0 && myMaxMin==0)
  •          {
  •             for (cnt=0; cnt
    /*
  • 函    数:订单利润转换点数
  • 输入参数:myTicket:订单号
  • 输出参数:
  • 算    法:
  • */
  • int iOrderProfitToPoint(int myTicket)
  •    {
  •       int myPoint=0;
  •       if (OrderSelect(myTicket,SELECT_BY_TICKET,MODE_TRADES))
  •          {
  •             myPoint=NormalizeDouble(((OrderProfit()-OrderSwap())/MarketInfo(OrderSymbol(), MODE_TICKVALUE))/OrderLots(),0);
  •          }
  •       return(myPoint);
  •    }
    /*
  • 函    数:金额转换手数
  • 输入参数:mySymbol:货币对  
  •           myFunds:资金基数
  • 输出参数:
  • 算    法:
  • */
  • double iFundsToHands(string mySymbol,double myFunds)
  •    {
  •       double myLots=myFunds/MarketInfo(mySymbol, MODE_MARGINREQUIRED);//换算可开仓手数
  •       myLots=MathRound(myLots/MarketInfo(mySymbol, MODE_MINLOT))*MarketInfo(Symbol(), MODE_MINLOT);//手数整形
  •       return(myLots);
  •    }
    /*
  • 函    数:资金风险管理
  • 输入参数:myFunds:资金基数,myCapitalRisk:风险比例
  • 输出参数:在指定的风险比例下,允许操作的最大的下单量
  • 算    法:
  • */
  • double iLotsOptimized(double myFunds, double myCapitalRisk)
  •    {
  •       double myMargin=myFunds*myCapitalRisk/100-AccountMargin();//可用保证金额度
  •       double myLots=myMargin/MarketInfo(Symbol(), MODE_MARGINREQUIRED);//换算可开仓手数
  •       myLots=MathRound(myLots/MarketInfo(Symbol(), MODE_MINLOT))*MarketInfo(Symbol(), MODE_MINLOT);//开仓量整形
  •       if (myLots
    /*
  • 函    数:开仓量整形
  • 输入参数:myLots:开仓量
  • 输出参数:按照平台规则计算开仓量
  • 算    法:调整不规范的开仓量数据,按照四舍五入原则及平台开仓量格式规范数据
  • */
  • double iLotsFormat(double myLots)
  •    {
  •       myLots=MathRound(myLots/MarketInfo(Symbol(), MODE_MINLOT))*MarketInfo(Symbol(), MODE_MINLOT);//开仓量整形
  •       if (myLots
    /*
  • 函    数:有效时间段
  • 输入参数:string myStartTime:开始时间,标准格式为hh:mm
  •           string myEndTime:结束时间,标准格式为hh:mm
  •           bool myServerTime:true为服务器时间, false为计算机时间
  • 输出参数:true:有效  false:无效
  • 算    法:
  • */
  • bool  iValidTime(string myStartTime,string myEndTime,bool myServerTime)
  •    {
  •       bool myValue=false;
  •       int myST=StrToTime(myStartTime);
  •       int myET=StrToTime(myEndTime);
  •       if (myST>myET) myET=myET+1440*60;
  •       if (TimeCurrent()>myST && TimeCurrent()myST && TimeLocal()
    /*
  • 函    数:交易繁忙,程序等待,更新缓存数据
  • 输入参数:
  • 输出参数:
  • 算法说明:
  • */
  • void iWait()
  •    {
  •       while (!IsTradeAllowed() || IsTradeContextBusy()) Sleep(100);
  •       RefreshRates();
  •       return(0);
  •    }
  • /*
  • 函    数:计算指标交叉信号
  • 输入参数:double myFast0:当前快线值
  •          double mySlow0:当前慢线值
  •          double myFast1:前一快线值
  •          double mySlow1:前一慢线值
  • 输出参数:向上交叉为0,向下交叉为1,无效交叉为9
  • 算    法:
  • */
  • int iCrossSignal(double myFast0,double mySlow0,double myFast1,double mySlow1)
  •    {
  •       int myReturn=9;
  •       if (myFast0>mySlow0 && myFast1=mySlow1)
  •          {
  •             myReturn=1;
  •          }
  •       return(myReturn);
  •    }
    /*
  • 函    数:两点间连线(主图)
  • 输入参数:string myLineName  线段名称
  •           int myFirstTime  起点时间
  •           int myFirstPrice  起点价格
  •           int mySecondTime  终点时间
  •           int mySecondPrice  终点价格
  •           int myLineStyle  线型 0-实线 1-断线 2-点线 3-点划线 4-双点划线
  •           color myLineColor 线色
  • 输出参数:在指定的两点间连线
  • 算法说明:
  • */
  • void iTwoPointsLine(string myLineName,int myFirstTime,double myFirstPrice,int mySecondTime,double mySecondPrice,int myLineStyle,color myLineColor)
  •    {
  •       ObjectCreate(myLineName,OBJ_TREND,0,myFirstTime,myFirstPrice,mySecondTime,mySecondPrice);//确定两点坐标
  •       ObjectSet(myLineName,OBJPROP_STYLE,myLineStyle); //线型
  •       ObjectSet(myLineName,OBJPROP_COLOR,myLineColor); //线色
  •       ObjectSet(myLineName,OBJPROP_WIDTH, 1); //线宽
  •       ObjectSet(myLineName,OBJPROP_BACK,false);
  •       ObjectSet(myLineName,OBJPROP_RAY,false);
  •    }
    /*
  • 函    数:在屏幕上显示文字标签
  • 输入参数:string LableName 标签名称,如果显示多个文本,名称不能相同
  •           string LableDoc 文本内容
  •           int Corner 文本显示角
  •           int LableX 标签X位置坐标
  •           int LableY 标签Y位置坐标
  •           int DocSize 文本字号
  •           string DocStyle 文本字体
  •           color DocColor 文本颜色
  • 输出参数:在指定的位置(X,Y)按照指定的字号、字体及颜色显示指定的文本
  • 算法说明:
  • */
  • void iDisplayInfo(string LableName,string LableDoc,int Corner,int LableX,int LableY,int DocSize,string DocStyle,color DocColor)
  •    {
  •       if (Corner == -1) return(0);
  •       ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0);
  •       ObjectSetText(LableName, LableDoc, DocSize, DocStyle,DocColor);
  •       ObjectSet(LableName, OBJPROP_CORNER, Corner);
  •       ObjectSet(LableName, OBJPROP_XDISTANCE, LableX);
  •       ObjectSet(LableName, OBJPROP_YDISTANCE, LableY);
  •    }
    /*
  • 函    数:标注符号和画线、文字
  • 参数说明:string myType 标注类型:Dot画点、HLine画水平线、VLine画垂直线、myString显示文字
  •           int myBarPos 指定蜡烛坐标
  •           double myPrice 指定价格坐标
  •           color myColor 符号颜色
  •           int mySymbol 符号代码,108为圆点
  •           string myString 文字内容,在指定的蜡烛位置显示文字
  • 函数返回:在指定的蜡烛和价格位置标注符号或者画水平线、垂直线
  • */
  • void iDrawSign(string myType,int myBarPos,double myPrice,color myColor,int mySymbol,string myString,int myDocSize)
  •       {
  •          if (myType=="Text")
  •             {
  •                ObjectDelete(TextBarString);
  •                TextBarString=myType+Time[myBarPos];
  •                ObjectCreate(TextBarString,OBJ_TEXT,"",Time[myBarPos],myPrice);
  •                ObjectSet(TextBarString,OBJPROP_COLOR,myColor);//颜色
  •                ObjectSet(TextBarString,OBJPROP_FONTSIZE,myDocSize);//大小
  •                ObjectSetText(TextBarString,myString);//文字内容
  •                ObjectSet(TextBarString,OBJPROP_BACK,true);
  •             }
  •          if (myType=="Dot")
  •             {
  •                ObjectDelete(DotBarString);
  •                DotBarString=myType+Time[myBarPos];
  •                ObjectCreate(DotBarString,OBJ_ARROW,0,Time[myBarPos],myPrice);
  •                ObjectSet(DotBarString,OBJPROP_COLOR,myColor);
  •                ObjectSet(DotBarString,OBJPROP_ARROWCODE,mySymbol);
  •                ObjectSet(DotBarString,OBJPROP_BACK,false);
  •             }
  •          if (myType=="HLine")
  •             {
  •                ObjectDelete(HLineBarString);
  •                HLineBarString=myType+Time[myBarPos];
  •                ObjectCreate(HLineBarString,OBJ_HLINE,0,Time[myBarPos],myPrice);
  •                ObjectSet(HLineBarString,OBJPROP_COLOR,myColor);
  •                ObjectSet(HLineBarString,OBJPROP_BACK,false);
  •             }
  •          if (myType=="VLine")
  •             {
  •                ObjectDelete(VLineBarString);
  •                VLineBarString=myType+Time[myBarPos];
  •                ObjectCreate(VLineBarString,OBJ_VLINE,0,Time[myBarPos],myPrice);
  •                ObjectSet(VLineBarString,OBJPROP_COLOR,myColor);
  •                ObjectSet(VLineBarString,OBJPROP_BACK,false);
  •             }
  •      }
    /*
  • 函    数:物件颜色
  • 输入参数:数值
  • 输出参数:颜色
  • 算    法:负数为红色,正数为绿色,0为灰色
  • */
  • color iObjectColor(double myInput)
  •    {
  •       color myColor;
  •       if (myInput > 0)
  •          myColor = Green; //正数颜色为绿色
  •       if (myInput
    /*
  • 函    数:获取最后错误信息
  • 输入参数:数值
  • 输出参数:错误信息
  • 算    法:
  • */
  • string iGetErrorInf0()
  • {
  •    int myLastErrorMub=GetLastError();
  •    string myLastErrorStr;
  •    if(myLastErrorMub!=0)
  •       {
  •          switch (myLastErrorMub)
  •             {
  •                case 0:myLastErrorStr="错误代码:"+0+"没有错误返回";break;
  •                case 1:myLastErrorStr="错误代码:"+1+"没有错误返回但结果不明";break;
  •                case 2:myLastErrorStr="错误代码:"+2+"一般错误";break;
  •                case 3:myLastErrorStr="错误代码:"+3+"无效交易参量";break;
  •                case 4:myLastErrorStr="错误代码:"+4+"交易服务器繁忙";break;
  •                case 5:myLastErrorStr="错误代码:"+5+"客户终端旧版本";break;
  •                case 6:myLastErrorStr="错误代码:"+6+"没有连接服务器";break;
  •                case 7:myLastErrorStr="错误代码:"+7+"没有权限";break;
  •                case 8:myLastErrorStr="错误代码:"+8+"请求过于频繁";break;
  •                case 9:myLastErrorStr="错误代码:"+9+"交易运行故障";break;
  •                case 64:myLastErrorStr="错误代码:"+64+"账户禁止";break;
  •                case 65:myLastErrorStr="错误代码:"+65+"无效账户";break;
  •                case 128:myLastErrorStr="错误代码:"+128+"交易超时";break;
  •                case 129:myLastErrorStr="错误代码:"+129+"无效价格";break;
  •                case 130:myLastErrorStr="错误代码:"+130+"无效停止";break;
  •                case 131:myLastErrorStr="错误代码:"+131+"无效交易量";break;
  •                case 132:myLastErrorStr="错误代码:"+132+"市场关闭";break;
  •                case 133:myLastErrorStr="错误代码:"+133+"交易被禁止";break;
  •                case 134:myLastErrorStr="错误代码:"+134+"资金不足";break;
  •                case 135:myLastErrorStr="错误代码:"+135+"价格改变";break;
  •                case 136:myLastErrorStr="错误代码:"+136+"开价";break;
  •                case 137:myLastErrorStr="错误代码:"+137+"经纪繁忙";break;
  •                case 138:myLastErrorStr="错误代码:"+138+"重新开价";break;
  •                case 139:myLastErrorStr="错误代码:"+139+"定单被锁定";break;
  •                case 140:myLastErrorStr="错误代码:"+140+"只允许看涨仓位";break;
  •                case 141:myLastErrorStr="错误代码:"+141+"过多请求";break;
  •                case 145:myLastErrorStr="错误代码:"+145+"因为过于接近市场,修改否定";break;
  •                case 146:myLastErrorStr="错误代码:"+146+"交易文本已满";break;
  •                case 147:myLastErrorStr="错误代码:"+147+"时间周期被经纪否定";break;
  •                case 148:myLastErrorStr="错误代码:"+148+"开单和挂单总数已被经纪限定";break;
  •                case 149:myLastErrorStr="错误代码:"+149+"当对冲备拒绝时,打开相对于现有的一个单置";break;
  •                case 150:myLastErrorStr="错误代码:"+150+"把为反FIFO规定的单子平掉";break;
  •                case 4000:myLastErrorStr="错误代码:"+4000+"没有错误";break;
  •                case 4001:myLastErrorStr="错误代码:"+4001+"错误函数指示";break;
  •                case 4002:myLastErrorStr="错误代码:"+4002+"数组索引超出范围";break;
  •                case 4003:myLastErrorStr="错误代码:"+4003+"对于调用堆栈储存器函数没有足够内存";break;
  •                case 4004:myLastErrorStr="错误代码:"+4004+"循环堆栈储存器溢出";break;
  •                case 4005:myLastErrorStr="错误代码:"+4005+"对于堆栈储存器参量没有内存";break;
  •                case 4006:myLastErrorStr="错误代码:"+4006+"对于字行参量没有足够内存";break;
  •                case 4007:myLastErrorStr="错误代码:"+4007+"对于字行没有足够内存";break;
  •                case 4008:myLastErrorStr="错误代码:"+4008+"没有初始字行";break;
  •                case 4009:myLastErrorStr="错误代码:"+4009+"在数组中没有初始字串符";break;
  •                case 4010:myLastErrorStr="错误代码:"+4010+"对于数组没有内存";break;
  •                case 4011:myLastErrorStr="错误代码:"+4011+"字行过长";break;
  •                case 4012:myLastErrorStr="错误代码:"+4012+"余数划分为零";break;
  •                case 4013:myLastErrorStr="错误代码:"+4013+"零划分";break;
  •                case 4014:myLastErrorStr="错误代码:"+4014+"不明命令";break;
  •                case 4015:myLastErrorStr="错误代码:"+4015+"错误转换(没有常规错误)";break;
  •                case 4016:myLastErrorStr="错误代码:"+4016+"没有初始数组";break;
  •                case 4017:myLastErrorStr="错误代码:"+4017+"禁止调用DLL ";break;
  •                case 4018:myLastErrorStr="错误代码:"+4018+"数据库不能下载";break;
  •                case 4019:myLastErrorStr="错误代码:"+4019+"不能调用函数";break;
  •                case 4020:myLastErrorStr="错误代码:"+4020+"禁止调用智能交易函数";break;
  •                case 4021:myLastErrorStr="错误代码:"+4021+"对于来自函数的字行没有足够内存";break;
  •                case 4022:myLastErrorStr="错误代码:"+4022+"系统繁忙 (没有常规错误)";break;
  •                case 4050:myLastErrorStr="错误代码:"+4050+"无效计数参量函数";break;
  •                case 4051:myLastErrorStr="错误代码:"+4051+"无效参量值函数";break;
  •                case 4052:myLastErrorStr="错误代码:"+4052+"字行函数内部错误";break;
  •                case 4053:myLastErrorStr="错误代码:"+4053+"一些数组错误";break;
  •                case 4054:myLastErrorStr="错误代码:"+4054+"应用不正确数组";break;
  •                case 4055:myLastErrorStr="错误代码:"+4055+"自定义指标错误";break;
  •                case 4056:myLastErrorStr="错误代码:"+4056+"不协调数组";break;
  •                case 4057:myLastErrorStr="错误代码:"+4057+"整体变量过程错误";break;
  •                case 4058:myLastErrorStr="错误代码:"+4058+"整体变量未找到";break;
  •                case 4059:myLastErrorStr="错误代码:"+4059+"测试模式函数禁止";break;
  •                case 4060:myLastErrorStr="错误代码:"+4060+"没有确认函数";break;
  •                case 4061:myLastErrorStr="错误代码:"+4061+"发送邮件错误";break;
  •                case 4062:myLastErrorStr="错误代码:"+4062+"字行预计参量";break;
  •                case 4063:myLastErrorStr="错误代码:"+4063+"整数预计参量";break;
  •                case 4064:myLastErrorStr="错误代码:"+4064+"双预计参量";break;
  •                case 4065:myLastErrorStr="错误代码:"+4065+"数组作为预计参量";break;
  •                case 4066:myLastErrorStr="错误代码:"+4066+"刷新状态请求历史数据";break;
  •                case 4067:myLastErrorStr="错误代码:"+4067+"交易函数错误";break;
  •                case 4099:myLastErrorStr="错误代码:"+4099+"文件结束";break;
  •                case 4100:myLastErrorStr="错误代码:"+4100+"一些文件错误";break;
  •                case 4101:myLastErrorStr="错误代码:"+4101+"错误文件名称";break;
  •                case 4102:myLastErrorStr="错误代码:"+4102+"打开文件过多";break;
  •                case 4103:myLastErrorStr="错误代码:"+4103+"不能打开文件";break;
  •                case 4104:myLastErrorStr="错误代码:"+4104+"不协调文件";break;
  •                case 4105:myLastErrorStr="错误代码:"+4105+"没有选择定单";break;
  •                case 4106:myLastErrorStr="错误代码:"+4106+"不明货币对";break;
  •                case 4107:myLastErrorStr="错误代码:"+4107+"无效价格";break;
  •                case 4108:myLastErrorStr="错误代码:"+4108+"无效定单编码";break;
  •                case 4109:myLastErrorStr="错误代码:"+4109+"不允许交易";break;
  •                case 4110:myLastErrorStr="错误代码:"+4110+"不允许长期";break;
  •                case 4111:myLastErrorStr="错误代码:"+4111+"不允许短期";break;
  •                case 4200:myLastErrorStr="错误代码:"+4200+"定单已经存在";break;
  •                case 4201:myLastErrorStr="错误代码:"+4201+"不明定单属性";break;
  •                case 4202:myLastErrorStr="错误代码:"+4202+"定单不存在";break;
  •                case 4203:myLastErrorStr="错误代码:"+4203+"不明定单类型";break;
  •                case 4204:myLastErrorStr="错误代码:"+4204+"没有定单名称";break;
  •                case 4205:myLastErrorStr="错误代码:"+4205+"定单坐标错误";break;
  •                case 4206:myLastErrorStr="错误代码:"+4206+"没有指定子窗口";break;
  •                case 4207:myLastErrorStr="错误代码:"+4207+"定单一些函数错误";break;
  •                case 4250:myLastErrorStr="错误代码:"+4250+"错误设定发送通知到队列中";break;
  •                case 4251:myLastErrorStr="错误代码:"+4251+"无效参量- 空字符串传递到SendNotification()函数";break;
  •                case 4252:myLastErrorStr="错误代码:"+4252+"无效设置发送通知(未指定ID或未启用通知)";break;
  •                case 4253:myLastErrorStr="错误代码:"+4253+"通知发送过于频繁";break;
  •             }
  •       }
  •    return(myLastErrorStr);
  • }
  • int init()
  •    {
  •       //显示基本信息
  •       iDisplayInfo("Author", "作者:老易 QQ:921795", Corner, 18, 15, 8, "", SlateGray);
  •       iDisplayInfo("Symbol", Symbol(), Corner, 25, 30, 14, "Arial Bold", DodgerBlue);
  •       iDisplayInfo("TradeInfo", "欢迎使用!", Corner, 5, 50, 9, "", Olive);
  •       iShowInfo();
  •       //初始化预设变量
  •       Lots=预设开仓量;
  •       ValidStartTime=有效交易开始时间;
  •       ValidEndTime=有效交易结束时间;
  •       ServerTime=是否采用服务器时间;
  •       MyOrderComment=订单注释;
  •       MyMagicNum=订单特征码;
          //
  •       return(0);
  •    }
    int deinit()
  •    {
  •       ObjectsDeleteAll();
  •       Comment ("");
  •       return(0);
  •    }


  • [/ol]复制代码
    作者: laoyee    时间: 2018-1-11 21:29

    我一直使用这个源码,从没在此处出现错误。查看是否有其他的不可见字符。
    作者: 9999    时间: 2018-1-11 21:59

    老易:MQL4编程模版→真是好学习的模版

    留言
    http://www.520fx.com/home.php?mod=space&uid=65547&do=index


    作者: 9999    时间: 2018-1-11 23:30


    留言
    http://www.520fx.com/home.php?mod=space&uid=65547&do=index

    作者: laoyee    时间: 2018-1-11 23:54
    请自行删除源码中的
    符号
    作者: zw0806    时间: 2018-1-12 01:15
    谢谢分享
    作者: kkllff    时间: 2018-1-12 01:45
    胯服服服服
    作者: 平和心态    时间: 2018-1-12 02:10
    谢谢分享。但编译后有错?
    作者: laoyee    时间: 2018-1-12 02:58

    请看2楼提示
    作者: byrontang    时间: 2018-1-12 03:31
    这是做什么用的?
    作者: laoyee    时间: 2018-1-12 05:10

    汇集常用模块,加快编程速度。

    作者: 平和心态    时间: 2018-1-12 06:15
    谢谢提示。
    作者: 胶水    时间: 2018-1-12 06:38
    回帖赚钱
    作者: 熙羽    时间: 2018-1-12 07:10
    支持易公!
    作者: godying    时间: 2018-1-12 08:26

    谢谢分享,顺便问下,这个模板具体是用来干嘛的,我是新手




    欢迎光临 顺水外汇EA交易网MT4 (http://waterforex.com/) Powered by Discuz! X3.2