加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

EA 常用自定义函数 汇总

(2013-02-05 21:15:38)
标签:

模版

mt4

财经

分类: mt4程序化交易

//+------------------------------------------------------------------+
//|                                                customFuction.mq4 |
//|                                                           wangyu |
//|                                      http://wangyu204.taobao.com |
//+------------------------------------------------------------------+
#property copyright "wangyu"
#property link      "http://wangyu204.taobao.com"
#define MAGICNUM 20130205

extern double availableMarginRatio; //可用保证金比例
extern int slipPoints=3; //滑点
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   createColorRec("rectangle1",High[2],Low[0],Red);
   createText("text1",5,High[5],DoubleToStr(Ask,Digits));
   writeText("Ask1",DoubleToStr(Ask,Digits),100,100,White,50);
   createLine("line1",High[0],White);
//----
   return(0);
  }
//+------------------------------------------------------------------+
void createColorRec(string objName,double start,double end,color clr) //画长方形
{
   ObjectDelete(objName);
   ObjectCreate(objName,OBJ_RECTANGLE,0,Time[2],start,Time[0],end);
   ObjectSet(objName,OBJPROP_COLOR,clr);
   ObjectSet(objName,OBJPROP_BACK,false);
   ObjectSet(objName,OBJPROP_WIDTH,0);
   ObjectSet(objName,OBJPROP_STYLE,0);
}

void createText(string objName,int i,double data,string str) //画K线文字
{
   if(ObjectFind(objName)!=0)
   {
      ObjectCreate(objName,OBJ_TEXT,0,Time[i],data);
      ObjectSetText(objName,str,10,"Arial",DodgerBlue);
   }else{
      ObjectMove(objName,0,Time[i],data);
   }
}

void writeText(string labelName,string text,int x,int y,color colorValue,int fontSize)
{
   ObjectDelete(labelName);
   ObjectCreate(labelName,OBJ_LABEL,0,0,0);
   ObjectSetText(labelName,text,fontSize,"Arial",colorValue);
   ObjectSet(labelName,OBJPROP_CORNER,0);
   ObjectSet(labelName,OBJPROP_XDISTANCE,x);
   ObjectSet(labelName,OBJPROP_YDISTANCE,y);
}

void createLine(string objName,double data,color clr) //画水平线
{
   ObjectDelete(objName);
   ObjectCreate(objName,OBJ_HLINE,0,D'2005.11.01 10:30',data);
   ObjectSet(objName,OBJPROP_COLOR,clr);
}

//选用buy sell 函数下单  

//1.同一标识不会重复下单

//2.止损止盈可以设置为0

//3.兼容有些平台 开单不能下止损的问题

int buy(double lots,int slippage,int stopLoss,int stopProfit,string comment,int magic)

  {

   int ticket=0;

   int findNum=0;

   for(int i=0;i

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {if(OrderComment()==comment && OrderMagicNumber()==magic)findNum++;}

     }

   if(findNum==0)//避免同一标识 重复下单

     {

      ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,slippage,0,0,comment,magic,0,Blue);

      if(ticket>0)

        {

         if(OrderSelect(ticket,SELECT_BY_TICKET)==true)

           {

            double stopLossValue=OrderOpenPrice()-stopLoss*Point;

            double stopProfitValue=OrderOpenPrice()+stopProfit*Point;

            if(stopLoss==0)stopLossValue=0;

            if(stopProfit==0)stopProfitValue=0;

            if(OrderModify(OrderTicket(),OrderOpenPrice(),stopLossValue,stopProfitValue,0,White)==true)

              {return(ticket);}

            else{Print("OrderModify error ",GetLastError());}

           }

        }

     }

   return (0);

  }

//+------------------------------------------------------------------+

int sell(double lots,int slippage,int stopLoss,int stopProfit,string comment,int magic)

  {

   int ticket=0;

   int findNum=0;

   for(int i=0;i

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {if(OrderComment()==comment && OrderMagicNumber()==magic)findNum++;}

     }

   if(findNum==0)//避免同一标识 重复下单

     {

      ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,slippage,0,0,comment,magic,0,Red);

      if(ticket>0)

        {

         if(OrderSelect(ticket,SELECT_BY_TICKET)==true)

           {

            double stopLossValue=OrderOpenPrice()+stopLoss*Point;

            double stopProfitValue=OrderOpenPrice()-stopProfit*Point;

            if(stopLoss==0)stopLossValue=0;

            if(stopProfit==0)stopProfitValue=0;

            if(OrderModify(OrderTicket(),OrderOpenPrice(),stopLossValue,stopProfitValue,0,White)==true)

              {return(ticket);}

            else{Print("OrderModify error ",GetLastError());}

           }

        }

     }

   return(0);

  }

