Как уведомить об увеличении и уменьшении числа в коде MQL4?

может ли кто-нибудь помочь мне, как написать код 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

person user3869115    schedule 07.09.2014    source источник


Ответы (2)


Чтобы иметь ПРОСТОЙ пример:

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

Надеюсь, этот пример поможет.

person Joseph Lee    schedule 04.03.2015

Решение для мониторинга и отображения дельты для каждого вызова aMarketEVENT события start() (после получения aMarketQUOTE, также известного как тик)

Во-первых, вам нужен метод для хранения и сохранения значения, которое тем временем становится "старым", прежде чем start() ( ну на самом деле OnTick() в новый век MQL ) вызывается в следующий раз.

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

Наконец вычислите дельту и отобразите ее в пользовательском интерфейсе и перетасуйте, чтобы подготовиться к следующему звонку.

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 ) {...}.

person user3666197    schedule 08.09.2014