MT5当前品种持仓统计指标源码
本帖最后由 m1800 于 2024-7-22 18:45 编辑<font _mstmutation="1" _msttexthash="3642565182945" _msthash="240">#property 版权所有“https://fx8910.com
”#property 版本“2.2”
#property 说明“
#property 说明”QQ:14060258“
#property 说明”“
#property 说明”2023/09/06“
#property indicator_separate_window
#include < Trade\PositionInfo.mqh>
CPositionInfo m_position;交易头寸对象
datetime new_k=-1;
int cnt,mt=10;
int OnInit()
{
if(_Digits==3 || _Digits==5)
{
mt=10;
否则
{
mt=1;
int myWindowsHandle = WindowFindxt(MQLInfoString(MQL_PROGRAM_NAME));获取当前指标名称所在窗口序号
ObjectsDeleteAll(0,myWindowsHandle, OBJ_LABEL);
new_k=-1;
返回(0);
}
+------------------------------------------------------------------+
| |
+------------------------------------------------------------------+
int deinit()
{
int myWindowsHandle = WindowFindxt(MQLInfoString(MQL_PROGRAM_NAME)); //获取当前指标名称所在窗口序号
ObjectsDeleteAll(0,myWindowsHandle, OBJ_LABEL);
return(0);
}
+------------------------------------------------------------------+
| |
+------------------------------------------------------------------+
int WindowFindxt(string name)
{
if((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE) == PROGRAM_INDICATOR)
{
return(ChartWindowFind());
else
{
return(ChartWindowFind(0, name));
返回(-1);
}
/*
函 数:显示订单状态
输入参数:
输出参数:
*/
void iOrdersStatus()
{
清除标签
int myWindowsHandle = WindowFindxt(MQLInfoString(MQL_PROGRAM_NAME)); //获取当前指标名称所在窗口序号
int myBuyOrder_y = 40;
int mySellOrder_y = 40;
double myBuyLots=0, mySellLots=0, myBuyProfit=0, mySellProfit=0,myBuyPoint=0,mySellPoint=0;
双倍 myBuyLossRate=0, mySellLossRate=0, myTotalLossRate=0;亏损率
int myBuyOrders=0, mySellOrders=0;
显示持仓单信息:单号 盈亏
if(PositionsTotal() > 0)
{
for(cnt = 0; cnt <=PositionsTotal()-1; cnt++)
{
if(m_position.SelectByIndex(cnt) &&m_position。符号() == _Symbol)
{
if(m_position.PositionType() ==POSITION_TYPE_BUY/*||OrderType() == OP_BUYLIMIT*/)
{
string tp=DoubleToString(fabs(m_position.PriceOpen()- m_position。止盈())/_Point/吨,0);
string sl=DoubleToString(fabs(m_position.PriceOpen()- m_position。止损())/_Point/mt,0);
iDisplayInfo(m_position.Ticket()、m_position。Ticket()+“ ”+DoubleToString(m_position.Volume(), 2)+“ ”+DoubleToString(m_position.profit(), 2)+“ TP:”+tp+“ SL:”+sl, 1, 20, myBuyOrder_y, 10, “Arial”, iObjectColor(m_position.利润()));
myBuyOrder_y = myBuyOrder_y + 15;
myBuyLots = myBuyLots + m_position。音量();
myBuyProfit = myBuyProfit + m_position。利润();
我的买盘 = 我的买盘 + 1;
我的购买点 = myBuyPoint+NormalizeDouble((SymbolInfoDouble(NULL,SYMBOL_BID)-m_position。PriceOpen())/_Point/mt,1);
}
if(m_position.PositionType() == POSITION_TYPE_SELL/*||OrderType() == OP_SELLLIMIT*/)
{
string tpx=DoubleToString(fabs(m_position.PriceOpen()- m_position。止盈())/_Point/吨,0);
string slx=DoubleToString(fabs(m_position.PriceOpen()- m_position。止损())/_Point/mt,0);
iDisplayInfo(m_position.Ticket()、m_position。Ticket()+“ ”+DoubleToString(m_position.Volume(), 2)+“ ”+DoubleToString(m_position.Profit(), 2)+“ TP:”+tpx+“ SL:”+slx, 1, 280, mySellOrder_y, 10, “Arial”, iObjectColor(m_position.利润()));
mySellOrder_y = mySellOrder_y + 15;
mySellLots = mySellLots + m_position。音量();
mySellProfit = mySellProfit + m_position。利润();
我的卖出订单 = 我的卖出订单 + 1;
mySellPoint = mySellPoint+NormalizeDouble((m_position.PriceOpen()-SymbolInfoDouble(NULL,SYMBOL_ASK))/_Point/mt,1);
}
}
}
//AccountBalance()
double myTotalLots = myBuyLots + mySellLots;
双倍 myTotalProfit = myBuyProfit + mySellProfit;
double myTotalPoint=mySellPoint+myBuyPoint;
int myTotalOrders = myBuyOrders + mySellOrders;
if(myBuyLots != 0)
myBuyLossRate = 100*(myBuyProfit/AccountInfoDouble(ACCOUNT_BALANCE));
if(mySellLots != 0)
mySellLossRate = 100*(mySellProfit/AccountInfoDouble(ACCOUNT_BALANCE));
if(myTotalLots != 0)
myTotalLossRate = 100*(myTotalProfit/AccountInfoDouble(ACCOUNT_BALANCE));
if(myBuyOrders+mySellOrders>0)
iDisplayInfo(“INDSymbol”, _Symbol+“ ”+myTotalOrders+“ ”+DoubleToString(myTotalLots, 2)+“ 手, $”+DoubleToString(myTotalProfit, 2)+“, ”+DoubleToString(myTotalPoint/(myBuyOrders+mySellOrders),1)+“点,”+“ ”+DoubleToString(myTotalLossRate, 2)+“%”, 1, 50, 1, 12, “Arial Bold”, DodgerBlue);
//按买卖单显示持仓量、盈亏
if (myBuyOrders>0) iDisplayInfo(_Symbol+“BUY”, myBuyOrders+“ ”+DoubleToString(myBuyLots, 2)+“ ”+DoubleToString(myBuyProfit, 2)+“ ”+DoubleToString(myBuyLossRate, 2)+“%”, 1, 20, 20, 10, “Arial”, iObjectColor(myBuyProfit));
if (mySellOrders>0) iDisplayInfo(_Symbol+“SELL”, mySellOrders+“ ”+DoubleToString(mySellLots, 2)+“ ”+DoubleToString(mySellProfit, 2)+“ ”+DoubleToString(mySellLossRate, 2)+“%”, 1, 280, 20, 10, “Arial”, iObjectColor(mySellProfit));
}
返回;
}
/*
函 数:在屏幕上显示文字标签
输入参数:string LableName 标签名称,如果显示多个文本,名称不能相同
string LableDoc 文本内容
int Corner 文本显示角
int LableX 标签X位置坐标
int LableY 标签Y位置坐标
int DocSize 文本字号
string DocStyle 文本字体
color DocColor 文本颜色
输出参数:在指定的位置(X,Y)按照指定的字号、字体及颜色显示指定的文本
算法说明:
*/
void iDisplayInfo(string LableName,string LableDoc,int Corner,int LableX,int LableY,int DocSize,string DocStyle,color DocColor)
{
int myWindowsHandle= WindowFindxt(MQLInfoString(MQL_PROGRAM_NAME));
if (ObjectFind(myWindowsHandle,LableName)<0)
{
ObjectCreate(0,LableName, OBJ_LABEL, myWindowsHandle, 0, 0);<b1137> }
ObjectSetTextxt(LableName, LableDoc, DocSize, DocStyle,DocColor);
--- 设置相对于定义点坐标的图表的角
//ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
ObjectSetInteger(0,LableName, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
--- 设置定位类型
ObjectSetInteger(0,LableName,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
ObjectSetInteger(0,LableName, OBJPROP_XDISTANCE, LableX);
ObjectSetInteger(0,LableName, OBJPROP_YDISTANCE, LableY);
返回;
}
/*
函 数:物件颜色
输入参数:数值
输出参数:颜色
算 法:负数为红色,正数为绿色,0为灰色
*/
color iObjectColor(double myInput)
{
color myColor=clrGreen;
if(myInput > 0)
myColor = Green; //正数颜色为绿色
if(myInput < 0)
myColor = Red; //负数颜色为红色
if(myInput == 0)
myColor = 深灰色;0颜色为灰色
return(myColor);
}
+------------------------------------------------------------------+
| |
+------------------------------------------------------------------+
int OnCalculate(const int rates_total, // 当前分时时的历史柱数
const int prev_calculated,// 上一个分时时的历史柱线数量
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
if (new_k!=iTime(NULL,0,0))
{
int myWindowsHandle = WindowFindxt(MQLInfoString(MQL_PROGRAM_NAME)); //获取当前指标名称所在窗口序号
ObjectsDeleteAll(0,myWindowsHandle, OBJ_LABEL);
// Print(“aaaa”);
new_k=iTime(NULL,0,0);
}
iOrdersStatus();
返回(rates_total);
}
+------------------------------------------------------------------+
| |
+------------------------------------------------------------------+
bool ObjectSetxt(string object_name, int index, double value)
{
switch(index)
{
case 0: // OBJPROP_TIME1
return(ObjectSetInteger(0, object_name, OBJPROP_TIME, (int)value));
case 1: // OBJPROP_PRICE1
return(ObjectSetDouble(0, object_name, OBJPROP_PRICE, value));
case 2: // OBJPROP_TIME2
return(ObjectSetInteger(0, object_name, OBJPROP_TIME, 1, (int)value));
case 3: // OBJPROP_PRICE2
return(ObjectSetDouble(0, object_name, OBJPROP_PRICE, 1, value));
案例 4: // OBJPROP_TIME3
return(ObjectSetInteger(0, object_name, OBJPROP_TIME, 2, (int)value));
case 5: // OBJPROP_PRICE3
return(ObjectSetDouble(0, object_name, OBJPROP_PRICE, 2, value));
case 6: // OBJPROP_COLOR
return(ObjectSetInteger(0, object_name, OBJPROP_COLOR, (int)value));
案例 7: // OBJPROP_STYLE
return(ObjectSetInteger(0, object_name, OBJPROP_STYLE, (int)value));
case 8: // OBJPROP_WIDTH
return(ObjectSetInteger(0, object_name, OBJPROP_WIDTH, (int)value));
case 9: // OBJPROP_BACK
return(ObjectSetInteger(0, object_name, OBJPROP_BACK, (int)value));
case 10: // OBJPROP_RAY
return(ObjectSetInteger(0, object_name, OBJPROP_RAY_RIGHT, (int)value));
case 11: // OBJPROP_ELLIPSE
return(ObjectSetInteger(0, object_name, OBJPROP_ELLIPSE, (int)value));
case 12: // OBJPROP_SCALE
return(ObjectSetDouble(0, object_name, OBJPROP_SCALE, value));
case 13: // OBJPROP_ANGLE
return(ObjectSetDouble(0, object_name, OBJPROP_ANGLE, value));
case 14: // OBJPROP_ARROWCODE
return(ObjectSetInteger(0, object_name, OBJPROP_ARROWCODE, (int)value));
case 15: // OBJPROP_TIMEFRAMES
return(ObjectSetInteger(0, object_name, OBJPROP_TIMEFRAMES, (int)value));
case 16: // OBJPROP_DEVIATION
return(ObjectSetDouble(0, object_name, OBJPROP_DEVIATION, value));
case 100: // OBJPROP_FONTSIZE
return(ObjectSetInteger(0, object_name, OBJPROP_FONTSIZE, (int)value));
case 101: // OBJPROP_CORNER
return(ObjectSetInteger(0, object_name, OBJPROP_CORNER, (int)value));
case 102: // OBJPROP_XDISTANCE
return(ObjectSetInteger(0, object_name, OBJPROP_XDISTANCE, (int)value));
case 103: // OBJPROP_YDISTANCE
return(ObjectSetInteger(0, object_name, OBJPROP_YDISTANCE, (int)value));
case 200: // OBJPROP_FIBOLEVELS
return(ObjectSetInteger(0, object_name, OBJPROP_LEVELS, (int)value));
case 201: // OBJPROP_LEVELCOLOR
return(ObjectSetInteger(0, object_name, OBJPROP_LEVELCOLOR, (int)value));
case 202: // OBJPROP_LEVELSTYLE
return(ObjectSetInteger(0, object_name, OBJPROP_LEVELSTYLE, (int)value));
case 203: // OBJPROP_LEVELWIDTH
return(ObjectSetInteger(0, object_name, OBJPROP_LEVELWIDTH, (int)value));
}
返回(false);
}
+------------------------------------------------------------------+
| |
+------------------------------------------------------------------+
bool ObjectSetTextxt(string object_name, string text, int font_size=0, string font_name=NULL, color text_color=clrNONE)
{
int type = (int)ObjectGetInteger(0, object_name, OBJPROP_TYPE);
if(type != OBJ_LABEL &&; type != OBJ_TEXT)
{
return(false);
if(StringLen(text) > 0 && font_size > 0)
{
if(!ObjectSetString(0, object_name, OBJPROP_TEXT, text))
{
return(false);
如果(!ObjectSetInteger(0, object_name, OBJPROP_FONTSIZE, font_size))
{
return(false);
}
if(font_name != NULL)
{
if(!ObjectSetString(0, object_name, OBJPROP_FONT, font_name))
{
return(false);
}
if(text_color != clrNONE)
{
if(!ObjectSetInteger(0, object_name, OBJPROP_COLOR, text_color))
{
return(false);
}
return(true);</font>
}
//+------------------------------------------------------------------+
MT5当前品种持仓统计指标,可与面板或其它副图指标叠加使用.
谢谢 谢谢 支持下
页:
[1]