MT4自定义函数集[复制链接]冰刀日内交易者系统化交易
果果
939723747
威望
143904
注册时间
2008-5-29
串个门加好友打招呼发消息电梯直达
楼主发表于 2012-1-14 12:01:58 |
只看该作者 |
倒序浏览外部可被调用的文件分成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 <OrdersTotal(); 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<OrdersTotal(); 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<OrdersTotal(); 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); } } } //全部平仓
bool ClosePosition() // { bool Flag = true; int tick[200], tp[200]; int j = 0; for( int i =0; i <OrdersTotal(); i++) { OrderSelect( i, SELECT_BY_POS, MODE_TRADES ); if( OrderSymbol() ==Symbol() & (OrderMagicNumber() ==MagicHunDun) ) { j = j +1; tick[j] = OrderTicket(); tp[j] = OrderType(); } } if ( j != 0) { for( i =1; i <=j; i++) { OrderSelect( tick, SELECT_BY_TICKET); switch( tp[ i ] ) { case OP_BUY: if( OrderClose( tick[ i ], OrderLots(), Bid, 3 ,CLR_NONE ) ==false ) Flag =false; break; case OP_SELL: if( OrderClose( tick, OrderLots(), Ask, 3, CLR_NONE ) ==false ) Flag =false; break; } } } 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()<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);
}
//判断均线交叉函数
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]<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);
}
//移动止损
void tr(int magic, int 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&lt;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&lt;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<OrdersTotal();k++){
double SAR=iSAR(Symbol(), 0, 0.02, 0.2, 1);
OrderSelect(k,SELECT_BY_POS);
if (OrderMagicNumber()==魔术号){
if (OrderType()==OP_BUY && OrderStopLoss()<SAR && Ask>SAR) {
if (!OrderModify(OrderTicket(),OrderOpenPrice(),SAR,0,0,Blue)){
Print("Trailing stop error Buy :"+GetLastError());
{
{
if (OrderType()==OP_SELL && OrderStopLoss()>SAR && Bid<SAR) {
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()); //但是这里却返回的是最近历史平掉单的获利值
}
}
}
本主题由 fghbb 于 2012-4-19 05:45:22 审核通过分享0收藏0支持0反对0