エラー、バグ、質問 - ページ 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);
  }
 
そうだ、Nikolay Semkoに頼んで、アンチエイリアスをうまく使った別バージョンのkanvasを書いてもらって、記事を書いてもらおうかな。
 
Aleksandr Teleguz:

こんにちは。このエラーの原因究明をお願いします。mql4からmql5にインジケータを変換しようとしています。iHighの機能については、以下の「シェル」を使用しています。

その結果、Symbol()関数が 返す文字列がsymbolパラメータとして渡されるにもかかわらず、エラー4301: "Unknown symbol "が発生しました。以下は、iHighを呼び出す関数のコードの一部です。

i "とは?ループの前の値は何ですか?


iHighの 前にResetLastErrorコールを行っていませんか?

 
Vladimir Karputov:

その "i "とは誰なのか?ループの前の値は何ですか?


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とMetaTrader4という 特別なセクションがあります。コードは適切なセクションで公開してください。出版社がユーザーを尊重し、言語タイプを表示するヘッダーにコードを公開すると、さらによいでしょう。

 
これが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は、なぜかグラフィカルオブジェクトのプロパティに影響を与えます。