1、MT4自定义函数库.ex4为函数库文件。下载后存放在mt4安装文件夹下的experts\libraries文件夹下。
2、自定义函数调用.mqh为包含文件。下载后存放在mt4安装文件夹下的experts\include文件夹下。
3、调用时只需要在指标或EA文件开始位置插入下面一行语句
#include <自定义函数调用.mqh>
如下图:
有什么问题请在下面的帖子中提出
自定义函数库跟踪贴
我尽量做,但时间精力有限,不知道能不能跟踪下去。
也希望各位高手提供您的自定义函数,共同来完善这个自定义函数库。
[ 本帖最后由 xfxyldj 于 2008-9-3 18:04 编辑 ]
MT4自定义函数库.ex4
(2008-04-03 11:57:02, Size: 2.45 KB, Downloads: 67)
自定义函数调用.mqh
(2008-04-03 11:57:02, Size: 1.19 KB, Downloads: 61)
MT4自定义函数库.mq4
(2008-09-03 18:04:04, Size: 2.5 KB, Downloads: 1)



最新回复
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 编辑 ]
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函数类似
CODE:
//+------------------------------------------------------------------+//| 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);
}
CODE:
//+------------------------------------------------------------------+[ 本帖最后由 xfxyldj 于 2008-9-3 18:07 编辑 ]//| 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);
}
在窗口的任意位置添加文字标签。以窗口像素点坐标来定位。
各参数意义:
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 ”的红色文字标签。
CODE:
void drawLabel(string name,int Win_idx,string LABEL,int X, int Y,color Color)[ 本帖最后由 xfxyldj 于 2008-9-3 18:06 编辑 ]{
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);
}
根据MAGIC编号和订单类型,查找相应订单,并返回订单编号(ticket)
如果没有找到返回0;
CODE:
//+------------------------------------------------------------------+//| 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);
}
检查以MAGIC标记的当前图表的以成交订单。当盈利点数大于一定值(MOVE)的时候,移动止损价格。每次移动STEP点数。
三个参数均为整数。不论成功与否均返回0;
CODE:
//+------------------------------------------------------------------+//| _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);
}
判断两条均线的交叉状态。
PX :判断的周期。0为不限制,以图表当前为准
F :快线(小周期)均线周期
S :慢线(大周期)军线周期
MODE:均线类型
PR :均线运算价格类型
j :平移
返回值意义:
1 :金叉
-1:死叉
0 :当前未有交叉。
CODE:
//+------------------------------------------------------------------+
//| 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);
}