任何人都可以帮助我,如何编写MQL4
代码以了解结果是增加还是减少..
示例:
如果结果是0.0543
,然后增加到0.1342
,然后减少到0.10345
,我想将其实现到下面的代码中:
int start()
{
double val = iCustom( NULL, 0, "SS2009_B", 0, 0, 0 );
ObjectSet( "TimeLable11", OBJPROP_CORNER, obCorner );
ObjectSetText( "TimeLable11", "Result : " + val,
fsize,
"Microsoft Sans Serif",
Yellow
);
return( 0 );
}
我希望结果增加或减少通知。
示例:
Result : 0.1849 Increasing
Result : 0.01324 Decreasing
答案 0 :(得分:1)
有一个简单的例子:
//------------------------------------------------------------------
#property copyright "Copyright 2015"
//------------------------------------------------------------------
// Standard Variables (define a variable to store previous value)
//------------------------------------------------------------------
double viIndicatorValuePrev = 0.0000;
int start() {
double viIndicatorValueNow = iCustom(NULL,0,"SS2009_B",0,0,0);
//------------------------------------------------
//Decide on direction (increasing or decreasing)
//------------------------------------------------
string vsDirection = "Same";
if( viIndicatorValueNow>viIndicatorValuePrev)
vsDirection = "Increasing";
if( viIndicatorValueNow<viIndicatorValuePrev)
vsDirection = "Decreasing";
//------------------------------------------------
//------------------------------------------------
// Do your thing here (ie, display stuff)
//------------------------------------------------
ObjectSet( "TimeLable11", OBJPROP_CORNER, obCorner);
ObjectSetText(
"TimeLable11"
, "Result : " + viIndicatorValueNow + " (" + vsDirection + ")"
, fsize, "Microsoft Sans Serif", Yellow
);
//------------------------------------------------
// Store current value for future comparison
//------------------------------------------------
viIndicatorValuePrev = viIndicatorValueNow;
//------------------------------------------------
return(0);
}
希望这个例子有所帮助。
答案 1 :(得分:0)
start()
的每个 aMarketEVENT 调用的增量(在aMarketQUOTE即Tick到达时) 首先您需要一种方法来存储和保留一个值,在此期间变为&#34; old&#34;同时,在 start()
(实际上 new -MQL世纪中的 OnTick()
。
static double
是一种明智的选择:
static double previousVALUE = EMPTY; // initialised to EMPTY
下一步,根据自定义指标&#34; SS2009_B&#34;
的前进步骤逻辑对其进行初始化if ( previousVALUE == EMPTY ) {
previousVALUE = iCustom( NULL, // a Symbol
0, // a TimeFRAME
"SS2009_B",
0,
0, // a Buffer# to get value from
1 // step-back one Bar
);
}
有关语法详细信息,请查看MQL4文档
double iCustom(
string symbol, // symbol
int timeframe, // timeframe
string name, // path/name of the custom indicator compiled program
... // custom indicator input parameterA (if
... // custom indicator input parameterB (if
... // custom indicator input parameterC (if necessary)
int mode, // line index
int shift // shift
);
最后计算delta&amp;在UI&amp;随时准备接下来的电话
double currentVALUE = iCustom( NULL, 0, "SS2009_B", 0, 0, 0);
double deltaVALUE = previousVALUE - currentVALUE;
previousVALUE = currentVALUE; // shuffle [1]<-[0] before RET/next call
if ( deltaVALUE > 0 ){
ObjectSetText( "TimeLabel11",
"RESULT: " + NormalizeDouble( deltaVALUE, Digits ) + "|^|",
fsize,
"Courier New",
Yellow // can be deltaVALUE specific too :o)
);
}
if ( deltaVALUE < 0 ){
ObjectSetText( "TimeLabel11",
"RESULT: " + NormalizeDouble( deltaVALUE, Digits ) + "|v|",
fsize,
"Courier New",
Cyan // can be deltaVALUE specific too :o)
);
}
您可能会注意到NormalizeDouble()
这是相当重要的一步,以避免浮动比较的问题。
如果标准浮点数(MQL4 double
)的精度不够,您可以选择在MQL4中使用扩展精度数。检查文档。
然而,总是要小心浮动比较。
最佳做法,更安全的一面是同时使用NormalizeDouble()
(作为预防措施)
和
与某些thresholdDELTA
相比,例如if ( MathAbs( floatA - floatB ) < anEqualityTresholdDELTA ){ ... }
而不是if ( floatA == floatB ) {...}