Hatalar, hatalar, sorular - sayfa 2133

 
CCanvas::Attach'ta hata. Seçilen satır eksik
 //+------------------------------------------------------------------+
//| Attach new object without bitmap resource                        |
//+------------------------------------------------------------------+
bool CCanvas::Attach( const long chart_id, const string objname, const int width, const int height, ENUM_COLOR_FORMAT clrfmt= COLOR_FORMAT_XRGB_NOALPHA )
  {
   if ( OBJ_BITMAP_LABEL == ObjectGetInteger (chart_id,objname, OBJPROP_TYPE ))
     {
       string rcname= ObjectGetString (chart_id,objname, OBJPROP_BMPFILE );
       if ( StringLen (rcname)== 0 && width> 0 && height> 0 && ArrayResize (m_pixels,width*height)> 0 )
        {
         ZeroMemory (m_pixels);
         if ( ResourceCreate ( "::" +objname,m_pixels,width,height, 0 , 0 , 0 ,clrfmt) && 
             ObjectSetString (chart_id,objname, OBJPROP_BMPFILE , "::" +objname))
           {
             m_chart_id = chart_id;
            m_width=width;
            m_height=height;
            m_objname=objname;
            m_rcname= "::" +objname;
            m_format=clrfmt;
            m_objtype= OBJ_BITMAP_LABEL ;
             //--- success
             return ( true );
           }
        }
     }
//--- failed
   return ( false );
  }
 
Oh, Nikolai Semko'dan tuvalin alternatif bir versiyonunu iyi bir yumuşatma, belki de farklı bir vizyonla dosyalamasını ve bir makaleyi dosyalamasını istemeniz gerekiyor, aniden kabul ediyor musunuz?
 
Aleksandr Teleguz :

Merhaba. Lütfen hatanın nedenini bulmama yardım edin. Göstergeyi mql4'ten mql5'e aktarıyorum. iHigh işlevleri için aşağıdaki "kabuğu" kullanıyorum:

Sonuç olarak, Symbol() işlevi tarafından döndürülen dize sembol parametresi olarak iletilmesine rağmen 4301: "Bilinmeyen sembol" hatası alıyorum. İşte iHigh'ı çağıran bir işlev için bir kod parçası

"Ben" kim? Döngüden önceki anlamı nedir?


iHigh'dan önce ResetLastError'a mı çağrı yapıyorsunuz?

 
Vladimir Karputov :

"Ben" kim? Döngüden önceki anlamı nedir?


iHigh'dan önce ResetLastError'a mı çağrı yapıyorsunuz?

i değeri OnCalculate işlevinde döngüye alınır

 for ( int i=rates_total-prev_calculated; i> 0 && ! IsStopped (); i--)
     {
       if (i>rates_total- 10 ) continue ;


ResetLastError'u aramadım, şimdi koydum - hata kodu aynı. OnCalculate işlevinde, low[i], high[i] vb. dizilerini ve iHigh, iLow, vb. harici işlevlerde kullanıyorum.

 
Aleksandr Teleguz :

i değeri OnCalculate işlevinde döngüye alınır


ResetLastError'u aramadım, şimdi koydum - hata kodu aynı. OnCalculate işlevinde, low[i], high[i] vb. dizilerini ve iHigh, iLow, vb. harici işlevlerde kullanıyorum.

Çalıştırılabilen ve hatanın oluştuğu koşulları açıklayan MQL5 kodunu sağlayın.

 
Vladimir Karputov :

Çalıştırılabilen ve hatanın oluştuğu koşulları açıklayan MQL5 kodunu sağlayın.

Terminalimde bir sorun var gibi görünüyor. Aynı kodu bir netbook'ta başka bir mt5'te, aynı demo hesabında çalıştırın - hata yok.

İşte kodun kendisi:

/+------------------------------------------------------------------+
//|                                                      Strelka.mq4 |
//|                                                Alexander Teleguz |
//|                                            https://investmany.ru |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 12
#property indicator_plots    6

#define OP_SELL 1

int OnInit ()
{
  
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   
}
//+------------------------------------------------------------------+

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[])
{
   ArraySetAsSeries (time, true );
   ArraySetAsSeries (open, true );
   ArraySetAsSeries (high, true );
   ArraySetAsSeries (low, true );
   ArraySetAsSeries (close, true );
   
   for ( int i = rates_total-prev_calculated; i> 0 && ! IsStopped (); i--)
   {
       if (i>rates_total- 10 ) continue ;
       bool filtr = Filtr1( OP_SELL , i);
   }
      
   return (rates_total);
}
//+------------------------------------------------------------------+
bool Filtr1( int type, int i)
{
   ENUM_TIMEFRAMES tf = Period ();
   string symbol = Symbol ();
   int i1, i2= 0 ; //индекс внешнего бара, счетчик
   for (i1=i+ 1 ; i2< 6 ; i1++)
   {
       if ( iLow (symbol, tf, i1)<= iLow (symbol, tf, i1+ 1 )&&
         iHigh (symbol, tf, i1)>= iHigh (symbol, tf, i1+ 1 )) //если бар внешний
      {
         break ; //выход из цикла
      }
       else
      {
         i2++;
      }
   }
   return ( false );
}
//+------------------------------------------------------------------+
double iHigh ( string symbol, ENUM_TIMEFRAMES tf, int index)
{
   if (index < 0 ) return (- 1 );
   double Arr[ 1 ];
   if ( CopyHigh (symbol,tf, index, 1 , Arr)> 0 ) 
         return (Arr[ 0 ]);
   else
   {
       Print ( __FUNCTION__ , GetLastError ());
       return (- 1 );
   } 
}
//+------------------------------------------------------------------+
double iLow ( string symbol, ENUM_TIMEFRAMES tf, int index)
{
   if (index < 0 ) return (- 1 );
   double Arr[ 1 ];
   if ( CopyLow (symbol,tf, index, 1 , Arr)> 0 ) 
         return (Arr[ 0 ]);
   else
   {
       Print ( __FUNCTION__ , GetLastError ());
       return (- 1 );
   }
}
//+------------------------------------------------------------------+
 
