MT5显示未平仓头寸的总止损和止盈价值 - MetaTrader 5EA
- 显示:
- 8148
- 等级:
- 已发布:
- 2021.03.17 02:09
- 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
这是一个MT5的程序,它显示未平仓头寸的总止损和止盈价值。
这是基于Conor Dailey在https://www.mql5.com/en/code/23788 上先前的旧MT4指标的升级和修改。
该EA不会交易或修改您的任何订单。它只是对您当前持有的所有头寸的止损和止盈进行汇总,并显示在图表的左下角。当您修改或创建止损/止盈时,显示的值会自动更新。
您可以将此EA附加到所有图表(推荐),以便随时观察值。
#property copyright "Copyright 2021, mfx123 & Conor Dailey" #property version "1.00" #property description "No need to tick anything below" #property strict #property indicator_chart_window string total; double total_sl, total_tp; double prev_total_sl, prev_total_tp; string label = "sltp"; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { total_sl = GetTotalSLValue(); total_tp = GetTotalTPValue(); ObjectCreate(0, label, OBJ_LABEL, 0, 0, 0); ObjectSetInteger(0, label, OBJPROP_CORNER, CORNER_LEFT_LOWER); ObjectSetInteger(0, label, OBJPROP_XDISTANCE, 0); ObjectSetInteger(0, label, OBJPROP_YDISTANCE, 50); ObjectSetInteger(0, label, OBJPROP_COLOR, clrGoldenrod); ObjectSetString(0, label, OBJPROP_FONT, "Arial"); ObjectSetInteger(0, label, OBJPROP_FONTSIZE, 16); ObjectSetInteger(0, label, OBJPROP_HIDDEN, true); ObjectSetInteger(0, label, OBJPROP_BACK, false); ObjectSetInteger(0, label, OBJPROP_SELECTED, false); ObjectSetInteger(0, label, OBJPROP_SELECTABLE, true); ObjectSetInteger(0, label, OBJPROP_ZORDER, 0); Display_Info(); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectDelete(0, label); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ int GetMultiplier(string s) { int m = 0; int digits = SymbolInfoInteger(s, SYMBOL_DIGITS); if(digits == 5) m = 10000; if(digits == 4) m = 1000; if(digits == 2 || digits == 3) m = 100; if(digits == 1) m = 10; return(m); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetPips2Dbl(string s) { int digits = SymbolInfoInteger(s, SYMBOL_DIGITS); double p = 0; if(digits == 5 || digits == 3) p = SymbolInfoDouble(s, SYMBOL_POINT) * 10; else p = SymbolInfoDouble(s, SYMBOL_POINT); return(p); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetTotalSLValue() { double sl_value = 0, total_sl_value = 0, delta; for(int v = PositionsTotal() - 1; v >= 0; v--) { ulong positionticket = PositionGetTicket(v); if(PositionSelectByTicket(positionticket)) { if(PositionGetDouble(POSITION_SL) != 0) { delta = (SymbolInfoDouble(PositionGetString(POSITION_SYMBOL), SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(PositionGetString(POSITION_SYMBOL), SYMBOL_TRADE_TICK_SIZE)) * GetPips2Dbl(PositionGetString(POSITION_SYMBOL)); sl_value = ((MathAbs(PositionGetDouble(POSITION_PRICE_OPEN) - PositionGetDouble(POSITION_SL)) * delta) * PositionGetDouble(POSITION_VOLUME)) * GetMultiplier(PositionGetString(POSITION_SYMBOL)); sl_value -= PositionGetDouble(POSITION_SWAP); sl_value = -(sl_value); total_sl_value += sl_value; } } } return(NormalizeDouble(total_sl_value, 2)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetTotalTPValue() { double tp_value = 0, total_tp_value = 0, delta; for(int v = PositionsTotal() - 1; v >= 0; v--) { ulong positionticket = PositionGetTicket(v); if(PositionSelectByTicket(positionticket)) { if(PositionGetDouble(POSITION_TP) != 0) { delta = (SymbolInfoDouble(PositionGetString(POSITION_SYMBOL), SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(PositionGetString(POSITION_SYMBOL), SYMBOL_TRADE_TICK_SIZE)) * GetPips2Dbl(PositionGetString(POSITION_SYMBOL)); tp_value = ((MathAbs(PositionGetDouble(POSITION_PRICE_OPEN) - PositionGetDouble(POSITION_TP)) * delta) * PositionGetDouble(POSITION_VOLUME)) * GetMultiplier(PositionGetString(POSITION_SYMBOL)); tp_value -= PositionGetDouble(POSITION_SWAP); total_tp_value += tp_value; } } } return(NormalizeDouble(total_tp_value, 2)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Display_Info() { total = "" + "SL: $ " + DoubleToString(total_sl, 2) + " " + "TP: $ " + DoubleToString(total_tp, 2); ObjectSetString(0, label, OBJPROP_TEXT, total); ChartRedraw(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { total_sl = GetTotalSLValue(); total_tp = GetTotalTPValue(); if((total_sl != prev_total_sl) || (total_tp != prev_total_tp)) { Display_Info(); prev_total_sl = total_sl; prev_total_tp = total_tp; } } //+------------------------------------------------------------------+
持仓单一键平仓脚本
在手动或自动化交易中,一键平仓功能都是比较常用的,特别是在涉及风控管理的时候,能够快速止损,有效控制风险。这个脚本功能实现起来并不难,但在程序化实现的过程中,会有一些不同的应用场景。
双线一柱变色MACD指标MT5已经自带了很多指标,给交易带来了极大便利,作为辅助工具,很多时候我们需要对其进行进一步改造,或重新自定义指标,本例通过实现双线一柱变色MACD指标来进行说明。