//+------------------------------------------------------------------+
//|
customFuction.mq4 |
//|
wangyu |
//|
http://wangyu204.taobao.com
|
//+------------------------------------------------------------------+
#property copyright "wangyu"
#property
link
"http://wangyu204.taobao.com"
#define MAGICNUM 20130205
extern double availableMarginRatio; //可用保证金比例
extern int slipPoints=3; //滑点
//+------------------------------------------------------------------+
//| expert initialization
function
|
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization
function
|
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start
function
|
//+------------------------------------------------------------------+
int start()
{
//----
createColorRec("rectangle1",High[2],Low[0],Red);
createText("text1",5,High[5],DoubleToStr(Ask,Digits));
writeText("Ask1",DoubleToStr(Ask,Digits),100,100,White,50);
createLine("line1",High[0],White);
//----
return(0);
}
//+------------------------------------------------------------------+
void createColorRec(string objName,double start,double end,color
clr) //画长方形
{
ObjectDelete(objName);
ObjectCreate(objName,OBJ_RECTANGLE,0,Time[2],start,Time[0],end);
ObjectSet(objName,OBJPROP_COLOR,clr);
ObjectSet(objName,OBJPROP_BACK,false);
ObjectSet(objName,OBJPROP_WIDTH,0);
ObjectSet(objName,OBJPROP_STYLE,0);
}
void createText(string objName,int i,double data,string str)
//画K线文字
{
if(ObjectFind(objName)!=0)
{
ObjectCreate(objName,OBJ_TEXT,0,Time[i],data);
ObjectSetText(objName,str,10,"Arial",DodgerBlue);
}else{
ObjectMove(objName,0,Time[i],data);
}
}
void writeText(string labelName,string text,int x,int y,color
colorValue,int fontSize)
{
ObjectDelete(labelName);
ObjectCreate(labelName,OBJ_LABEL,0,0,0);
ObjectSetText(labelName,text,fontSize,"Arial",colorValue);
ObjectSet(labelName,OBJPROP_CORNER,0);
ObjectSet(labelName,OBJPROP_XDISTANCE,x);
ObjectSet(labelName,OBJPROP_YDISTANCE,y);
}
void createLine(string objName,double data,color clr)
//画水平线
{
ObjectDelete(objName);
ObjectCreate(objName,OBJ_HLINE,0,D'2005.11.01 10:30',data);
ObjectSet(objName,OBJPROP_COLOR,clr);
}
//选用buy sell 函数下单
//1.同一标识不会重复下单
//2.止损止盈可以设置为0
//3.兼容有些平台 开单不能下止损的问题
int buy(double lots,int slippage,int stopLoss,int
stopProfit,string comment,int magic)
{
int ticket=0;
int findNum=0;
for(int i=0;i
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderComment()==comment &&
OrderMagicNumber()==magic)findNum++;}
}
if(findNum==0)//避免同一标识
重复下单
{
ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,slippage,0,0,comment,magic,0,Blue);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
{
double
stopLossValue=OrderOpenPrice()-stopLoss*Point;
double
stopProfitValue=OrderOpenPrice()+stopProfit*Point;
if(stopLoss==0)stopLossValue=0;
if(stopProfit==0)stopProfitValue=0;
if(OrderModify(OrderTicket(),OrderOpenPrice(),stopLossValue,stopProfitValue,0,White)==true)
{return(ticket);}
else{Print("OrderModify error ",GetLastError());}
}
}
}
return (0);
}
//+------------------------------------------------------------------+
int sell(double lots,int slippage,int stopLoss,int
stopProfit,string comment,int magic)
{
int ticket=0;
int findNum=0;
for(int i=0;i
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{if(OrderComment()==comment &&
OrderMagicNumber()==magic)findNum++;}
}
if(findNum==0)//避免同一标识
重复下单
{
ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,slippage,0,0,comment,magic,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
{
double
stopLossValue=OrderOpenPrice()+stopLoss*Point;
double
stopProfitValue=OrderOpenPrice()-stopProfit*Point;
if(stopLoss==0)stopLossValue=0;
if(stopProfit==0)stopProfitValue=0;
if(OrderModify(OrderTicket(),OrderOpenPrice(),stopLossValue,stopProfitValue,0,White)==true)
{return(ticket);}
else{Print("OrderModify error ",GetLastError());}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
//持仓成本计算(点数) 平均盈亏多少点
double averagePositionCostInPoint()
{
int j=0;
double tmp=0.0;
double tmpLot=0.0;
for(int i=0;i
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
j++;
tmp+=OrderOpenPrice()*OrderLots();
tmpLot+=OrderLots();
}
else{Print("订单选择失败:",GetLastError());}
}
if(tmpLot==0.0)return(999999);//特殊标记空仓
else
{return(NormalizeDouble((Close[0]-(tmp/tmpLot)),0));}
}
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//| Error functions
//+----------------------------------------------------------------------------+
string ErrorDescription(int code)
{
string error;
switch(code)
{
case
0:
case
1:error="no error";break;
case
2:error="common error";break;
case
3:error="invalid trade parameters";break;
case
4:error="trade server is busy";break;
case
5:error="old version of the client terminal";break;
case
6:error="no connection with trade server";break;
case
7:error="not enough rights";break;
case
8:error="too frequent requests";break;
case
9:error="malfunctional trade operation";break;
case
64:error="account disabled";break;
case
65:error="invalid account";break;
case
128:error="trade timeout";break;
case
129:error="invalid price";break;
case
130:error="invalid stops";break;
case
131:error="invalid trade volume";break;
case
132:error="market is closed";break;
case
133:error="trade is disabled";break;
case
134:error="not enough money";break;
case
135:error="price changed";break;
case
136:error="off quotes";break;
case
137:error="broker is busy";break;
case
138:error="requote";break;
case
139:error="order is locked";break;
case
140:error="long positions only allowed";break;
case
141:error="too many requests";break;
case
145:error="modification denied because order too close to
market";break;
case
146:error="trade context is busy";break;
case
4000:error="no error";break;
case
4001:error="wrong function pointer";break;
case
4002:error="array index is out of range";break;
case
4003:error="no memory for function call stack";break;
case
4004:error="recursive stack overflow";break;
case
4005:error="not enough stack for parameter";break;
case
4006:error="no memory for parameter string";break;
case
4007:error="no memory for temp string";break;
case
4008:error="not initialized string";break;
case
4009:error="not initialized string in array";break;
case
4010:error="no memory for array\' string";break;
case
4011:error="too long string";break;
case
4012:error="remainder from zero divide";break;
case
4013:error="zero divide";break;
case
4014:error="unknown command";break;
case
4015:error="wrong jump (never generated error)";break;
case
4016:error="not initialized array";break;
case
4017:error="dll calls are not allowed";break;
case
4018:error="cannot load library";break;
case
4019:error="cannot call function";break;
case
4020:error="expert function calls are not allowed";break;
case
4021:error="not enough memory for temp string returned from
function";break;
case
4022:error="system is busy (never generated error)";break;
case
4050:error="invalid function parameters count";break;
case
4051:error="invalid function parameter value";break;
case
4052:error="string function internal error";break;
case
4053:error="some array error";break;
case
4054:error="incorrect series array using";break;
case
4055:error="custom indicator error";break;
case
4056:error="arrays are incompatible";break;
case
4057:error="global variables processing error";break;
case
4058:error="global variable not found";break;
case
4059:error="function is not allowed in testing mode";break;
case
4060:error="function is not confirmed";break;
case
4061:error="send mail error";break;
case
4062:error="string parameter expected";break;
case
4063:error="integer parameter expected";break;
case
4064:error="double parameter expected";break;
case
4065:error="array as parameter expected";break;
case
4066:error="requested history data in update state";break;
case
4099:error="end of file";break;
case
4100:error="some file error";break;
case
4101:error="wrong file name";break;
case
4102:error="too many opened files";break;
case
4103:error="cannot open file";break;
case
4104:error="incompatible access to a file";break;
case
4105:error="no order selected";break;
case
4106:error="unknown symbol";break;
case
4107:error="invalid price parameter for trade function";break;
case
4108:error="invalid ticket";break;
case
4109:error="trade is not allowed";break;
case
4110:error="longs are not allowed";break;
case
4111:error="shorts are not allowed";break;
case
4200:error="object is already exist";break;
case
4201:error="unknown object property";break;
case
4202:error="object is not exist";break;
case
4203:error="unknown object type";break;
case
4204:error="no object name";break;
case
4205:error="object coordinates error";break;
case
4206:error="no specified subwindow";break;
default:error="unknown error";
}
return(error);
}
//+------------------------------------------------------------------+
double GetLotsHolding()//计算当前持仓总量
{
double tempLots=0.0;
for(int
i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol()
&& OrderMagicNumber()==MagicNum)
{tempLots+=OrderLots();}
}
else
{Print("订单选择失败:",GetLastError());}
}
return(tempLots);
}
//+------------------------------------------------------------------+
double GetOrderOpenPriceHolding() //计算当前Symbol最新持仓的开盘价
{
for(int
i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol()
&& OrderMagicNumber()==MagicNum)
{return(OrderOpenPrice());}
}
else
{Print("订单选择失败:",GetLastError());}
}
return(-1);
}
//+------------------------------------------------------------------+
int GetOrderTypeHolding() //没有持仓返回-1
从最近持仓单提取订单类型?
{
int type=-1;
for(int
i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol()
&& OrderMagicNumber()==MagicNum)
{return(OrderType());}
}
else
{Print("订单选择失败:",GetLastError());}
}
return(type);
}
//+------------------------------------------------------------------+
int GetOrderHoldingStartTimeK() //获取最后入场订单对应的K线序列
{
for(int
i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol())
{return(iBarShift(Symbol(),PERIOD_H1,OrderOpenTime(),false));}
}
else
{Print("订单选择失败:",GetLastError());}
}
return(-1);
}
//+------------------------------------------------------------------+
bool ClosePosition() //close all pending and holding
positions
{
bool Flag=true;
int
tick[200]={-1},cmp[200]={-1};
int j=0,i;
for(i=0;i
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol()
&& OrderMagicNumber()==MagicNum) //只过滤当前Symbol
可去掉 close所有的
{
j++;
tick[j]=OrderTicket();
cmp[j]=OrderType();
}
}
else
{Print("订单选择失败:",GetLastError());}
}
if(j!=0)
{
for(i=1;i<=j;i++)
{
if(OrderSelect(tick[i],SELECT_BY_TICKET)==true)
{
switch(cmp[i])
{
case OP_BUY:
if(OrderClose(tick[i],OrderLots(),Bid,slipPoints,CLR_NONE)==false)
Flag=false;
break;
case OP_SELL:
if(OrderClose(tick[i],OrderLots(),Ask,slipPoints,CLR_NONE)==false)
Flag=false;
break;
}
}
else
{Print("订单选择失败:",GetLastError());}
}
}
return(Flag);
}
//+------------------------------------------------------------------+
bool EntryMarketPrice(int type,int magic,double lot)
//市价入场函数
{
int ticket=-1;
bool result=false;
if(lot<=0)return(true);
switch(type)
{
case
OP_BUY:
ticket=OrderSend(Symbol(),type,lot,Ask,slipPoints,0,0,"",magic,0,CLR_NONE);
if(ticket<0)
{Print("多单市价入场失败 ",GetLastError());}
else
{result=true;}
break;
case
OP_SELL:
ticket=OrderSend(Symbol(),type,lot,Bid,slipPoints,0,0,"",magic,0,CLR_NONE);
if(ticket<0)
{Print("空单市价入场失败 ",GetLastError());}
else
{result=true;}
break;
}
return(result);
}
//+------------------------------------------------------------------+
int GetProfitOrdersNum() //计算盈利单个数
{
int check=0;
for(int i=0;i
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol()
&& OrderMagicNumber()==MagicNum)
{if(OrderProfit()>0) check++;}
}
else
{Print("订单选择失败:",GetLastError());}
}
return(check);
}
//+------------------------------------------------------------------+
int GetHoldingOrdersNum() //计算持仓单格数
{
int count=0;
for(int i=0;i
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol()
&& OrderMagicNumber()==MagicNum)
{count++;}
}
else
{Print("订单选择失败:",GetLastError());}
}
return(count);
}
//+------------------------------------------------------------------+
double CaculateLotsLimit() //按比例计算出可入场资金对应的手数
{
double
maxMargin=availableMarginRatio*(AccountMargin()+AccountFreeMargin());
double
maxLots=NormalizeDouble(maxMargin/(MarketInfo(Symbol(),MODE_LOTSIZE)/AccountLeverage()),2);
//Print("MagicNum=",MagicNum);
return(maxLots);
}
加载中,请稍候......