Fehler, Irrtümer, Fragen - Seite 2133

 
Fehler in CCanvas::Attach. Fehlende hervorgehobene Zeile
//+------------------------------------------------------------------+
//| 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, ich sollte Nikolay Semko bitten, eine alternative Version des Kanvas zu schreiben, mit gutem Anti-Aliasing, vielleicht eine andere Vision, und einen Artikel schreiben, vielleicht wird er es tun?
 
Aleksandr Teleguz:

Hallo. Bitte helfen Sie mir, die Ursache für diesen Fehler zu finden. Ich versuche, einen Indikator von mql4 nach mql5 zu konvertieren. Ich verwende die folgende "Shell" für iHigh-Funktionen:

Infolgedessen erhalte ich die Fehlermeldung 4301: "Unbekanntes Symbol", obwohl eine von der Funktion Symbol() zurückgegebene Zeichenfolge als Symbolparameter übergeben wird. Hier ist ein Codefragment der Funktion, die iHigh aufruft

Wer ist "i"? Wie hoch ist der Wert vor der Schleife?


Rufen Sie ResetLastError voriHigh auf?

 
Vladimir Karputov:

Wer ist das "i"? Wie hoch ist der Wert vor der Schleife?


Machen Sie einen ResetLastError-Aufruf voriHigh?

Der Wert von i wird in der Funktion OnCalculate in einer Schleife durchlaufen

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


Ich habe ResetLastError nicht aufgerufen, jetzt habe ich es getan - der Fehlercode ist der gleiche. Ich verwende Arrays low[i], high[i] usw. in der Funktion OnCalculate und iHigh, iLow usw. in externen Funktionen.

 
Aleksandr Teleguz:

Der Wert von i wird in der Funktion OnCalculate in einer Schleife verarbeitet


Ich habe ResetLastError nicht aufgerufen, jetzt habe ich es getan - der Fehlercode ist der gleiche. Ich verwende die Arrays low[i], high[i] usw. in der Funktion OnCalculate und iHigh, iLow usw. in externen Funktionen.

Geben Sie den MQL5-Code an, der ausgeführt werden kann, und beschreiben Sie die Bedingungen, unter denen der Fehler auftritt.

 
Vladimir Karputov:

Geben Sie MQL5-Code an, der ausgeführt werden kann, und beschreiben Sie die Bedingungen, unter denen der Fehler auftritt.

Mit meinem Terminal scheint etwas nicht in Ordnung zu sein. Führte den gleichen Code auf Netbook auf einem anderen mt5, gleichen Demo-Konto - kein Fehler.

Hier ist der Code selbst:

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

Mit meinem Terminal scheint etwas nicht in Ordnung zu sein. Führte den gleichen Code auf Netbook auf einem anderen mt5, gleichen Demo-Konto - kein Fehler.

Hier ist der Code selbst:

Hinweis: Sie schreiben im Hauptbereich des MQL5-Forums, hier wird MQL5 diskutiert. Für MQL4 gibt es einen speziellen Abschnitt:MQL4 und MetaTrader 4. Bitte veröffentlichen Sie Ihren Code in dem entsprechenden Bereich. Noch besser ist es, wenn der Herausgeber die Nutzer respektiert und den Code sofort in der Kopfzeile veröffentlicht, wo die Art der Sprache zu sehen ist.

 
Dies ist MQL5.
 

Hallo!
Ich kann den Zeitrahmen eines grafischen Objekts nicht ändern - ich weiß nicht, ob das Terminal einen Fehler macht oder ich.
Hier ist der Prüfcode

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 Fehler. Indikator
#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);
}


Das Ergebnis ist falsch

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


Aber sobald Sie die ausgewählte Zeile auskommentieren, funktioniert der Indikator wieder korrekt

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


Aus irgendeinem Grund beeinflusst ChartGetInteger in OnInit die Eigenschaften eines grafischen Objekts.