MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 957

 
Igor Kryuchkov :

Ctrl+B --> "Tümü" düğmesi - bahsettiğim tek nesne var. Sorun şu ki, Tuval olmadan normal şekilde bir DİKDÖRTGEN oluşturursam . Gerekli sayıda RECTANGLE nesnesi oluşturulur.

Nedense Canvas aracılığıyla yalnızca bir tane oluşturulur. Bu neden olabilir? Her RECTANGLE için benzersiz bir ad yapıyorum .


Programcı için teşekkürler.

İsminizin neden benzersiz olduğunu düşünüyorsunuz? Yeni bir nesne oluşturmadan önce kontrol ettiniz mi? Ve nesne oluşturmanın sonucunu kontrol ediyor musunuz? Bunun hata kodu nedir?

 
Artyom Trishkin :

Tamamen yeniden üretilebilir kod yok - belirli bir tartışma yok. Orada ne yaptığını bilmiyorum. En basitinden bir tür problem yarattı.

 #property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window
#include <Canvas\Canvas.mqh>
CCanvas C;

int History = 5000 ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
        
//---
   return ( INIT_SUCCEEDED );
  }
  
void OnDeinit ( const int reason)
{


}  
  
//+------------------------------------------------------------------+
//| 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[])
  {
//---




   

           int BarsCounted = IndicatorCounted();
           if (BarsCounted < 0 ) return (- 1 );
           if (BarsCounted > 0 ) BarsCounted--;
           int BarsTotal = Bars - BarsCounted;
           if ( BarsTotal > History ) BarsTotal = History;
   

           for ( int i = BarsTotal- 1 ; i >= 1 ; i--)
           { 
           
         
         
               double rsi = iRSI ( NULL , 0 , 14 , PRICE_CLOSE , i);
               
         
               
               if (rsi > 70 ) {
         
                  C.CreateBitmap( 0 , 0 , i, Time[i+ 5 ], Close[i+ 1 ], 50 , 70 , COLOR_FORMAT_ARGB_NORMALIZE );
                  C.Rectangle( 10 , 40 , 70 , 80 , ColorToARGB ( clrRed , 200 ));
                  C.Update( true ); 
                  
                   Print (i);
                  
               } 
           
               
           
         
           
           }
  

  
//--- return value of prev_calculated for next call
   return (rates_total);
  }
 
Igor Kryuchkov :

Yeniden başlatma ne anlama geliyor?

Global değişkenleri kullanarak açılış emirleri hesaplamam var. Örneğin, maliyeti 5 ise, o zaman beş sipariş açılmıştır ve altıncı sipariş yükselmeyi beklemektedir. Derlerseniz, sayaç 5'e ayarlanır, daha sonra zaten açık olmasına rağmen 5 ekstra sipariş açar. Aynı şey, terminali kapatıp açarsanız da olur. Nasıl düzeltilir? .

 
Rustam Bikbulatov :

Global değişkenleri kullanarak açılış emirleri hesaplamam var. Örneğin, maliyeti 5 ise, o zaman beş sipariş açılmıştır ve altıncı sipariş yükselmeyi beklemektedir. Derlerseniz, sayaç 5'e ayarlanır, daha sonra zaten açık olmasına rağmen 5 ekstra sipariş açar. Aynı şey, terminali kapatıp açarsanız da olur. Nasıl düzeltilir? .

int OnInit() işlevinde, global bir değişkenin var olup olmadığını kontrol etmeniz gerekir, varsa ve örneğin sıfırdan büyükse, onu sıfır yaparız.

 
Igor Kryuchkov :
Dört mü?
 
Artyom Trishkin :
Dört mü?

Evet. Canvas'ı sorduğumda MQL4'ü fark ettim.

 
Artyom Trishkin :
Dört mü?
Sanırım 4'te de çalışması gerekiyor.
 
Igor Kryuchkov :
Sanırım 4'te de çalışması gerekiyor.
 //+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|              Copyright 2019, Artem A. Trishkin, Skype artmedia70 |
//|                         https://www.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Artem A. Trishkin, Skype artmedia70"
#property link        "https://www.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
#property indicator_chart_window
#include <Arrays\ArrayObj.mqh>
#include <Canvas\Canvas.mqh>
class CCanvObj : public CObject
  {
public :
   CCanvas           m_canvas;
  };
int History = 5000 ;
string prefix= MQLInfoString ( MQL_PROGRAM_NAME )+ "_" ;
CArrayObj list_canvas;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom deindicator initialization function                       |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- indicator buffers mapping
   ObjectsDeleteAll ( 0 ,prefix);
//---
   return ;
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     {
      limit=rates_total- 1 ;
     }
//--- Цикл расчёта индикатора
   for ( int i= fmin (limit,History); i>= 0 ; i--)
     {
       double rsi= iRSI ( NULL , PERIOD_CURRENT , 14 , PRICE_CLOSE ,i);
       if (rsi> 70 )
        {
         //--- Создаём новый объект CCanvas
         CCanvObj *obj= new CCanvObj();
         if (obj== NULL )
             continue ;
         if (!list_canvas.Add(obj))
             continue ;
         string name=prefix+( string )i;
         //--- Создаём ресурс Bitmap с именем name
         if (obj.m_canvas.CreateBitmap( 0 , 0 ,name,time[i+ 5 ],close[i+ 1 ], 50 , 70 , COLOR_FORMAT_ARGB_NORMALIZE ))
           {
            obj.m_canvas.Rectangle( 0 , 0 , 49 , 69 , ColorToARGB ( clrRed , 200 ));
            obj.m_canvas.Update( true ); 
           }
        }
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin :

Teşekkürler, işe yarıyor.

Grafiği ölçeklerken dikdörtgen de küçültülebilir mi?


Ölçek izlenir. Ancak gösterge bunu yalnızca yeni bir onay işaretiyle anlar,

büyük bir gecikme var. Bu konuda ne yapılabilir?

 
Igor Kryuchkov :

Teşekkürler, işe yarıyor.

Grafiği ölçeklerken dikdörtgen de küçültülebilir mi?


Ölçek izlenir. Ancak gösterge bunu yalnızca yeni bir onay işaretiyle anlar,

büyük bir gecikme var. Bu konuda ne yapılabilir?

  1. Ölçeklerken yeniden boyutlandırmaktan kurtulmak istediniz...
  2. OnChartEvent() kenelere bağlı değildir
  3. Gerekli grafik olayını kaydederken OnChartEvent() içinde oluşturulan tüm nesneleri güncelleyin. Aksi takdirde - yalnızca yeni bir onay işareti güncellenecektir.