Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2483

 
ANDREY #:

Всем доброго времени суток! Вопрос по тестеру МТ4
Внизу мой код. Я хочу что бы в функции Print() выводилось значение цены открытия ордера с пятью знаками после единицы. Для этого я использовал функцию NormalizeDouble()
Но вместо того что я хочу, функция OrderOpenPrice() округляет значение цены открытия ордера до ближайшего целого знака . То есть, ордер открылся по цене 1.61498 и и  OrderOpenPrice() округляет это значение до 1. 6150 и функция  Print() почему то выводит значение  1. 615 , не смотря на то что функция  NormalizeDouble предписывает выводить значение с 5 знаками после 1, то есть   1.61498.

ВОПРОС Какую ошибку я допустил в коде и как сделать так что бы в  Print() выводилось число  1.61498  вместо  1. 615 ?
Всем спасибо за помощь.

Изучите функции PrintFormat и DoubleToString

 
Tretyakov Rostyslav #:


Cпасибо.

 
Почему не отрисовываются красные стрелки онлайн?

А в тестере отрисовываются

//+------------+-----------------------------------------------------+
//| v.22.04.05 |                                     up and Down.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_style1 STYLE_SOLID
#property indicator_color1 Black

#property indicator_level1 0
//#property indicator_level2 -2
//#property indicator_level3 2
//#property indicator_level4 -1
//#property indicator_level5 1
#property indicator_minimum -3
#property indicator_maximum 3
#define PREFIX "xxx"

extern int    period          = 18;
extern bool   Arrow           = true;
extern int    ArrowSize       = 1;
extern int    SIGNAL_BAR      = 1;
extern color  clArrowBuy      = Blue;
extern color  clArrowSell     = Red; 

double      ExtBuffer0[];
// -------------------------------------------------------------------------------------------------------------
int init()
  {
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0,ExtBuffer0);
    IndicatorShortName("Up and Down Non Repaint V");
    return(0);
  }
// -------------------------------------------------------------------------------------------------------------
int deinit()                            
  {                                           
    for (int i = ObjectsTotal()-1; i >= 0; i--)   
    if (StringSubstr(ObjectName(i), 0, StringLen(PREFIX)) == PREFIX)
       ObjectDelete(ObjectName(i));
    return(0);  
  }
// -------------------------------------------------------------------------------------------------------------
int start()
  {
    int limit;
    int counted_bars;
    //double prev, current, old;
    double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
    double price;
    double MinL=0;
    double MaxH=0;
   
    counted_bars = IndicatorCounted();
    if ( counted_bars > 0 ) counted_bars--;
    limit = Bars - counted_bars;

    for(int i=0; i<limit; i++)
      {
        MaxH = High[iHighest(NULL,0,MODE_CLOSE,period,i)];                       
        MinL = Low[iLowest(NULL,0,MODE_CLOSE,period,i)];                          
        price = (Open[i]+ Close[i])/2;                                             

        if(MaxH-MinL == 0) Value = 0.33*2*(0-0.5) + 0.67*Value1;
        else Value = 0.33*2*((price-MaxH)/(MinL-MaxH)-0.5) + 0.67*Value1;

        Value=MathMin(MathMax(Value,-0.999),0.999);
  
        if(1-Value == 0) ExtBuffer0[i]=0.5+0.5*Fish1;
        else ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;

        Value1=Value;
        Fish1=ExtBuffer0[i];
      }
    int counted_bars2 = IndicatorCounted();
    if ( counted_bars2 > 0 ) counted_bars2--;
    int limit2 = Bars - counted_bars2;
    for ( int j = limit2; j >= 0; j-- )
      {
        if ( Arrow )
          {
            if ( ExtBuffer0[j+SIGNAL_BAR+1] > 0.0  && ExtBuffer0[j+SIGNAL_BAR] < 0.0
            && iRSI(Symbol(),PERIOD_CURRENT,3,PRICE_CLOSE,0) >80
            && iMA(Symbol(),PERIOD_CURRENT,9,0,MODE_EMA,PRICE_CLOSE,0) > iMA(Symbol(),PERIOD_CURRENT,21,0,MODE_EMA,PRICE_CLOSE,0)  
             ) manageArr(j+1, clArrowBuy,  233, false);
            if ( ExtBuffer0[j+SIGNAL_BAR+1] < 0.0  && ExtBuffer0[j+SIGNAL_BAR] > 0.0
            && iRSI(Symbol(),PERIOD_CURRENT,3,PRICE_CLOSE,0) <20
            && iMA(Symbol(),PERIOD_CURRENT,9,0,MODE_EMA,PRICE_CLOSE,0) < iMA(Symbol(),PERIOD_CURRENT,21,0,MODE_EMA,PRICE_CLOSE,0) 
             ) manageArr(j+1, clArrowSell, 234, true );
          }
      }
    return(0);
  }
