0

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
4

2 に答える 2

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);
}

この例が役立つことを願っています。

于 2015-03-04T23:53:28.043 に答える
0

各aMarketEVENT呼び出しごとにデルタを監視および表示するソリューションstart()( aMarketQUOTE 別名 Tick 到着時)

最初に、 (実際には新しい-MQL 世紀の)が次に呼び出される前に、その間に「古い」値を格納および保持するメソッドが必要です。start() OnTick()

Astatic doubleは賢明な方法です。

static double previousVALUE = EMPTY;                   // initialised to EMPTY

次に、カスタムインディケータ「SS2009_B」の前進ロジックに従って初期化します。

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
                   );

最後にデルタを計算して UI に表示し、シャッフルして次の呼び出しに備える

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()

これは、float の比較に関する問題を回避するために、かなり重要なステップです。

標準浮動小数点 ( MQL4 double) の精度が十分でない場合、MQL4 で拡張精度の数値を使用することを選択できます。そのためのドキュメントを確認してください。

ただし、float 比較には常に注意してください。

より安全な側にいるためのベストプラクティスNormalizeDouble()は、 (予防として)および比較ではなく、いくつかのthresholdDELTAようなもの の両方を使用することですif ( MathAbs( floatA - floatB ) < anEqualityTresholdDELTA ){ ... }if ( floatA == floatB ) {...}

于 2014-09-08T08:01:57.110 に答える