打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MT4自定义函数集
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<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<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
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
1.3.7函数的单调性与奇偶性
MT4编程入门
MT4编程入门11:MT4的报警
MT4编程实例:箭头符号
MT4编程初级手册(6):市场数据取值
初识EA编程及语言
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服