오류, 버그, 질문 - 페이지 2133

 
CCanvas::Attach에 오류가 있습니다. 선택한 줄이 없습니다
 //+------------------------------------------------------------------+
//| 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 );
  }
 
오, 당신은 Nikolai Semko에게 좋은 스무딩, 아마도 다른 비전을 가진 캔버스의 대체 버전을 제출하도록 요청해야 하고 기사를 제출해야 하는데 갑자기 동의합니까?
 
Aleksandr Teleguz :

안녕하세요. 오류의 원인을 찾을 수 있도록 도와주세요. 표시기를 mql4에서 mql5로 옮기고 있습니다. iHigh 기능의 경우 다음 "쉘"을 사용합니다.

결과적으로 Symbol() 함수 에서 반환된 문자열이 기호 매개변수로 전달되었지만 오류 4301: "알 수 없는 기호"가 발생합니다. 다음은 iHigh를 호출하는 함수에 대한 코드입니다.

"나"는 누구입니까? 루프 이전의 의미는 무엇입니까?


iHigh 전에 ResetLastError를 호출하고 있습니까?

 
Vladimir Karputov :

"나"는 누구입니까? 루프 이전의 의미는 무엇입니까?


iHigh 전에 ResetLastError를 호출하고 있습니까?

i 값은 OnCalculate 함수 에서 반복됩니다.

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


나는 ResetLastError를 호출 하지 않았고, 이제 그것을 넣었습니다 - 오류 코드는 동일합니다. OnCalculate 함수에서는 배열 low[i], high[i] 등을 사용하고 외부 함수에서는 iHigh, iLow 등을 사용합니다.

 
Aleksandr Teleguz :

i 값은 OnCalculate 함수 에서 반복됩니다.


나는 ResetLastError를 호출 하지 않았고, 이제 그것을 넣었습니다 - 오류 코드는 동일합니다. OnCalculate 함수에서는 배열 low[i], high[i] 등을 사용하고 외부 함수에서는 iHigh, iLow 등을 사용합니다.

실행할 수 있는 MQL5 코드를 제공하고 오류가 발생하는 조건을 설명합니다.

 
Vladimir Karputov :

실행할 수 있는 MQL5 코드를 제공하고 오류가 발생하는 조건을 설명합니다.

내 터미널에 문제가 있는 것 같습니다. 동일한 데모 계정 으로 다른 mt5의 넷북에서 동일한 코드를 실행했습니다. 오류가 없습니다.

다음은 코드 자체입니다.

/+------------------------------------------------------------------+
//|                                                      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 :

내 터미널에 문제가 있는 것 같습니다. 동일한 데모 계정 으로 다른 mt5의 넷북에서 동일한 코드를 실행했습니다. 오류가 없습니다.

다음은 코드 자체입니다.

참고: 귀하는 MQL5 포럼의 주요 섹션에 게시하고 있으며 여기에서 MQL5 언어가 논의됩니다. 그러나 MQL4를 위한 특별한 섹션이 있습니다: MQL4 및 MetaTrader 4 . 오른쪽 섹션에 코드를 즉시 게시하십시오. 더욱이 게시자가 사용자를 존중하고 언어 유형이 표시되는 헤더에 코드를 즉시 게시할 때 더 좋습니다.

 
MQL5입니다.
 

안녕하세요!
그래픽 개체의 시간 프레임을 변경할 수 없습니다. 터미널이 잘못된 것인지 제가 잘못 알고 있는 것인지 모르겠습니다.
인증 코드를 제공합니다

 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 - 버그. 지시자
 #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 );
}


결과가 잘못되었습니다

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


그러나 강조 표시된 줄을 주석 처리하자마자 표시기가 올바르게 작동하기 시작합니다.

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


어떤 이유로 OnInit의 ChartGetInteger는 Chart 개체의 속성에 영향을 줍니다.