// -------------------------------------------------------------------------------------------------------------
void manageArr(int j, color clr, int theCode, bool up)   
  {
    string objName = PREFIX + Time[j];
    double gap  = 3.0*iATR(NULL,0,20,j)/4.0;
    
    ObjectCreate(objName, OBJ_ARROW,0,Time[j],0);
    ObjectSet   (objName, OBJPROP_COLOR, clr);  
    ObjectSet   (objName, OBJPROP_ARROWCODE,theCode);
    ObjectSet   (objName, OBJPROP_WIDTH,ArrowSize);  
    if ( up )
      ObjectSet(objName,OBJPROP_PRICE1,Open[j]+gap);
    else  
      ObjectSet(objName,OBJPROP_PRICE1,Close[j] -gap);
  }
// -------------------------------------------------------------------------------------------------------------

 
Ivan Butko #:
Почему не отрисовываются красные стрелки онлайн?

А в тестере отрисовываются

дежа-вю...мне кажется вы подобное уже спрашивали :-)

ChartRedraw() нехватает

ну и переписать без древнючих start() init()

 
Maxim Kuznetsov #:

дежа-вю...мне кажется вы подобное уже спрашивали :-)

ChartRedraw() нехватает

ну и переписать без древнючих start() init()

Оо, у меня память хуже, чем у рыбы

Так что возможно вы и правы.


ChartRedraw() сейчас добавлю и start заменю

 
Maxim Kuznetsov #:

дежа-вю...мне кажется вы подобное уже спрашивали :-)

ChartRedraw() нехватает

ну и переписать без древнючих start() init()

Ivan Butko #:

Оо, у меня память хуже, чем у рыбы

Так что возможно вы и правы.


ChartRedraw() сейчас добавлю и start заменю


Неа, всё равно: на одном ТФ рисуются только красные стрелки. На другом - только синие. 

А в тестере - обе. 


//+------------+-----------------------------------------------------+
//| v.22.04.05 |                                     up and Down.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_style1 STYLE_SOLID
#property indicator_color1 Black

#property indicator_level1 0
//#property indicator_level2 -2
//#property indicator_level3 2
//#property indicator_level4 -1
//#property indicator_level5 1
#property indicator_minimum -3
#property indicator_maximum 3
#define PREFIX "xxx"

extern int    period          = 18;
extern bool   Arrow           = true;
extern int    ArrowSize       = 1;
extern int    SIGNAL_BAR      = 1;
extern color  clArrowBuy      = Blue;
extern color  clArrowSell     = Red; 

double      ExtBuffer0[];
// -------------------------------------------------------------------------------------------------------------
int init()
  {
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0,ExtBuffer0);
    
   // ArraySetAsSeries(ExtBuffer0, true);
    IndicatorShortName("Up and Down Non Repaint V");
    return(0);
  }
// -------------------------------------------------------------------------------------------------------------
int deinit()                            
  {                                           
    for (int i = ObjectsTotal()-1; i >= 0; i--)   
    if (StringSubstr(ObjectName(i), 0, StringLen(PREFIX)) == PREFIX)
       ObjectDelete(ObjectName(i));
    return(0);  
  }