//+------------------------------------------------------------------+

//持仓成本计算(点数) 平均盈亏多少点

double averagePositionCostInPoint()

  {

   int j=0;

   double tmp=0.0;

   double tmpLot=0.0;

   for(int i=0;i

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         j++;

         tmp+=OrderOpenPrice()*OrderLots();

         tmpLot+=OrderLots();

        }

      else{Print("订单选择失败:",GetLastError());}

     }

   if(tmpLot==0.0)return(999999);//特殊标记空仓

   else {return(NormalizeDouble((Close[0]-(tmp/tmpLot)),0));}

  }

//+------------------------------------------------------------------+

//+----------------------------------------------------------------------------+

//|  Error functions                                                       

//+----------------------------------------------------------------------------+

string ErrorDescription(int code)

  {

   string error;

   switch(code)

     {

      case 0:

      case 1:error="no error";break;

      case 2:error="common error";break;

      case 3:error="invalid trade parameters";break;

      case 4:error="trade server is busy";break;

      case 5:error="old version of the client terminal";break;

      case 6:error="no connection with trade server";break;

      case 7:error="not enough rights";break;

      case 8:error="too frequent requests";break;

      case 9:error="malfunctional trade operation";break;

      case 64:error="account disabled";break;

      case 65:error="invalid account";break;

      case 128:error="trade timeout";break;

      case 129:error="invalid price";break;

      case 130:error="invalid stops";break;

      case 131:error="invalid trade volume";break;

      case 132:error="market is closed";break;

      case 133:error="trade is disabled";break;

      case 134:error="not enough money";break;

      case 135:error="price changed";break;

      case 136:error="off quotes";break;

      case 137:error="broker is busy";break;

      case 138:error="requote";break;

      case 139:error="order is locked";break;

      case 140:error="long positions only allowed";break;

      case 141:error="too many requests";break;

      case 145:error="modification denied because order too close to market";break;

      case 146:error="trade context is busy";break;

      case 4000:error="no error";break;

      case 4001:error="wrong function pointer";break;

      case 4002:error="array index is out of range";break;

      case 4003:error="no memory for function call stack";break;

      case 4004:error="recursive stack overflow";break;

      case 4005:error="not enough stack for parameter";break;

      case 4006:error="no memory for parameter string";break;

      case 4007:error="no memory for temp string";break;

      case 4008:error="not initialized string";break;

      case 4009:error="not initialized string in array";break;

      case 4010:error="no memory for array\' string";break;

      case 4011:error="too long string";break;

      case 4012:error="remainder from zero divide";break;

      case 4013:error="zero divide";break;

      case 4014:error="unknown command";break;

      case 4015:error="wrong jump (never generated error)";break;

      case 4016:error="not initialized array";break;

      case 4017:error="dll calls are not allowed";break;

      case 4018:error="cannot load library";break;

      case 4019:error="cannot call function";break;

      case 4020:error="expert function calls are not allowed";break;

      case 4021:error="not enough memory for temp string returned from function";break;

      case 4022:error="system is busy (never generated error)";break;

      case 4050:error="invalid function parameters count";break;

      case 4051:error="invalid function parameter value";break;

      case 4052:error="string function internal error";break;

      case 4053:error="some array error";break;

      case 4054:error="incorrect series array using";break;

      case 4055:error="custom indicator error";break;

      case 4056:error="arrays are incompatible";break;

      case 4057:error="global variables processing error";break;

      case 4058:error="global variable not found";break;

      case 4059:error="function is not allowed in testing mode";break;

      case 4060:error="function is not confirmed";break;

      case 4061:error="send mail error";break;

      case 4062:error="string parameter expected";break;

      case 4063:error="integer parameter expected";break;

      case 4064:error="double parameter expected";break;

      case 4065:error="array as parameter expected";break;

      case 4066:error="requested history data in update state";break;

      case 4099:error="end of file";break;

      case 4100:error="some file error";break;

      case 4101:error="wrong file name";break;

      case 4102:error="too many opened files";break;

      case 4103:error="cannot open file";break;

      case 4104:error="incompatible access to a file";break;

      case 4105:error="no order selected";break;

      case 4106:error="unknown symbol";break;

      case 4107:error="invalid price parameter for trade function";break;

      case 4108:error="invalid ticket";break;

      case 4109:error="trade is not allowed";break;

      case 4110:error="longs are not allowed";break;

      case 4111:error="shorts are not allowed";break;

      case 4200:error="object is already exist";break;

      case 4201:error="unknown object property";break;

      case 4202:error="object is not exist";break;

      case 4203:error="unknown object type";break;

      case 4204:error="no object name";break;

      case 4205:error="object coordinates error";break;

      case 4206:error="no specified subwindow";break;

      default:error="unknown error";

     }

   return(error);

  }

