Hatalar, hatalar, sorular - sayfa 2270

 

Fark ne

SetIndexBuffer(1,ValuesPainting,INDICATOR_COLOR_INDEX);

ve

PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);

?

Kodu büküyorum ve hareketli ortalamayı nasıl renklendireceğimi bulamıyorum.

Bir renk yükselirse, diğeri düşerse.

Birisi bir örnek gösterebilir mi?

 
Vladimir Pastushak :

Kodu büküyorum ve hareketli ortalamayı nasıl renklendireceğimi bulamıyorum.

Bir renk yükselirse, diğeri düşerse.

Birisi bir örnek gösterebilir mi?

Ben sadece MQL5'i öğreniyorum, ancak bunun gibi bir şey olmalı:

 //+------------------------------------------------------------------+
//|                                                         myMA.mq5 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link        "https://www.mql5.com/ru/users/igorm"
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots    2
//--- plot Red
#property indicator_label1    "Red"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    2
//--- plot Blue
#property indicator_label2    "Blue"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrBlue
#property indicator_style2    STYLE_SOLID
#property indicator_width2    2
//--- input parameters
input int       PeriodMA= 10 ;
//--- indicator buffers
double          RedBuffer[];
double          BlueBuffer[];
int handleMA;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   ArraySetAsSeries (RedBuffer, true );
   ArraySetAsSeries (BlueBuffer, true );
   SetIndexBuffer ( 0 ,RedBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,BlueBuffer, INDICATOR_DATA );
   handleMA= iMA ( NULL , 0 ,PeriodMA, 0 , MODE_SMA , PRICE_CLOSE );

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {
//---
   int i,limit;
   double ma[];
   if (prev_calculated== 0 ) limit=rates_total- 2 ; else limit=rates_total-prev_calculated;
   for (i=limit;i>= 0 ;i--)
     {
       CopyBuffer (handleMA, 0 ,i, 2 ,ma);
       if (ma[ 0 ]<ma[ 1 ])
        {
         RedBuffer[i]=ma[ 0 ]; BlueBuffer[i]= EMPTY_VALUE ;
        }
       else
        {
         BlueBuffer[i]=ma[ 0 ];RedBuffer[i]= EMPTY_VALUE ;
        }
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
 
Derleme sırasında hata:
 template < typename T>
void f( T& ) {}
void g1() { class A {} a; f( a ); } //(1)//нормально 
void g2() { class A {} a; f( a ); } //(2)//Error: '&' - parameter conversion not allowed

Ve (1) ve (2) arasındaki temel fark nedir? Neden bir durumda yanlış, diğerinde normal?

 
A100 :

Ve (1) ve (2) arasındaki temel fark nedir? Neden bir durumda yanlış, diğerinde normal?

Bu nedenle, fonksiyonların içindeki sınıflar aynı ada ancak farklı içeriğe sahip olabilir. İkinci varyantta imza f anlaşılmaz.

İlkinden sonra kararını verdi. Ve ikinciden sonra, aynı adla yeniden tanımlamayın.

 
Vladimir Pastushak :

Fark ne

SetIndexBuffer(1,ValuesPainting,INDICATOR_COLOR_INDEX);

ve

PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrBlue);

?

Kodu büküyorum ve hareketli ortalamayı nasıl renklendireceğimi bulamıyorum.

Bir renk yükselirse, diğeri düşerse.

Birisi bir örnek gösterebilir mi?

 //+------------------------------------------------------------------+
//|                                                      ColorMA.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property description "Colored Moving Average"
#property indicator_chart_window
#property indicator_buffers 2      // Всего буферов 2 - рисуемый буфер и буфер цвета
#property indicator_plots    1      // Один рисуемый буфер
//--- plot ClrMA
#property indicator_label1    "Colored MA"
#property indicator_type1    DRAW_COLOR_LINE
#property indicator_color1    clrBlue , clrRed , clrDarkGray
#property indicator_style1    STYLE_SOLID
#property indicator_width1    2
//--- input parameters
input uint                  InpPeriod         =   14 ;             // Период расчёта
input ENUM_MA_METHOD        InpMethod         =   MODE_SMA ;       // Метод расчёта
input ENUM_APPLIED_PRICE    InpAppliedPrice   =   PRICE_CLOSE ;   // Цена расчёта
//--- indicator buffers
double          BufferMA[];       // Рисуемый буфер
double          BufferColors[];   // Буфер цвета
//--- global variables
int             period;
int             handle_ma;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- set global variables
   period= int (InpPeriod< 1 ? 1 : InpPeriod);
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,BufferMA, INDICATOR_DATA );             // Рисуемый буфер
   SetIndexBuffer ( 1 ,BufferColors, INDICATOR_COLOR_INDEX ); // Буфер цвета
//--- setting indicator parameters
   IndicatorSetString ( INDICATOR_SHORTNAME , "Colored MA" );
   IndicatorSetInteger ( INDICATOR_DIGITS , Digits ());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries (BufferMA, true );
   ArraySetAsSeries (BufferColors, true );