Aleksandr Teleguz :

Görünüşe göre terminalle ilgili bir şeyim var. Aynı kodu bir netbook'ta başka bir mt5'te, aynı demo hesabında çalıştırın - hata yok.

İşte kodun kendisi:

Lütfen dikkat: MQL5 forumunun ana bölümünde gönderi paylaşıyorsunuz - ve burası MQL5 dilinin tartışıldığı yerdir. Ama MQL4 için özel bir bölüm var: MQL4 ve MetaTrader 4 . Lütfen kodu hemen sağ bölümde yayınlayın. Daha da iyisi, yayıncı kullanıcılara saygı duyduğunda ve kodu, dil türünün görünür olduğu başlıkta hemen yayınladığında.

 
Bu MQL5.
 

Merhaba!
Grafiksel bir nesnenin zaman çerçevesini değiştiremem - terminalin mi yanlış olduğunu anlamıyorum.
doğrulama kodu veriyorum

 int OnStart ( void )
{
         double price;
         datetime time0, time1;
         string obj_name= "test_of_line_timeframe_setting" ;
         ENUM_TIMEFRAMES tf1, tf2;

         // берем последнюю цену и время 
         MqlRates rates[];
         int copied= CopyRates ( NULL , 0 , 0 , 3 ,rates);
        price= rates[ 0 ].open;
        time0= rates[ 0 ].time;
        
         // рисуем линию
         ObjectCreate ( 0 , obj_name, OBJ_HLINE , 0 , time0, price);
// --- отображение на переднем плане (false) или background (true)
     ObjectSetInteger ( 0 , obj_name, OBJPROP_BACK , false );
// --- Включить (true) или отключить (false) режим для перемещения меток с помощью мыши
     ObjectSetInteger ( 0 , obj_name, OBJPROP_SELECTABLE , true );
     ObjectSetInteger ( 0 , obj_name, OBJPROP_SELECTED , false );
// --- Скрыть (true) или отобразить (false) графический объект в списке объектов
     ObjectSetInteger ( 0 , obj_name, OBJPROP_HIDDEN , false );
// --- Установите порядок приоритета для получения события щелчка мыши по диаграмме
     ObjectSetInteger ( 0 , obj_name, OBJPROP_ZORDER , 0 );

        
         // устанавливаем видимость на дневном таймфрэйме
         ObjectSetInteger ( 0 ,obj_name, OBJPROP_PERIOD , PERIOD_D1 ); 
         // считываем видимость 
        tf1= ObjectGetInteger ( 0 ,obj_name, OBJPROP_PERIOD );

         // устанавливаем видимость на часовом таймфрэйме
         ObjectSetInteger ( 0 ,obj_name, OBJPROP_PERIOD , PERIOD_H1 ); 
         // считываем видимость 
        tf2= ObjectGetInteger ( 0 ,obj_name, OBJPROP_PERIOD );

         if (tf1==tf2) Alert ( "таймфрейм изменить не удается" );
         else Alert ( "таймфрейм успешно изменен" );

         ObjectDelete ( 0 ,obj_name); 

         return ( 0 );
}
 
OBJ_CHART - hata. Gösterge
 #property indicator_chart_window

#property indicator_buffers 0
#property indicator_plots indicator_buffers

#define PRINT(A) Print ( #A + " = " + ( string )(A))

// Создаем OBJ_CHART
const string Name = __FILE__ ;
const bool Init = ObjectCreate ( 0 , Name, OBJ_CHART , 0 , 0 , 0 ) && EventSetTimer ( 1 );
const long Chart = ObjectGetInteger ( 0 , Name, OBJPROP_CHART_ID );

void OnInit ()
{  
   // Задаем свойства объекта
   ObjectSetInteger ( 0 , Name, OBJPROP_XSIZE , 400 ); // Ширина
   ObjectSetInteger ( 0 , Name, OBJPROP_YSIZE , 250 ); // Высота
   ChartSetInteger (Chart, CHART_SHOW , false );

   ChartGetInteger (Chart, CHART_WIDTH_IN_PIXELS ); // Если закомментировать строку, то все будет работать правильно
}

void OnDeinit ( const int )
{
   ObjectDelete ( 0 , Name);
}

void OnTimer ()
{
   // Считываем свойства объекта
  PRINT( ChartGetInteger (Chart, CHART_WIDTH_IN_PIXELS ));   // Правильное значение - 400
  PRINT( ChartGetInteger (Chart, CHART_HEIGHT_IN_PIXELS )); // Правильное значение - 250

   EventKillTimer ();
}

int OnCalculate ( const int , const int , const int , const double & [] )
{  
   return ( 0 );
}


Sonuç yanlış

 ChartGetInteger (Chart, CHART_WIDTH_IN_PIXELS ) = 330
ChartGetInteger (Chart, CHART_HEIGHT_IN_PIXELS ) = 226


Ancak, vurgulanan satırı yorumladığınız anda gösterge doğru şekilde çalışmaya başlar.

 ChartGetInteger (Chart, CHART_WIDTH_IN_PIXELS ) = 400
ChartGetInteger (Chart, CHART_HEIGHT_IN_PIXELS ) = 250


Bazı nedenlerden dolayı OnInit'teki ChartGetInteger, Chart nesnesinin özelliklerini etkiler.