//+------------------------------------------------------------------+

double GetLotsHolding()//计算当前持仓总量

  {

   double tempLots=0.0;

   for(int i=OrdersTotal()-1;i>=0;i--)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNum)

           {tempLots+=OrderLots();}

        }

      else

        {Print("订单选择失败:",GetLastError());}

     }

   return(tempLots);

  }

//+------------------------------------------------------------------+

double GetOrderOpenPriceHolding() //计算当前Symbol最新持仓的开盘价

  {

   for(int i=OrdersTotal()-1;i>=0;i--)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNum)

           {return(OrderOpenPrice());}

        }

      else

        {Print("订单选择失败:",GetLastError());}

     }

   return(-1);

  }

//+------------------------------------------------------------------+

int GetOrderTypeHolding() //没有持仓返回-1   从最近持仓单提取订单类型?

  {

   int type=-1;

   for(int i=OrdersTotal()-1;i>=0;i--)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNum)

           {return(OrderType());}

        }

      else

        {Print("订单选择失败:",GetLastError());}

     }

   return(type);

  }

//+------------------------------------------------------------------+

int GetOrderHoldingStartTimeK() //获取最后入场订单对应的K线序列

  {

   for(int i=OrdersTotal()-1;i>=0;i--)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         if(OrderSymbol()==Symbol())

           {return(iBarShift(Symbol(),PERIOD_H1,OrderOpenTime(),false));}

        }

      else

        {Print("订单选择失败:",GetLastError());}

     }

   return(-1);

  }

//+------------------------------------------------------------------+

bool ClosePosition() //close all pending and holding positions

  {

   bool Flag=true;

   int tick[200]={-1},cmp[200]={-1};

   int j=0,i;

   for(i=0;i

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNum) //只过滤当前Symbol  可去掉 close所有的

           {

            j++;

            tick[j]=OrderTicket();

            cmp[j]=OrderType();

           }

        }

      else

        {Print("订单选择失败:",GetLastError());}

     }

   if(j!=0)

     {

      for(i=1;i<=j;i++)

        {

         if(OrderSelect(tick[i],SELECT_BY_TICKET)==true)

           {

            switch(cmp[i])

              {

               case OP_BUY:

                  if(OrderClose(tick[i],OrderLots(),Bid,slipPoints,CLR_NONE)==false) Flag=false;

                  break;

               case OP_SELL:

                  if(OrderClose(tick[i],OrderLots(),Ask,slipPoints,CLR_NONE)==false) Flag=false;

                  break;

              }


           }

         else

           {Print("订单选择失败:",GetLastError());}

        }

     }

   return(Flag);

  }

//+------------------------------------------------------------------+

bool EntryMarketPrice(int type,int magic,double lot) //市价入场函数

  {

   int ticket=-1;

   bool result=false;

   if(lot<=0)return(true);

   switch(type)

     {

      case OP_BUY:

         ticket=OrderSend(Symbol(),type,lot,Ask,slipPoints,0,0,"",magic,0,CLR_NONE);

         if(ticket<0)

           {Print("多单市价入场失败 ",GetLastError());}

         else

           {result=true;}

         break;

      case OP_SELL:

         ticket=OrderSend(Symbol(),type,lot,Bid,slipPoints,0,0,"",magic,0,CLR_NONE);

         if(ticket<0)

           {Print("空单市价入场失败 ",GetLastError());}

         else

           {result=true;}

         break;

     }

   return(result);

  }

//+------------------------------------------------------------------+

int GetProfitOrdersNum() //计算盈利单个数

  {

   int check=0;

   for(int i=0;i

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNum)

           {if(OrderProfit()>0) check++;}

        }

      else

        {Print("订单选择失败:",GetLastError());}

     }

   return(check);

  }

//+------------------------------------------------------------------+

int GetHoldingOrdersNum() //计算持仓单格数

  {

   int count=0;

   for(int i=0;i

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNum)

           {count++;}

        }

      else

        {Print("订单选择失败:",GetLastError());}

     }

   return(count);

  }

//+------------------------------------------------------------------+

double CaculateLotsLimit() //按比例计算出可入场资金对应的手数

{

   double maxMargin=availableMarginRatio*(AccountMargin()+AccountFreeMargin());

   double maxLots=NormalizeDouble(maxMargin/(MarketInfo(Symbol(),MODE_LOTSIZE)/AccountLeverage()),2);

   //Print("MagicNum=",MagicNum);

   return(maxLots);

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有