3评论

4收藏

MT5当前品种持仓统计指标源码

avatar m1800 | 1569 人阅读 | 3 人评论 | 2024-07-22

本帖最后由 m1800 于 2024-7-22 18:45 编辑
  1. <font _mstmutation="1" _msttexthash="3642565182945" _msthash="240">#property 版权所有“https://fx8910.com
  2. ”#property 版本“2.2”
  3. #property 说明“
  4. #property 说明”QQ:14060258“
  5. #property 说明”“
  6. #property 说明”2023/09/06“
  7. #property indicator_separate_window
  8. #include < Trade\PositionInfo.mqh>
  9. CPositionInfo m_position;交易头寸对象
  10. datetime new_k=-1;
  11. int cnt,mt=10;
  12. int OnInit()
  13. {
  14. if(_Digits==3 || _Digits==5)
  15. {
  16. mt=10;

  17. 否则
  18. {
  19. mt=1;

  20. int myWindowsHandle = WindowFindxt(MQLInfoString(MQL_PROGRAM_NAME));获取当前指标名称所在窗口序号
  21. ObjectsDeleteAll(0,myWindowsHandle, OBJ_LABEL);
  22. new_k=-1;
  23. 返回(0);
  24. }
  25. +------------------------------------------------------------------+
  26. | |
  27. +------------------------------------------------------------------+
  28. int deinit()
  29. {
  30. int myWindowsHandle = WindowFindxt(MQLInfoString(MQL_PROGRAM_NAME)); //获取当前指标名称所在窗口序号
  31. ObjectsDeleteAll(0,myWindowsHandle, OBJ_LABEL);
  32. return(0);
  33. }

  34. +------------------------------------------------------------------+
  35. | |
  36. +------------------------------------------------------------------+
  37. int WindowFindxt(string name)
  38. {
  39. if((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE) == PROGRAM_INDICATOR)
  40. {
  41. return(ChartWindowFind());

  42. else
  43. {
  44. return(ChartWindowFind(0, name));


  45. 返回(-1);
  46. }


  47. /*
  48. 函 数:显示订单状态
  49. 输入参数:
  50. 输出参数:
  51. */
  52. void iOrdersStatus()
  53. {
  54. 清除标签
  55. int myWindowsHandle = WindowFindxt(MQLInfoString(MQL_PROGRAM_NAME)); //获取当前指标名称所在窗口序号
  56. int myBuyOrder_y = 40;
  57. int mySellOrder_y = 40;
  58. double myBuyLots=0, mySellLots=0, myBuyProfit=0, mySellProfit=0,myBuyPoint=0,mySellPoint=0;
  59. 双倍 myBuyLossRate=0, mySellLossRate=0, myTotalLossRate=0;亏损率
  60. int myBuyOrders=0, mySellOrders=0;
  61. 显示持仓单信息:单号 盈亏
  62. if(PositionsTotal() > 0)
  63. {
  64. for(cnt = 0; cnt <=PositionsTotal()-1; cnt++)
  65. {
  66. if(m_position.SelectByIndex(cnt) &&m_position。符号() == _Symbol)
  67. {
  68. if(m_position.PositionType() ==POSITION_TYPE_BUY/*||OrderType() == OP_BUYLIMIT*/)
  69. {
  70. string tp=DoubleToString(fabs(m_position.PriceOpen()- m_position。止盈())/_Point/吨,0);
  71. string sl=DoubleToString(fabs(m_position.PriceOpen()- m_position。止损())/_Point/mt,0);
  72. 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.利润()));
  73. myBuyOrder_y = myBuyOrder_y + 15;
  74. myBuyLots = myBuyLots + m_position。音量();
  75. myBuyProfit = myBuyProfit + m_position。利润();
  76. 我的买盘 = 我的买盘 + 1;
  77. 我的购买点 = myBuyPoint+NormalizeDouble((SymbolInfoDouble(NULL,SYMBOL_BID)-m_position。PriceOpen())/_Point/mt,1);
  78. }
  79. if(m_position.PositionType() == POSITION_TYPE_SELL/*||OrderType() == OP_SELLLIMIT*/)
  80. {
  81. string tpx=DoubleToString(fabs(m_position.PriceOpen()- m_position。止盈())/_Point/吨,0);
  82. string slx=DoubleToString(fabs(m_position.PriceOpen()- m_position。止损())/_Point/mt,0);
  83. 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.利润()));
  84. mySellOrder_y = mySellOrder_y + 15;
  85. mySellLots = mySellLots + m_position。音量();
  86. mySellProfit = mySellProfit + m_position。利润();
  87. 我的卖出订单 = 我的卖出订单 + 1;
  88. mySellPoint = mySellPoint+NormalizeDouble((m_position.PriceOpen()-SymbolInfoDouble(NULL,SYMBOL_ASK))/_Point/mt,1);
  89. }
  90. }

  91. }
  92. //AccountBalance()
  93. double myTotalLots = myBuyLots + mySellLots;
  94. 双倍 myTotalProfit = myBuyProfit + mySellProfit;
  95. double myTotalPoint=mySellPoint+myBuyPoint;
  96. int myTotalOrders = myBuyOrders + mySellOrders;
  97. if(myBuyLots != 0)
  98. myBuyLossRate = 100*(myBuyProfit/AccountInfoDouble(ACCOUNT_BALANCE));
  99. if(mySellLots != 0)
  100. mySellLossRate = 100*(mySellProfit/AccountInfoDouble(ACCOUNT_BALANCE));
  101. if(myTotalLots != 0)
  102. myTotalLossRate = 100*(myTotalProfit/AccountInfoDouble(ACCOUNT_BALANCE));
  103. if(myBuyOrders+mySellOrders>0)
  104. 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);
  105. //按买卖单显示持仓量、盈亏
  106. if (myBuyOrders>0) iDisplayInfo(_Symbol+“BUY”, myBuyOrders+“ ”+DoubleToString(myBuyLots, 2)+“ ”+DoubleToString(myBuyProfit, 2)+“ ”+DoubleToString(myBuyLossRate, 2)+“%”, 1, 20, 20, 10, “Arial”, iObjectColor(myBuyProfit));
  107. if (mySellOrders>0) iDisplayInfo(_Symbol+“SELL”, mySellOrders+“ ”+DoubleToString(mySellLots, 2)+“ ”+DoubleToString(mySellProfit, 2)+“ ”+DoubleToString(mySellLossRate, 2)+“%”, 1, 280, 20, 10, “Arial”, iObjectColor(mySellProfit));
  108. }
  109. 返回;
  110. }
  111. /*
  112. 函 数:在屏幕上显示文字标签
  113. 输入参数:string LableName 标签名称,如果显示多个文本,名称不能相同
  114. string LableDoc 文本内容
  115. int Corner 文本显示角
  116. int LableX 标签X位置坐标
  117. int LableY 标签Y位置坐标
  118. int DocSize 文本字号
  119. string DocStyle 文本字体
  120. color DocColor 文本颜色
  121. 输出参数:在指定的位置(X,Y)按照指定的字号、字体及颜色显示指定的文本
  122. 算法说明:
  123. */
  124. void iDisplayInfo(string LableName,string LableDoc,int Corner,int LableX,int LableY,int DocSize,string DocStyle,color DocColor)
  125. {
  126. int myWindowsHandle= WindowFindxt(MQLInfoString(MQL_PROGRAM_NAME));
  127. if (ObjectFind(myWindowsHandle,LableName)<0)
  128. {
  129. ObjectCreate(0,LableName, OBJ_LABEL, myWindowsHandle, 0, 0);<b1137> }
  130. ObjectSetTextxt(LableName, LableDoc, DocSize, DocStyle,DocColor);

  131. --- 设置相对于定义点坐标的图表的角
  132. //ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
  133. ObjectSetInteger(0,LableName, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
  134. --- 设置定位类型
  135. ObjectSetInteger(0,LableName,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
  136. ObjectSetInteger(0,LableName, OBJPROP_XDISTANCE, LableX);
  137. ObjectSetInteger(0,LableName, OBJPROP_YDISTANCE, LableY);
  138. 返回;
  139. }

  140. /*
  141. 函 数:物件颜色
  142. 输入参数:数值
  143. 输出参数:颜色
  144. 算 法:负数为红色,正数为绿色,0为灰色
  145. */
  146. color iObjectColor(double myInput)
  147. {
  148. color myColor=clrGreen;
  149. if(myInput > 0)
  150. myColor = Green; //正数颜色为绿色
  151. if(myInput < 0)
  152. myColor = Red; //负数颜色为红色
  153. if(myInput == 0)
  154. myColor = 深灰色;0颜色为灰色
  155. return(myColor);
  156. }
  157. +------------------------------------------------------------------+
  158. | |
  159. +------------------------------------------------------------------+
  160. int OnCalculate(const int rates_total, // 当前分时时的历史柱数
  161. const int prev_calculated,// 上一个分时时的历史柱线数量
  162. const datetime &time[],
  163. const double &open[],
  164. const double &high[],
  165. const double &low[],
  166. const double &close[],
  167. const long &tick_volume[],
  168. const long &volume[],
  169. const int &spread[])
  170. {
  171. if (new_k!=iTime(NULL,0,0))
  172. {
  173. int myWindowsHandle = WindowFindxt(MQLInfoString(MQL_PROGRAM_NAME)); //获取当前指标名称所在窗口序号
  174. ObjectsDeleteAll(0,myWindowsHandle, OBJ_LABEL);
  175. // Print(“aaaa”);
  176. new_k=iTime(NULL,0,0);
  177. }
  178. iOrdersStatus();
  179. 返回(rates_total);
  180. }
  181. +------------------------------------------------------------------+
  182. | |
  183. +------------------------------------------------------------------+
  184. bool ObjectSetxt(string object_name, int index, double value)
  185. {
  186. switch(index)
  187. {
  188. case 0: // OBJPROP_TIME1
  189. return(ObjectSetInteger(0, object_name, OBJPROP_TIME, (int)value));
  190. case 1: // OBJPROP_PRICE1
  191. return(ObjectSetDouble(0, object_name, OBJPROP_PRICE, value));
  192. case 2: // OBJPROP_TIME2
  193. return(ObjectSetInteger(0, object_name, OBJPROP_TIME, 1, (int)value));
  194. case 3: // OBJPROP_PRICE2
  195. return(ObjectSetDouble(0, object_name, OBJPROP_PRICE, 1, value));
  196. 案例 4: // OBJPROP_TIME3
  197. return(ObjectSetInteger(0, object_name, OBJPROP_TIME, 2, (int)value));
  198. case 5: // OBJPROP_PRICE3
  199. return(ObjectSetDouble(0, object_name, OBJPROP_PRICE, 2, value));
  200. case 6: // OBJPROP_COLOR
  201. return(ObjectSetInteger(0, object_name, OBJPROP_COLOR, (int)value));
  202. 案例 7: // OBJPROP_STYLE
  203. return(ObjectSetInteger(0, object_name, OBJPROP_STYLE, (int)value));
  204. case 8: // OBJPROP_WIDTH
  205. return(ObjectSetInteger(0, object_name, OBJPROP_WIDTH, (int)value));
  206. case 9: // OBJPROP_BACK
  207. return(ObjectSetInteger(0, object_name, OBJPROP_BACK, (int)value));
  208. case 10: // OBJPROP_RAY
  209. return(ObjectSetInteger(0, object_name, OBJPROP_RAY_RIGHT, (int)value));
  210. case 11: // OBJPROP_ELLIPSE
  211. return(ObjectSetInteger(0, object_name, OBJPROP_ELLIPSE, (int)value));
  212. case 12: // OBJPROP_SCALE
  213. return(ObjectSetDouble(0, object_name, OBJPROP_SCALE, value));
  214. case 13: // OBJPROP_ANGLE
  215. return(ObjectSetDouble(0, object_name, OBJPROP_ANGLE, value));
  216. case 14: // OBJPROP_ARROWCODE
  217. return(ObjectSetInteger(0, object_name, OBJPROP_ARROWCODE, (int)value));
  218. case 15: // OBJPROP_TIMEFRAMES
  219. return(ObjectSetInteger(0, object_name, OBJPROP_TIMEFRAMES, (int)value));
  220. case 16: // OBJPROP_DEVIATION
  221. return(ObjectSetDouble(0, object_name, OBJPROP_DEVIATION, value));
  222. case 100: // OBJPROP_FONTSIZE
  223. return(ObjectSetInteger(0, object_name, OBJPROP_FONTSIZE, (int)value));
  224. case 101: // OBJPROP_CORNER
  225. return(ObjectSetInteger(0, object_name, OBJPROP_CORNER, (int)value));
  226. case 102: // OBJPROP_XDISTANCE
  227. return(ObjectSetInteger(0, object_name, OBJPROP_XDISTANCE, (int)value));
  228. case 103: // OBJPROP_YDISTANCE
  229. return(ObjectSetInteger(0, object_name, OBJPROP_YDISTANCE, (int)value));
  230. case 200: // OBJPROP_FIBOLEVELS
  231. return(ObjectSetInteger(0, object_name, OBJPROP_LEVELS, (int)value));
  232. case 201: // OBJPROP_LEVELCOLOR
  233. return(ObjectSetInteger(0, object_name, OBJPROP_LEVELCOLOR, (int)value));
  234. case 202: // OBJPROP_LEVELSTYLE
  235. return(ObjectSetInteger(0, object_name, OBJPROP_LEVELSTYLE, (int)value));
  236. case 203: // OBJPROP_LEVELWIDTH
  237. return(ObjectSetInteger(0, object_name, OBJPROP_LEVELWIDTH, (int)value));
  238. }
  239. 返回(false);
  240. }
  241. +------------------------------------------------------------------+
  242. | |
  243. +------------------------------------------------------------------+
  244. bool ObjectSetTextxt(string object_name, string text, int font_size=0, string font_name=NULL, color text_color=clrNONE)
  245. {
  246. int type = (int)ObjectGetInteger(0, object_name, OBJPROP_TYPE);

  247. if(type != OBJ_LABEL &&; type != OBJ_TEXT)
  248. {
  249. return(false);


  250. if(StringLen(text) > 0 && font_size > 0)
  251. {
  252. if(!ObjectSetString(0, object_name, OBJPROP_TEXT, text))
  253. {
  254. return(false);

  255. 如果(!ObjectSetInteger(0, object_name, OBJPROP_FONTSIZE, font_size))
  256. {
  257. return(false);

  258. }
  259. if(font_name != NULL)
  260. {
  261. if(!ObjectSetString(0, object_name, OBJPROP_FONT, font_name))
  262. {
  263. return(false);

  264. }

  265. if(text_color != clrNONE)
  266. {
  267. if(!ObjectSetInteger(0, object_name, OBJPROP_COLOR, text_color))
  268. {
  269. return(false);


  270. }
  271. return(true);</font>
  272.   }
  273. //+------------------------------------------------------------------+
复制代码

MT5当前品种持仓统计指标,可与面板或其它副图指标叠加使用.


""
还没有人打赏,支持一下

评论|共 3 个

博汇投资

发表于 2025-3-11 23:52:46 | 显示全部楼层

谢谢

雨量

发表于 2025-4-5 16:01:12 | 显示全部楼层

谢谢

刘兴

发表于 2025-4-11 18:11:38 | 显示全部楼层

支持下

您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则