中国传媒大学王赞:自定义函数集

来源:百度文库 编辑:中财网 时间:2024/05/01 10:47:22

自定义函数集  

 

  

(转) 

外部可被调用的文件分成2种:dll和ex4

dll文件 一般是用其他编程工具编写的标准动态链接函数库,一般用于与Windows打交道的地方,我们用不到。

ex4文件  我们习惯称为'库文件',在MT4里面是保存在expert/ libraries目录下。

 

如何创建库文件?

在编缉器里“新建”,选择Library即可,这个文件头部会有表示本文件为库文件的语句

#property library

下面的内容就可以按照自己的想法定义自己的单个或者多个函数。

完成后,Compile就在libraries目录生成了ex4库文件。

 

如何调用库文件?

1。在指标文件的头部加入引用语句#import "库文件名.ex4"

2。引用语句后紧跟库文件里面的函数说明 例如“double MyC(int X,int Y);”

3。如上引用和函数说明后,就可以在指标里面直接使用自定义函数MyC了。

 

只能引用自定义函数,不能引用函数中的变量。

 

double iCustom( string symbol, int timeframe, string name, ... , int mode, int shift) 计算 自定义指标 的值

:: 输入参数symbol - 通货标识timeframe - 时间线name - 自定义指标名称... - 自定义指标参数 mode - 来源模式,参见指标线分类枚举shift - 位移数

double val=iCustom(NULL, 0, "SampleInd",13,1,0);

int mode (0~7)对应自定义指标中不同线或者箭头数值

看MT4里面关于这个函数的说明如下:

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Calculates the specified custom indicator and returns its value. The custom indicator must be compiled (*.EX4 file) and be in the terminal_directory\experts\indicators directory.  

放置目录就是指标目录:\experts\indicators

[转]

MT4自定义函数库

(转)MT4自定义函数库使用说明
1、MT4自定义函数库.ex4为函数库文件。下载后存放在mt4安装文件夹下的experts\libraries文件夹下。
2、自定义函数调用.mqh为包含文件。下载后存放在mt4安装文件夹下的experts\include文件夹下。
3、调用时只需要在或EA文件开始位置插入下面一行语句
   #include <自定义函数调用.mqh>

===========================================================================

 

 

//查询当前货币持仓个数

int GetHoldingOrderCnt()