// -------------------------------------------------------------------------------------------------------------
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
    int limit;
    int counted_bars;
    //double prev, current, old;
    double Value=0,Value1=0,Value2=0,Fish=0,Fish1=0,Fish2=0;
    double price;
    double MinL=0;
    double MaxH=0;
   
    counted_bars = prev_calculated;
    if ( counted_bars > 0 ) counted_bars--;
    limit = rates_total - counted_bars;

    for(int i=0; i<limit; i++)
      {
        MaxH = High[iHighest(NULL,0,MODE_CLOSE,period,i)];                       
        MinL = Low[iLowest(NULL,0,MODE_CLOSE,period,i)];                          
        price = (Open[i]+ Close[i])/2;                                             

        if(MaxH-MinL == 0) Value = 0.33*2*(0-0.5) + 0.67*Value1;
        else Value = 0.33*2*((price-MaxH)/(MinL-MaxH)-0.5) + 0.67*Value1;

        Value=MathMin(MathMax(Value,-0.999),0.999);
  
        if(1-Value == 0) ExtBuffer0[i]=0.5+0.5*Fish1;
        else ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;

        Value1=Value;
        Fish1=ExtBuffer0[i];
      }
    int counted_bars2 = prev_calculated;
    if ( counted_bars2 > 0 ) counted_bars2--;
    int limit2 = rates_total - counted_bars2;
    for ( int j = limit2; j >= 0; j-- )
      {
        if ( Arrow )
          {
            if ( ExtBuffer0[j+SIGNAL_BAR+1] > 0.0  && ExtBuffer0[j+SIGNAL_BAR] < 0.0
            && iRSI(Symbol(),PERIOD_CURRENT,3,PRICE_CLOSE,0) >80
            && iMA(Symbol(),PERIOD_CURRENT,9,0,MODE_EMA,PRICE_CLOSE,0) > iMA(Symbol(),PERIOD_CURRENT,21,0,MODE_EMA,PRICE_CLOSE,0)  
             ) manageArr(j+1, clArrowBuy,  233, false);
            if ( ExtBuffer0[j+SIGNAL_BAR+1] < 0.0  && ExtBuffer0[j+SIGNAL_BAR] > 0.0
            && iRSI(Symbol(),PERIOD_CURRENT,3,PRICE_CLOSE,0) <20
            && iMA(Symbol(),PERIOD_CURRENT,9,0,MODE_EMA,PRICE_CLOSE,0) < iMA(Symbol(),PERIOD_CURRENT,21,0,MODE_EMA,PRICE_CLOSE,0) 
             ) manageArr(j+1, clArrowSell, 234, true );
          }
      }
    return(0);
  }
// -------------------------------------------------------------------------------------------------------------
void manageArr(int j, color clr, int theCode, bool up)   
  {
    string objName = PREFIX + Time[j];
    double gap  = 3.0*iATR(NULL,0,20,j)/4.0;
    
    ObjectCreate(objName, OBJ_ARROW,0,Time[j],0);
    ObjectSet   (objName, OBJPROP_COLOR, clr);  
    ObjectSet   (objName, OBJPROP_ARROWCODE,theCode);
    ObjectSet   (objName, OBJPROP_WIDTH,ArrowSize);  
    if ( up )
      ObjectSet(objName,OBJPROP_PRICE1,Open[j]+gap);
    else  
      ObjectSet(objName,OBJPROP_PRICE1,Close[j] -gap);
      
      ChartRedraw();
  }
// -------------------------------------------------------------------------------------------------------------

 
Ivan Butko #:


Неа, всё равно: на одном ТФ рисуются только красные стрелки. На другом - только синие. 

А в тестере - обе. 


Я бы переписал код на новый лад и стрелки сделал бы буферными.
 
Tretyakov Rostyslav #:
Я бы переписал код на новый лад и стрелки сделал бы буферными.
Кроме всего прочего это индикатор по Фишеру и он переписывает историю, так что то что есть в моменте на истории может не быть.
 
Ivan Butko #:


Неа, всё равно: на одном ТФ рисуются только красные стрелки. На другом - только синие. 

А в тестере - обе. 

Блин, нашёл

Здесь нулевые индексы у индикаторов

for ( int j = limit2; j >= 0; j-- )
      {
        if ( Arrow )
          {
            if ( ExtBuffer0[j+SIGNAL_BAR+1] > 0.0  && ExtBuffer0[j+SIGNAL_BAR] < 0.0
            && iRSI(Symbol(),PERIOD_CURRENT,3,PRICE_CLOSE,0) >80
            && iMA(Symbol(),PERIOD_CURRENT,9,0,MODE_EMA,PRICE_CLOSE,0) > iMA(Symbol(),PERIOD_CURRENT,21,0,MODE_EMA,PRICE_CLOSE,0 
             ) manageArr(j+1, clArrowBuy,  233, false);
            if ( ExtBuffer0[j+SIGNAL_BAR+1] < 0.0  && ExtBuffer0[j+SIGNAL_BAR] > 0.0
            && iRSI(Symbol(),PERIOD_CURRENT,3,PRICE_CLOSE,0) <20
            && iMA(Symbol(),PERIOD_CURRENT,9,0,MODE_EMA,PRICE_CLOSE,0) < iMA(Symbol(),PERIOD_CURRENT,21,0,MODE_EMA,PRICE_CLOSE,0) 
             ) manageArr(j+1, clArrowSell, 234, true );
          }
      }

 
Ivan Butko #:

Блин, нашёл

Здесь нулевые индексы у индикаторов


Это не случайно, как я писал выше Фишер рисует, поэтому сигналы только в моменте.