//--- create MA's handles
   ResetLastError ();
   handle_ma= iMA ( NULL , PERIOD_CURRENT ,period, 0 ,InpMethod,InpAppliedPrice);
   if (handle_ma== INVALID_HANDLE )
     {
       Print ( "Не удалось создать хэндл iMA(" ,( string )period, ") " , EnumToString (InpAppliedPrice), ". Ошибка: " , GetLastError ());
       return INIT_FAILED ;
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//--- Проверка и расчёт количества просчитываемых баров
   if (rates_total< fmax (period, 4 )) return 0 ;   // три бара и меньше в расчёт не берём
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     {
       /*
      Почему больше 1. Например, загрузилась история, и разница будет больше одного.
      Если все нормально, то разница rates_total-prev_calculated равна или 0, или 1
      0 - пришел новый тик, новый бар формироваться не начал.
      1 - пришел новый тик и начал формироваться новый бар
      */
      limit=rates_total- 2 ; // rates_total - это Bars для текущего символа и периода
                           // Если не требуется проверять в цикле расчёта i+число, то limit=rates_total-1 (чтобы не вылететь за пределы массива), 
                           // иначе, если требуется проверять, например, i+period, то limit=rates_total-period-1
       ArrayInitialize (BufferMA, EMPTY_VALUE );
       ArrayInitialize (BufferColors, 2 );
     }
//--- Подготовка данных - в данном случае это и есть расчёт МА - копирование в буфер её значений из хэндла
   int count=(limit> 1 ? rates_total : 1 );       // если новый бар, то копируем всю доступную историю, иначе - только один текущий
   int copied= CopyBuffer (handle_ma, 0 , 0 ,count,BufferMA);
   if (copied!=count) return 0 ;   // Если скопировать не удалось - выходим до следующего тика

//--- Установка цвета линии
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
       // Тут всё просто: 
       // У нас задано три цвета: #property indicator_color1  clrBlue,clrRed,clrDarkGray
       // 1. если МА на текущем баре выше чем МА на прошлом, то цвет под номером 0
       // 2. если МА на текущем баре ниже чем МА на прошлом, то цвет под номером 1
       // 3. иначе - цвет под номером 2 (в блоке инициализации в строке 86 задаётся этот цвет начальным для отображения линии, что, впрочем делать там не обязательно)
      BufferColors[i]=(BufferMA[i]>BufferMA[i+ 1 ] ? 0 : BufferMA[i]<BufferMA[i+ 1 ] ? 1 : 2 );
     }
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

Size PM'de biraz çarpık bir örnek gönderdim (Kopyala-Yapıştır söveleri düzeltmedi)

 
fxsaber :

Böylece fonksiyonlar içindeki sınıflar aynı ada ancak farklı içeriğe sahip olabilir. İkinci varyantta imza f anlaşılmaz.

Hepsi aynı... ve işe yarıyor

 #define CLASS \
class A { \
public : \
         void f( int i ) { Print ( i ); } \
         int a; \
}
void g1() { CLASS a; a.f( 1 ); }
void g2() { CLASS a; a.f( 2 ); }
void OnStart ()
{
        g1();
        g2();
}

C ++'daki önceki örnek işe yarıyor ... bu, oradaki imzaları bir şekilde çözdükleri anlamına geliyor

 
Derleme sırasında hata:
 void OnStart ()
{
         struct A1 { int i; }; //(1)
         struct B1 : A1 {};     //(2)
         class   A2 { int i; }; //(3)
         class   B2 : A2 {};     //(4)//Error: 'B2' - struct undefined
}

Ve (1)(2) ve (3)(4) arasındaki temel fark nedir???

 
Sinyal hizmetinde bir hata var. Omuz değiştirdiğinizde tam tersini gösteriyor. Diyelim ki 1:500'den 1:100'e değiştiysem, kaldıracın 1:100'den 1:500'e değiştiğini gösteriyor. Bu konuda bir şeyler yapılması gerekiyor...)
 
A100 :

Hepsi aynı... ve işe yarıyor

Yani burada tamamen farklı bir durum var - şablon yok.

C ++'daki önceki örnek işe yarıyor ... bu, oradaki imzaları bir şekilde çözdükleri anlamına geliyor

C++ burada ne çıktı verir?

 template < typename T>
void f( T& ) { Print ( __FUNCSIG__ ); }
void g1() { class A { int i; } a; f( a ); }
void g2() { class A { double d; } a; f( a ); }

Bunun MQL5'te çalışması için aynı değil iki farklı çıktı diziniz olması gerekir. Ama o zaman imzaların oluşumu için tamamen farklı bir mekanizma olmalı. C++ baskıda aynı sonucu veriyorsa, __FUNCSIG__ fiyatı önemli ölçüde düşer.

 

Aşağıdaki davranışa ne sebep olabilir?

derlerseniz gösterge düzgün çalışır, yeniden derlerseniz gösterge düzgün çalışmıyor. Test cihazında düzgün çalışıyor mu?