{

int  j = 0 ;

for ( int i =0;   i

    {

    OrderSelect( i,   SELECT_BY_POS,     MODE_TRADES );

    if  ( OrderSymbol() ==Symbol()  )

      {

        j = j + 1 ;    

      }

    }   

return ( j );        //函数返回的是当前图表中货币的持仓个数,如果返回0,表示空仓。

}

 

 

 

 

//获取最近持仓单

 

int 寻找最先仓(int x)                      // 1=BUY    2=SELL 返回最近仓位的ticket

{

switch( x )

          {

          case 1:

                  {

                   int tick=0;

                   int temptime=TimeCurrent();

                   for (int i=0;  i

                         {

                         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

                        if ( OrderType()==OP_BUY  && OrderSymbol()==Symbol()  && OrderMagicNumber()==520)

                              {

                              if ( temptime >OrderOpenTime())

                                 {

                                  temptime =OrderOpenTime();

                                 tick =OrderTicket();

                                }

                            }

                         }

                    return(tick);

                    }

             case 2:

                    {

                      tick=0;

                     temptime =TimeCurrent();

                     for (i=0; i

                           {

                            OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

                            if (OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==520)

                               {

                                if (temptime >OrderOpenTime())

                                   {

                                    temptime=OrderOpenTime();

                                   tick=OrderTicket();

                                  }

                             }

                         }

                   return(tick);

                   }

             }

 }

 

 

//全部平仓

 

  1. bool ClosePosition()                         //
  2. {
  3. bool Flag = true;
  4. int  tick[200], tp[200];
  5. int  j = 0;
  6. for( int  i =0;  i
  7. {
  8. OrderSelect( i,  SELECT_BY_POS,  MODE_TRADES );
  9. if( OrderSymbol() ==Symbol()  & (OrderMagicNumber() ==MagicHunDun) )
  10. {
  11. j = j +1;
  12. tick[j] = OrderTicket();
  13. tp[j] = OrderType();
  14. }
  15. }
  16. if ( j != 0)
  17. {
  18. for( i =1; i <=j; i++)
  19. {
  20. OrderSelect( tick[i],  SELECT_BY_TICKET);
  21. switch( tp[ i ] )
  22. {
  23. case OP_BUY:
  24. if( OrderClose( tick[ i ], OrderLots(), Bid, 3 ,CLR_NONE ) ==false )   Flag =false;
  25. break;
  26. case  OP_SELL:
  27. if( OrderClose( tick[i], OrderLots(), Ask, 3, CLR_NONE ) ==false )   Flag =false;
  28. break;
  29. }
  30. }
  31. }
  32. return( Flag );

 

//求N周期K线价格(或数组变量中)的最大值

/* 参数 

 MODE=0 (求K线最高价的最大值)
  MODE=1 (求ARRAY[])数组中的最大值)
 N                周期数
ARRAY[]    数据源数组名称 当MODE=0是随便定一个以空数组就可以了。


例:
例1 : double   H=HH(0,30,a);求最近30条K线的最高价。
例12: double   H=HH(1,30,a);求a数组中a[0]到a[29]中的最大值。*/


double  HH( int  MODE, int  N, double ARRAY[] )
  {
    double H;
    switch( MODE )
    {
      case 0:
        H = High[ iHighest( NULL, 0, MODE_HIGH, N, 0) ];
        break;
      case 1:
        H = ARRAY[ ArrayMaximum( ARRAY, N, 0) ];
        break;
      default:
        H = High[ iHighest( NULL, 0, MODE_HIGH, N, 0 ) ];
        break;
    }
    return( H );
  }

求N周期K线价格(或数组变量中)的最小值

double  GetLL(int MODE,  int N,  double   ARRAY[])
  {
    double LL;                                                                                      //定义最低
    switch( MODE )                                                                             // 查找 (模式)

    {
      case 0:                                                                                          //情况0
        LL = Low[ iLowest(NULL,0,MODE_LOW,N,0) ];                        //最低 为
        break;                                                                                                //中断循环 
      case 1:                                                                                           //情况1
        LL = ARRAY[ ArrayMinimum(ARRAY,N,0) ];                                //最低 为
        break;                                                                                                //中断循环      default:                                                                                                 // 默认
        LL = Low[ iLowest(NULL,0,MODE_LOW,N,0) ];
        break;                                                                                                 //中断循环
    }
    return(LL);                                                                                            //返回( 最低 )
  }

//在窗口的任意位置添加文字标签。以窗口像素点坐标来定位

 

void drawLabel(string name,int Win_idx,string LABEL,int X, int Y,color Color)

string name                      //文字标签的名字,字符串变量或常量。
int Winidx                         //文字标签放置的窗口索引。主窗口为0,副窗口为1开始的整数,1、2、3等
string LABEL                   //文字标签的内容,字符串变量或常量。
int X                                   // 文字标签存放的位置横坐标,以窗口的左边界向右计算的像素点数
int Y                                   // 文字标签存放的位置纵坐标,以窗口的上边界向下计算的像素点数
color Color                        //文字标签的字体颜色


例:
drawLabel("当前买入价格",0,"当前买入价格:"+Ask,300, 100,Red);

//订单查询函数

/*     功能:
根据MAGIC编号和订单类型,查找相应订单,并返回订单编号(ticket)
如果没有找到返回0;    */


int SearchOrder (int MAGIC,int ORDERTYPE)
  {
   int i=0;
   for ( int z = OrdersTotal() - 1; z >= 0; z -- )
        {
        if ( !OrderSelect( z, SELECT_BY_POS ) )
             {
              Print("OrderSelect(", z, ",SELECT_BY_POS) - Error #",GetLastError() );
             continue;
            }
     if (OrderSymbol()!=Symbol())    continue;
     if (OrderMagicNumber() != MAGIC )    continue;
     if ( OrderType()==ORDERTYPE )  i=OrderTicket();
   }
  return(i);

}

 

//移动止损函数

/*功能:
检查以MAGIC标记的当前图表的以成交订单。当盈利点数大于一定值(MOVE)的时候,移动止损价格。每次移动STEP点数。
三个参数均为整数。不论成功与否均返回0;*/


int  MoveStop ( int  MAGIC,  int  MOVE,  int  STEP)            //  MoveStop(MAGIC, MOVE);
   {

   if (MOVE<=0) return(0);
   double MoveStopPrice;
   for ( int z = OrdersTotal() - 1; z >= 0; z -- )
   {
     if ( !OrderSelect( z, SELECT_BY_POS ) )
     {
       Print("OrderSelect(", z, ",SELECT_BY_POS) - Error #",GetLastError() );
       continue;
     }
     if (OrderSymbol()!=Symbol())continue;
     if (OrderMagicNumber() != MAGIC )continue;
     switch (OrderType())
     {
       case OP_BUY   : 
       {
         MoveStopPrice=NormalizeDouble(Bid-MOVE*Point,Digits);
         if (MoveStopPrice>OrderOpenPrice() && OrderStopLoss()         {
           if(!OrderModify(OrderTicket(),OrderOpenPrice(),MoveStopPrice+STEP*Point,OrderTakeProfit(),OrderExpiration()))
           {
             Alert("MoveStop_OrderModify Error #",GetLastError());
             return(-1);
           }
         }
         break;
       }
       case OP_SELL:
       {
         MoveStopPrice=NormalizeDouble(Ask+MOVE*Point,Digits);
         if (MoveStopPriceMoveStopPrice)
         {
           if(!OrderModify(OrderTicket(),OrderOpenPrice(),MoveStopPrice-STEP*Point,OrderTakeProfit(),OrderExpiration()))
           {
             Alert("MoveStop_OrderModify Error #",GetLastError());
             return(-1);
           }
         }
         break;
       }
       default: break;
     }
   }

   return(0);
  }

 

//判断均线交叉函数


int MA_X_MA (int PX, int F,int S,int MODE, int PR, int j )
           判断均线交叉(      时间框 ,    快线,       慢线,         均线模式,   价格类型,  平移值   )

 {
   double MAF[3], MAS[3];
   int i=0;
   MAF[0] =iMA(NULL,PX,F,0,MODE,PR,0+j);
   MAF[1] =iMA(NULL,PX,F,0,MODE,PR,1+j);
   MAF[2] =iMA(NULL,PX,F,0,MODE,PR,2+j);
   MAS[0 ]=iMA(NULL,PX,S,0,MODE,PR,0+j);
   MAS[1] =iMA(NULL,PX,S,0,MODE,PR,1+j);
   MAS[2] =iMA(NULL,PX,S,0,MODE,PR,2+j);


   if (MAF[0]>MAS[0]  &&  MAF[1]   if (MAF[0]MAS[1]) i=-1;
   if (MAF[0]>MAS[0]  &&  MAF[1]==MAS[1]  &&  MAF[2]   if (MAF[0]MAS[2]) i=-1;

   return(i);
  }

 

 //移动止损

void tr(int magicint triling_i)

{
         for ( int  k=0; k< OrdersTotal(); k++)

      {
             OrderSelect( k, SELECT_BY_POS);
             if ( OrderMagicNumber() ==magic )

        {      
               if (OrderType() ==OP_BUY &  &  NormalizeDouble(Ask-OrderOpenPrice(), Digits)   > =triling_i*Point & &  OrderStopLoss()< NormalizeDouble(Ask-triling_i*Point,Digits))

          {
         if (!OrderModify(OrderTicket(), OrderOpenPrice(),NormalizeDouble(Ask-triling_i*Point,Digits),OrderTakeProfit(),0,Blue)){
            Print("Trailing stop error Buy :"+error(GetLastError()));
         }  
      }
      if (OrderType()==OP_SELL && NormalizeDouble(Bid+triling_i*Point,Digits)<=OrderOpenPrice() && (OrderStopLoss()>NormalizeDouble(Bid+triling_i*Point,Digits) || OrderStopLoss()==0)) {
         if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid+triling_i*Point,Digits),OrderTakeProfit(),0,Red)){
            Print("Trailing stop error Sell :"+error(GetLastError()));
         }
      }
    }
  }
}

 

//在图表上输出多行的Comment(注释)

extern int MaxCommentsToShow=25;
//An array to hold all of the comments
string allcomments[];
 
//+------------------------------------------------------------------+
//| Manage comments - Written by DMS                                           |
//+------------------------------------------------------------------+
void managecomments(string addcomment)
   {
   string tempcomments[];
   int commentscroll;
   string output;
   int CommentCount = ArrayRange(allcomments, 0);
   if(CommentCount<MaxCommentsToShow)
      {
      ArrayResize(tempcomments,CommentCount+1);
      ArrayCopy(tempcomments,allcomments,1,0,WHOLE_ARRAY);
      }
   else
      {
      ArrayResize(tempcomments,MaxCommentsToShow);
      ArrayCopy(tempcomments,allcomments,1,0,MaxCommentsToShow-1);
      }  
   tempcomments[0]=addcomment;
   CommentCount = ArrayRange(tempcomments, 0);
   ArrayResize(allcomments,CommentCount);
   ArrayCopy(allcomments,tempcomments,0,0,CommentCount);
 
   for(commentscroll=0;commentscroll<CommentCount;commentscroll++)
      {
      output = output + allcomments[commentscroll] +"\n";
      }   
   Comment(output);
   } 

 

 

通过Object在屏幕上写字

void writetext(string Labelname,string data,int x,int y,color ColorValue,int FontSize)

// 通过Object写文字(文件名,  内容,  X坐标,  Y坐标,  字色,  文字大小 )

{

ObjectDelete(Labelname);

ObjectCreate(Labelname,  OBJ_LABEL,  0,  0,  0); 

ObjectSetText(Labelname,  data,  FontSize,  "Arial",  ColorValue);

ObjectSet(Labelname,  OBJPROP_CORNER,  0);

ObjectSet(Labelname,  OBJPROP_XDISTANCE,  x);

ObjectSet(Labelname,  OBJPROP_YDISTANCE,  y);

}

 

例:int start()   { writetext("例1", "文字屏幕显示", 100, 400, Red, 25)  }

 

 

//获得开仓价
//在start函数里的使用的句子:
double LastBuyOpenPrice;
LastBuyOpenPrice=GetBuyOrderOpenPrice();
--------------//自定义函数----------------------------------------
double GetBuyOrderOpenPrice()    
{
for ( int  i = OrdersTotal()-1;  i>=0;  i-- )        //从单手数减减循环查找
      {
      OrderSelect( i,  SELECT_BY_POS,  MODE_TRADES );                   // 选择交易中的订单类型
       if(OrderSymbol() == Symbol()  &&  OrderType() == OP_BUY  )       // 单符号为指定符号 且 单类型为 买单
      {      
     return( OrderOpenPrice() );                                                       //返回单开仓价
    }
}
return( -1 );                                                    //如果没有指定的持仓单,则返回(-1)
}

 

 

如果真

double iif(bool a, double b, double c) {if(a) return(b);return(c);}

 

判断开仓时间间隔是否达到

bool checkM()
   {
    int  total =OrdersTotal();
    bool Hcounter;
    datetime opentm = OrderOpenTime();
       
    if (total>=1)
        OrderSelect(total-1,SELECT_BY_POS,MODE_TRADES);

    if (TimeCurrent()-opentm >Period()*60) Hcounter =true; 
     else Hcounter =false;
     
    return (Hcounter);
   }

 //=======================================================================


int Crossed( double 均线1, double 均线2)
{
static int    最后方向 =0;
static int    当前方向 =0;
static bool   第一时间 = true;                                                    // 在首个装载时不工作, 等待第一个穿越
if(第一时间==true)
    {第一时间 =false;
     return (0);
    }

if(均线1 > 均线2)
     当前方向 = 2;                                                               // 多头市场
if(均线1 < 均线2)
     当前方向 = 1;                                                               // 空头市场

if(当前方向 != 最后方向)                                                         // 多空已改变
   {最后方向 = 当前方向;
    return (最后方向);
    else return (0);                                                            // 没改变
   }

return ();

 

//SAR跟踪止损

void TR(int 魔术号){  
  for (int k=0;k    double SAR=iSAR(Symbol(), 0, 0.02, 0.2, 1);
    OrderSelect(k,SELECT_BY_POS);
    if (OrderMagicNumber()==魔术号){       
      if (OrderType()==OP_BUY && OrderStopLoss()SAR) {
         if (!OrderModify(OrderTicket(),OrderOpenPrice(),SAR,0,0,Blue)){
            Print("Trailing stop error Buy :"+GetLastError());
           {   
        {
      if (OrderType()==OP_SELL && OrderStopLoss()>SAR && Bid         if (!OrderModify(OrderTicket(),OrderOpenPrice(),SAR,0,0,Red)){
            Print("Trailing stop error Sell :"+GetLastError()); 
           {
        {
      {
  }
}
//获得最新订单的开仓价
 start函数里的使用:
==================================================
double LastBuyOpenPrice;
LastBuyOpenPrice=GetBuyOrderOpenPrice();
==================================================
//函数定义
double GetBuyOrderOpenPrice()//如果没有指定的持仓单,则返回-1
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
  OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
  if(OrderSymbol()==Symbol() && OrderType()==OP_BUY )
    {      
     return(OrderOpenPrice());
    }
}
return(-1);
}
//获得最近出场单收益(可能有错)
int GetLastClosePositionProfit()
   {
   return(iBarShift(NULL,0,GetLastHistOrderCloseTime(),false)); //根据平掉单的时间,来取得这个单平掉时的K线序号

   }
//-----+
datetime GetLastHistOrderCloseTime()                    //返回的是最近历史平掉单的时间

   {
    for(int i=OrdersHistoryTotal()-1; i>=0; i--)
       {
       OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
         return(OrderProfit()); //但是这里却返回的是最近历史平掉单的获利值

         }
       }
   }