- 显示:
- 110
- 等级:
- 已发布:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
变量定义
首先,你需要修改文件的第一行,使其与变量和数组的名称相匹配。下图中的 MqlRates 变量使用了 g_rates,其中包含蜡烛图的开盘价、收盘价、最高价和最低价。你应该用你的变量名替换 g_rates。i "是一个虚拟变量名,不会干扰代码中的任何其他变量。变量 "i "是正在使用的蜡烛图的编号。例如:要使用蜡烛 3 的收盘价,请使用 CANDLECLOSE(3)。// Candle (define g_rates as: MqlRates g_rates[];) #define CANDLELOW(i) g_rates[i].low #define CANDLEHIGH(i) g_rates[i].high #define CANDLEOPEN(i) g_rates[i].open #define CANDLECLOSE(i) g_rates[i].close #define CANDLETIME(i) g_rates[i].time
此外,您可以使用 MqlTick 获取 ASK 和 BID 值,就像我在下面所做的那样,或者您也可以调用 SymbolInfoDouble(_Symbol,SYMBOL_ASK)。这对返回的值没有任何影响。
// Prices (define g_tick as: MqlTick g_tick;)) #define ASK g_tick.ask #define BID g_tick.bid
最后,还为移动平均线、atr 或任何其他需要的数组定义了数组。例如:要使用蜡烛 1 的平均真实范围,请使用 ATR(1)。
重要:假定数组为 AsSeries(例如,ArraySetAsSeries(g_MA20_arr, true); )。这在稍后显示的 #define 语句中至关重要。
// 将这些数组定义为: double g_MA20_arr[]; // 移动平均线和 ATR #define MOVAVG20(i) g_MA20_arr[i] #define MOVAVG40(i) g_MA40_arr[i] #define MOVAVG50(i) g_MA50_arr[i] #define MOVAVG200(i) g_MA200_arr[i] #define ATR(i) g_atr_arr[i]
一旦定义了上述语句,就不需要再修改其他内容了。如果需要,您还可以添加其他适合您的 EA 的 #define 语句。
蜡烛图功能
蜡烛图的特性在开发 EA 时非常有用,尤其是在 EA 基于价格行为的情况下。以下定义的名称说明了它们所代表的含义。WICK 指蜡烛上影线,TAIL 指蜡烛下影线。例如:要获取最后一根蜡烛中间的价格,请使用 CANDLEBODYMIDDLE(1)。
// 蜡烛特点 #define CANDLEBODYTOP(i) fmax(CANDLEOPEN(i),CANDLECLOSE(i)) #define CANDLEBODYBOT(i) fmin(CANDLEOPEN(i),CANDLECLOSE(i)) #define CANDLEMEDIAN(i) (0.5*(CANDLEHIGH(i)+CANDLELOW(i))) #define CANDLEWEIGHTED(i) (0.25*(CANDLEHIGH(i)+CANDLELOW(i)+2*CANDLECLOSE(i))) #define CANDLETYPICAL(i) (1./3.*(CANDLEHIGH(i)+CANDLELOW(i)+CANDLECLOSE(i))) #define CANDLEBODYMIDDLE(i) (0.5*(CANDLEBODYTOP(i)+CANDLEBODYBOT(i))) #define CANDLESIZE(i) (CANDLEHIGH(i)-CANDLELOW(i)) #define CANDLEBODYSIZE(i) fabs(CANDLECLOSE(i)-CANDLEOPEN(i)) #define CANDLEWICKSIZE(i) (CANDLEHIGH(i)-CANDLEBODYTOP(i)) #define CANDLETAILSIZE(i) (CANDLEBODYBOT(i)-CANDLELOW(i))
此外,我们还以 ATR 为参考定义了两种大小。例如:想知道蜡烛图 4 相对于 ATR 有多大,使用 ATRCANDLESIZE(4)。
#define ATRCANDLESIZE(i) (CANDLESIZE(i)/ATR(i)) #define ATRCANDLEBODYSIZE(i) (CANDLEBODYSIZE(i)/ATR(i))
如果收盘价==开盘价,则方向=0。 示例: if(CANDLEDIRECTION(10)==1) Print("蜡烛 10 是一根向上的蜡烛");
#define CANDLEDIRECTION(i) (CANDLECLOSE(i)>CANDLEOPEN(i)?1:(CANDLECLOSE(i)<CANDLEOPEN(i)?-1:0))
定义了两种 "运行 "类型:上行和下行。运行 "用于捕捉价格在一个方向上的强烈波动。例如,使用 CANDLERUNUP(3) 获取蜡烛图 3 的上涨。
#define CANDLERUNUP(i) ((CANDLECLOSE(i)>CANDLEOPEN(i))?(CANDLECLOSE(i)-CANDLELOW(i)):0) #define CANDLERUNDOWN(i) ((CANDLECLOSE(i)<CANDLEOPEN(i))?(CANDLEHIGH(i)-CANDLECLOSE(i)):0)
蜡烛图特征查询
这些定义是布尔变量,告诉我们一个或一组蜡烛的行为。它们使用以前的 #define 语句来缩短长度。
isCANDLERIGHTDIR(i,dir) 如果蜡烛(i)的方向等于 dir,则为 true,否则为 false;
有两种分形:一种使用五根蜡烛,另一种(弱分形)使用三根蜡烛。在下面的分形 #定义中,蜡烛图(i)是具有最高点(TOP)或最低点(BOT)的中间蜡烛图。对于五根蜡烛图分形,请确保有蜡烛图 i-2、i-1、i、i+1、i+2 的数据。还有使用严格不等式">"或"<",以及使用"<="或">="的其他变化。最后,还有用于识别顶部(TOP)或底部(BOT)分形的 #定义。通过观察这些定义,你就可以知道应该使用哪个定义。
is3CANDLEGAPUP(i,gap,size) 用于查找向上缺口(一根蜡烛的高点低于两根蜡烛之后的低点)。Candle(i) 将是三根蜡烛中最新的一根。再次假设蜡烛是 "AsSeries"(系列)。"缺口 "是缺口的最小价格-三角洲,"大小 "是中间蜡烛体大小的最小价格-三角洲。
is3CANDLEGAPDOWN(i,gap,size) 使用相同的逻辑查找下跌缺口。
is3CANDLEGAPUPTREND(i,gap,size) 与is3CANDLEGAPUP(i,gap,size) 相同 ,但增加了一个为真的条件:三根蜡烛中最长的必须是正方向。
有两种方法可以查询蜡烛是否为十字星:isCANDLEDOJIPOINTS(i,n) 和 isCANDLEDOJIFRACTION(i,f)。第一个版本使用 n*_Point,第二个版本使用 f*CANDLESIZE(i) 来判断蜡烛是否是十字星(真或假)。
例如:如果想知道蜡烛 20 是否为非严格(使用等式)分形顶部,使用 isCANDLEFRACTALEQTOP(20),输出结果将是 true 或 false。
如您所见,这些定义是查询的压缩形式,使您的 EA 代码更简短、更易读。
// 蜡烛功能查询(布尔值) #define isCANDLEUP(i) (CANDLEDIRECTION(i)==1) #define isCANDLEDOWN(i) (CANDLEDIRECTION(i)==-1) #define isCANDLEFLAT(i) (CANDLEDIRECTION(i)==0) #define isCANDLEWICKLESS(i) (CANDLEWICKSIZE(i)==0) #define isCANDLETAILLESS(i) (CANDLETAILSIZE(i)==0) #define isCANDLESOLID(i) (CANDLEWICKSIZE(i)==0 && CANDLETAILSIZE(i)==0) #define isCANDLERIGHTDIR(i,dir) (dir*(CANDLECLOSE(i) - CANDLEOPEN(i))>0) #define isCANDLEFRACTALTOP(i) (CANDLEHIGH(i) > CANDLEHIGH(i-1) && CANDLEHIGH(i-1) > CANDLEHIGH(i-2) && CANDLEHIGH(i) > CANDLEHIGH(i+1) && CANDLEHIGH(i+1) > CANDLEHIGH(i+2)) #define isCANDLEFRACTALBOT(i) (CANDLELOW(i) < CANDLELOW(i-1) && CANDLELOW(i-1) < CANDLELOW(i-2) && CANDLELOW(i) < CANDLELOW(i+1) && CANDLELOW(i+1) < CANDLELOW(i+2)) #define isCANDLEFRACTALEQTOP(i) (CANDLEHIGH(i) >= CANDLEHIGH(i-1) && CANDLEHIGH(i-1) >= CANDLEHIGH(i-2) && CANDLEHIGH(i) >= CANDLEHIGH(i+1) && CANDLEHIGH(i+1) >= CANDLEHIGH(i+2)) #define isCANDLEFRACTALEQBOT(i) (CANDLELOW(i) <= CANDLELOW(i-1) && CANDLELOW(i-1) <= CANDLELOW(i-2) && CANDLELOW(i) <= CANDLELOW(i+1) && CANDLELOW(i+1) <= CANDLELOW(i+2)) #define isCANDLEWEAKFRACTALTOP(i) (CANDLEHIGH(i) > CANDLEHIGH(i-1) && CANDLEHIGH(i) > CANDLEHIGH(i+1)) #define isCANDLEWEAKFRACTALBOT(i) (CANDLELOW(i) < CANDLELOW(i-1) && CANDLELOW(i) < CANDLELOW(i+1)) #define isCANDLEWEAKFRACTALEQBOT(i) (CANDLELOW(i) <= CANDLELOW(i-1) && CANDLELOW(i) <= CANDLELOW(i+1)) #define isCANDLEWEAKFRACTALEQTOP(i) (CANDLEHIGH(i) >= CANDLEHIGH(i-1) && CANDLEHIGH(i) >= CANDLEHIGH(i+1)) #define is3CANDLEGAPUP(i,gap,size) (CANDLELOW(i)-CANDLEHIGH(i+2)>gap && CANDLEBODYSIZE(i+1)>=size) #define is3CANDLEGAPDOWN(i,gap,size) (CANDLELOW(i+2)-CANDLEHIGH(i)>gap && CANDLEBODYSIZE(i+1)>=size) #define is3CANDLEGAPUPTREND(i,gap,size) (CANDLELOW(i)-CANDLEHIGH(i+2)>gap && CANDLEBODYSIZE(i+1)>=size && isCANDLEUP(i+2)) #define is3CANDLEGAPDOWNTREND(i,gap,size) (CANDLELOW(i+2)-CANDLEHIGH(i)>gap && CANDLEBODYSIZE(i+1)>=size && isCANDLEDOWN(i+2)) #define isCANDLEDOJIPOINTS(i,n) (CANDLEBODYSIZE(i) <= n*_Point) #define isCANDLEDOJIFRACTION(i,f) (CANDLEBODYSIZE(i) <= f*CANDLESIZE(i))
数学函数和运算
我们现在定义一些在 EA 中有用的数学函数和运算。其中一些是我开发的 EA 所特有的,但如果你愿意,也可以更改或删除它们。
BRACKET(x,minV,maxV) 将返回 x 在区间 [minV,maxV] 内的值。这对于在 EA 中对输入变量进行框约束非常有用。
CONVEXCOMB(a,x1,x2) 是 x1 和 x2 的凸组合,即 a*x1+x2。当计算 x1 和 x2 之间的中间值,但需要的不仅仅是平均值(a=0.5)时,此函数非常有用。
EVALLINE(x,x1,y1,x2,y2,ymin,ymax) 是对由两点 [x1,y1] 和 [x2,y2] 定义的直线的求值。在 x 处求值后,返回 [ymin, ymax] 内的一个带括号的值。
MAPAB11(x,A,B) 将 x 值从括号 [A,B] 映射到括号 [-1,1]。MAP11AB(x,A,B) 将 x 值从括号 [-1,1] 映射到括号 [A,B]。这两个函数对于处理 [-1,1] 范围内的归一化变量非常有用。
最后四个函数在我的 EA 中使用,不一定对每个人都有用,但我还是把它们留在了这里,以备不时之需。
#define BRACKET(x,minV,maxV) (x<minV?minV:(x>maxV?maxV:x)) #define CONVEXCOMB(a,x1,x2) (a*x1+(1.0-a)*x2) #define EVALLINE(x,x1,y1,x2,y2,ymin,ymax) BRACKET((y2-y1)/(x2-x1)*(x-x1)+y1,ymin,ymax) #define MAPAB11(x,A,B) (2./(B-A)*(BRACKET(x,A,B)-A)-1.) #define MAP11AB(x,A,B) ((B-A)/2.*(BRACKET(x,-1,1)-1)+B) #define SIGMOID(x,a) (1.0/(1.0 + exp(-a*x))) #define NN1(x,w,b) (w*x+b) #define EVALPOLY(X,X0,X1,Y0,Y1,EX,ymin,ymax) BRACKET(Y1*pow((X-X0)/(X1-X0),EX)+Y0,ymin,ymax) #define EVALPOLY2P(X,X0,X1,Y0,Y1,EX,ymn,ymx) BRACKET((Y1-Y0)*pow((X-X0)/(X1-X0),EX)+Y0,ymn,ymx)
此外,作为函数和操作,还有差值计算(作为斜率的替代)。
MA20DIFF(i,n)给出了相隔 n 根蜡烛线的 20 期移动平均线两个值之间的差值。其他函数也遵循同样的逻辑。例如:要计算 200 期移动平均线在蜡烛 3 和蜡烛 13 之间的差值,请使用 MA200DIFF(3,10)。
#define MA20DIFF(i,n) (MOVAVG20(i)-MOVAVG20(i+n)) #define MA40DIFF(i,n) (MOVAVG40(i)-MOVAVG40(i+n)) #define MA50DIFF(i,n) (MOVAVG50(i)-MOVAVG50(i+n)) #define MA200DIFF(i,n) (MOVAVG200(i)-MOVAVG200(i+n)) #define CANDLECLOSEDIFF(i,n) (CANDLECLOSE(i)-CANDLECLOSE(i+n)) #define CANDLEOPENDIFF(i,n) (CANDLEOPEN(i)-CANDLEOPEN(i+n)) #define CANDLEHIGHDIFF(i,n) (CANDLEHIGH(i)-CANDLEHIGH(i+n)) #define CANDLELOWDIFF(i,n) (CANDLELOW(i)-CANDLELOW(i+n)) #define CANDLEMEDIANDIFF(i,n) (CANDLEMEDIAN(i)-CANDLEMEDIAN(i+n)) #define CANDLEWEIGHTEDDIFF(i,n) (CANDLEWEIGHTED(i)-CANDLEWEIGHTED(i+n)) #define CANDLETYPICALDIFF(i,n) (CANDLETYPICAL(i)-CANDLETYPICAL(i+n)) #define CANDLEBODYMIDDLEDIFF(i,n) (CANDLEBODYMIDDLE(i)-CANDLEBODYMIDDLE(i+n))
查询也包括数学函数。下面将检查括号和凸性。
#define isINBRACKET(x,minV,maxV) (x<=maxV && x>=minV) #define isINBRACKETSTRICT(x,minV,maxV) (x<maxV && x> minV) #define isOUTBRACKET(x,minV,maxV) (x>=maxV || x<=minV) #define isOUTBRACKETSTRICT(x,minV,maxV) (x> maxV || x< minV) #define isCONVEX(yl,yc,yr) (yl>=yc && yc<=yr) #define isCONCAVE(yl,yc,yr) (yl<=yc && yc>=yr) #define isCONVEXTSTRICT(yl,yc,yr) (yl>yc && yc<yr) #define isCONCAVESTRICT(yl,yc,yr) (yl<yc && yc> yr)
常数
我定义了一些我使用的常量。您可以选择是否使用它们。
// 常量 #define PIVALUE (M_PI) #define MINSTOPPOINTS (30) #define MINFREEZEPOINTS (30) #define STOPLEVEL (fmax(MINSTOPPOINTS,(double)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL))*_Point) #define FREEZELEVEL (fmax(MINFREEZEPOINTS,(double)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL))*_Point)
调试
任何经验丰富的程序员都知道,调试代码的最佳工具就是打印语句。通过下面的定义,可以在程序中设置所有 Print 语句,并根据所需的调试级别值打开/关闭它们。
首先,你需要使用 #define DEBUG_LEVEL0、#define DEBUG_LEVEL1 或#define DEBUG_LEVEL2 来 定义调试级别。使用DEBUG_LEVEL0 时,不会在 Metatrader 5 终端的日志选项卡上打印。使用DEBUG_LEVEL1,只有 PRINTVARn 语句有效,并将打印在日志选项卡上。使用DEBUG_LEVEL2,PRINTVARn 和VPRINTVARn 语句都将打印在日志选项卡上。DEBUG_LEVEL2 是使用VPRINTVARn 的 "V "级详细情况。
PRINTVARn 将打印 n 个变量。例如,如果要打印 i、x 和 z,请使用 PRINTVAR3(i,x,z);如果要打印字符串,请使用 PRINTTEXT("any string");打印输出将包括函数名称和插入 PRINTVARn 语句的文件的行号。
// 使用打印进行调试 // 在代码开头定义调试级别 x={0,1,2}:#define DEBUG_LEVELx #ifdef DEBUG_LEVEL0 #define PRINTTEXT(text) #define PRINTVAR(x1) #define PRINTVAR1(x1) #define PRINTVAR2(x1,x2) #define PRINTVAR3(x1,x2,x3) #define PRINTVAR4(x1,x2,x3,x4) #define PRINTVAR5(x1,x2,x3,x4,x5) #define PRINTVAR6(x1,x2,x3,x4,x5,x6) #define VPRINTTEXT(text) #define VPRINTVAR(x1) #define VPRINTVAR1(x1) #define VPRINTVAR2(x1,x2) #define VPRINTVAR3(x1,x2,x3) #define VPRINTVAR4(x1,x2,x3,x4) #define VPRINTVAR5(x1,x2,x3,x4,x5) #define VPRINTVAR6(x1,x2,x3,x4,x5,x6) #endif #ifdef DEBUG_LEVEL1 #define PRINTTEXT(text) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :",text) #define PRINTVAR(x1) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1)) #define PRINTVAR1(x1) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1)) #define PRINTVAR2(x1,x2) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2)) #define PRINTVAR3(x1,x2,x3) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3)) #define PRINTVAR4(x1,x2,x3,x4) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4)) #define PRINTVAR5(x1,x2,x3,x4,x5) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5)) #define PRINTVAR6(x1,x2,x3,x4,x5,x6) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5),", " #x6 + "=", (x6)) #define VPRINTTEXT(text) #define VPRINTVAR(x1) #define VPRINTVAR1(x1) #define VPRINTVAR2(x1,x2) #define VPRINTVAR3(x1,x2,x3) #define VPRINTVAR4(x1,x2,x3,x4) #define VPRINTVAR5(x1,x2,x3,x4,x5) #define VPRINTVAR6(x1,x2,x3,x4,x5,x6) #endif #ifdef DEBUG_LEVEL2 #define PRINTTEXT(text) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :",text) #define PRINTVAR(x1) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1)) #define PRINTVAR1(x1) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1)) #define PRINTVAR2(x1,x2) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2)) #define PRINTVAR3(x1,x2,x3) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3)) #define PRINTVAR4(x1,x2,x3,x4) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4)) #define PRINTVAR5(x1,x2,x3,x4,x5) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5)) #define PRINTVAR6(x1,x2,x3,x4,x5,x6) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5),", " #x6 + "=", (x6)) #define VPRINTTEXT(text) Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :",text) #define VPRINTVAR(x1) Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1)) #define VPRINTVAR1(x1) Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1)) #define VPRINTVAR2(x1,x2) Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2)) #define VPRINTVAR3(x1,x2,x3) Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3)) #define VPRINTVAR4(x1,x2,x3,x4) Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4)) #define VPRINTVAR5(x1,x2,x3,x4,x5) Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5)) #define VPRINTVAR6(x1,x2,x3,x4,x5,x6) Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5),", " #x6 + "=", (x6)) #endif
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/56149

从经纪商处下载市场观察中所有符号的所有刻度线。 下载所有历史记录或直至过去某个特定日期的历史记录(如果有)。

MACD 彩色柱状图是经典 MACD(移动平均收敛背离)指标的增强版,旨在提供更清晰、更直观的市场动量视觉分析。该指标将传统的 MACD 功能与动态柱状图相结合,根据 MACD 线与信号线之间的关系改变颜色,使交易者能够快速识别趋势、反转点和市场中的犹豫不决时刻。

该指标绘制两条线。下线根据导致反弹的最新 SMA 周期计算。上线根据导致反弹下跌的最近 SMA 周期计算。

按风险回报比自动设置止损和获利水平(Auto SL TP by Risk Reward Ratio)脚本是一款简单而强大的工具,专为希望简化风险管理流程的 MetaTrader 5 交易者而设计。该脚本可根据用户定义的风险回报比和止损点数,自动设置未结头寸的止损(SL)和止盈(TP)水平。无论您是初学者还是经验丰富的交易者,该脚本都能节省时间,确保一致的风险管理。