发新话题
打印

MT4自定义函数库

本主题由 xfxyldj 于 2008-9-3 18:13 合并

MT4自定义函数库

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


有什么问题请在下面的帖子中提出
自定义函数库跟踪贴
我尽量做,但时间精力有限,不知道能不能跟踪下去。
也希望各位高手提供您的自定义函数,共同来完善这个自定义函数库。

[ 本帖最后由 xfxyldj 于 2008-9-3 18:04 编辑 ]

附件

MT4自定义函数库.ex4 (2.45 KB)

2008-4-3 11:57, 下载次数: 82

自定义函数调用.mqh (1.19 KB)

2008-4-3 11:57, 下载次数: 75

MT4自定义函数库.mq4 (2.5 KB)

2008-9-3 18:04, 下载次数: 16

TOP

现有函数列表
1、double  HH(int MODE,int N,double ARRAY[]);
求N周期K线价格(或数组变量中)的最大值
2、double  LL(int MODE,int N,double ARRAY[]);
求N周期K线价格(或数组变量中)的最小值
3、void drawLabel(string name,int Win_idx,string LABEL,int X, int Y,color Color);
在图表的任意位置创建文字标签(以窗口像素坐标定位)

[ 本帖最后由 xfxyldj 于 2008-4-3 11:55 编辑 ]

TOP

HH 及LL函数说明

double  HH(int MODE,int N,double ARRAY[]);
int MODE             参数  MODE=0 (求K线最高价的最大值)
                     MODE=1 (求ARRAY[])数组中的最大值)
int N                     参数  周期数,例:N=30 求30周期内的最大。
double ARRAY[] 参数  数据源数组名称 当MODE=0是随便定一个以空数组就可以了。
调用方式:
例1 : double   H=HH(0,30,a);求最近30条K线的最高价。
例12: double   H=HH(1,30,a);求a数组中a[0]到a[29]中的最大值。
LL函数类似
复制内容到剪贴板
代码:
//+------------------------------------------------------------------+
//| HH function                                                      |
//+------------------------------------------------------------------+
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);
  }
复制内容到剪贴板
代码:
//+------------------------------------------------------------------+
//| LL function                                                      |
//+------------------------------------------------------------------+
double  LL(int MODE,int N,double ARRAY[])
  {
    double L;
    switch(MODE)
    {
      case 0:
        L=Low[iLowest(NULL,0,MODE_LOW,N,0)];
        break;
      case 1:
        L=ARRAY[ArrayMinimum(ARRAY,N,0)];
        break;
      default:
        L=Low[iLowest(NULL,0,MODE_LOW,N,0)];
        break;
    }
    return(L);
  }
[ 本帖最后由 xfxyldj 于 2008-9-3 18:07 编辑 ]

TOP

drawLabel函数使用说明

void drawLabel(string name,int Win_idx,string LABEL,int X, int Y,color Color)
在窗口的任意位置添加文字标签。以窗口像素点坐标来定位。
各参数意义:
string name   文字标签的名字,字符串变量或常量。
int Win_idx   文字标签放置的窗口索引。主窗口为0,副窗口为1开始的整数,1、2、3等
string LABEL  文字标签的内容,字符串变量或常量。
int X         文字标签存放的位置横坐标,以窗口的左边界向右计算的像素点数
int Y         文字标签存放的位置纵坐标,以窗口的上边界向下计算的像素点数
color Color   文字标签的字体颜色
调用举例:
drawLabel("当前买入价格",0,"当前买入价格:"+Ask,300, 100,Red);
在指标中添加这一行。将会在距离窗口左边界300像素点距离窗口上边界100像素点的位置创建一个名称为“当前买入价格”显示内容为“当前买入价格:1.5460 ”的红色文字标签。
复制内容到剪贴板
代码:
void drawLabel(string name,int Win_idx,string LABEL,int X, int Y,color Color)
  {
   if (ObjectFind(name) == Win_idx)
   {
     ObjectSetText(name,LABEL,9, "Verdana", Color);
     ObjectSet(name, OBJPROP_XDISTANCE, X);
     ObjectSet(name, OBJPROP_YDISTANCE, Y);
   }
   else
   {
     ObjectDelete(name);
     ObjectCreate(name, OBJ_LABEL, Win_idx, 0, 0);
     ObjectSetText(name,LABEL,9, "Verdana", Color);
     ObjectSet(name, OBJPROP_XDISTANCE, X);
     ObjectSet(name, OBJPROP_YDISTANCE, Y);
   }
    return(0);
  }
[ 本帖最后由 xfxyldj 于 2008-9-3 18:06 编辑 ]

TOP

订单查询函数

功能:
根据MAGIC编号和订单类型,查找相应订单,并返回订单编号(ticket)
如果没有找到返回0;
复制内容到剪贴板
代码:
//+------------------------------------------------------------------+
//| SearchOrder 订单查询 函数                                        |
//+------------------------------------------------------------------+
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);
  }

TOP

移动止损函数

功能:
检查以MAGIC标记的当前图表的以成交订单。当盈利点数大于一定值(MOVE)的时候,移动止损价格。每次移动STEP点数。
三个参数均为整数。不论成功与否均返回0;
复制内容到剪贴板
代码:
//+------------------------------------------------------------------+
//| _MoveStop 移动止损函数 function                                               |
//+------------------------------------------------------------------+
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()<MoveStopPrice)
         {
           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 (MoveStopPrice<OrderOpenPrice() && OrderStopLoss()>MoveStopPrice)
         {
           if(!OrderModify(OrderTicket(),OrderOpenPrice(),MoveStopPrice-STEP*Point,OrderTakeProfit(),OrderExpiration()))
           {
             Alert("MoveStop_OrderModify Error #",GetLastError());
             return(-1);
           }
         }
         break;
       }
       default: break;
     }
   }
//----
   return(0);
  }

TOP

均线交叉判断函数

功能:
判断两条均线的交叉状态。
PX  :判断的周期。0为不限制,以图表当前为准
F   :快线(小周期)均线周期
S   :慢线(大周期)军线周期
MODE:均线类型
PR  :均线运算价格类型
j   :平移

返回值意义:
1 :金叉
-1:死叉
0 :当前未有交叉。
复制内容到剪贴板
代码:
//+------------------------------------------------------------------+
//| MAX 均线交叉 function                                                 |
//+------------------------------------------------------------------+
int MAX (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]<MAS[1]) i=1;
   if (MAF[0]<MAS[0]  &&  MAF[1]>MAS[1]) i=-1;
   if (MAF[0]>MAS[0]  &&  MAF[1]==MAS[1]  &&  MAF[2]<MAS[2]) i=1;
   if (MAF[0]<MAS[0]  &&  MAF[1]==MAS[1]  &&  MAF[2]>MAS[2]) i=-1;
   
//----
   return(i);
  }

TOP

发新话题