"ダミー "からの質問 - ページ 262

 
agvozdezkiy:

MQLの勉強を始めたばかりですが、ここではiMAを描き、時間軸上のマウスポインタのある地点でiMAのチャートに接線(非常に近い)を引くEAを書きました

問題点1Expert Advisorの動作が非常に遅い。接線の再描画時間が長く、マウスの動きに追従しない...ということです。

私のバージョンを見てください。

//+------------------------------------------------------------------+
//|                                                Antonio_Mouse.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
int Handle_iMA;
double Buffer_iMA[];
string Name_iMA;
datetime TimeArray[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---Устанавливаем свойство графика посылать события при движении мышы     
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---Рисуем индикатор iMA
   Handle_iMA=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE);
   if(Handle_iMA!=INVALID_HANDLE)
     {
      ChartIndicatorAdd(0,0,Handle_iMA);
      Print("iMA скопировано в буффер.");
     }
//---
   string name="Line";
   ObjectCreate(0,name,OBJ_TREND,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clrRed);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,10);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
   ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,false);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(Handle_iMA);
  }
datetime CarrentBarTime[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
double PriceCoord,Angle;
datetime TimeCoord;
int SubWindow,BarPos,X1,Y1,X2,Y2;
int prevX=-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &XCoord,
                  const double &YCoord,
                  const string &SParam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      int x=(int)XCoord;
      int y=(int)YCoord;
      if(x==prevX) return;
      CopyTime(NULL,0,0,1,CarrentBarTime);
      //---
      ChartXYToTimePrice(NULL,x,y,SubWindow,TimeCoord,PriceCoord);
      if(TimeCoord>CarrentBarTime[0]) return;
      CopyBuffer(Handle_iMA,0,TimeCoord+PeriodSeconds(),2,Buffer_iMA);
      //---
      string name="Line";
      ObjectSetDouble(0,name,OBJPROP_PRICE,0,Buffer_iMA[0]);
      ObjectSetInteger(0,name,OBJPROP_TIME,0,TimeCoord);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,Buffer_iMA[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,TimeCoord+PeriodSeconds());
      //---
      ChartRedraw();
      prevX=x;
     }
  }

私のノートパソコンでは、すべてが飛びます

 

オブジェクト作成 関数を初めて呼び出すと、エラー5040(Corrupted parameter of type string)が発生します。

void  CreateTL(string name,datetime time1,double price1,datetime time2,double price2,bool ray_left,bool ray_right,color color_TL)
  {
//------------ nTL,nTLh,nTLl,nTLe
   nTL="nTL_"+IntegerToString(MathRand());
   nTLh="nTLh_"+IntegerToString(MathRand());
   nTLl="nTLl_"+IntegerToString(MathRand());
   nTLe="nTLe_"+IntegerToString(MathRand());
//------------
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
   ObjectSetInteger(0,name,OBJPROP_COLOR,color_TL);
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_left);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_right);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
  };

通話設定前の場合

nTL="";

error 4002 (Invalid parameter when calling client terminal function internally) クライアント端末の機能を内部で呼び出す際、パラメータが不正です。

呼び出し前に設定した場合

nTL="a";

の場合、最初のオブジェクトはaという名前になります。

私はこのように呼んでいます。

if(hlp_var==high_low)
     {
      //CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTLe,dt[1],pr[0],dt[1],pr[1],false,false,nTL_color);
      CreateTL(nTLh,dt[0],pr[0],dt[1],pr[0],false,true,nTL_color);
      CreateTL(nTLl,dt[0],pr[1],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[1],dt[1],pr[0],false,true,nTL_color);
      Print("CreateTL GetLastError "+IntegerToString(GetLastError()));
     };

どこがエラーなのか教えてください。

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 

旧バージョンでは

ObjectCreate(0,nTL="nTL_"+IntegerToString(MathRand()),OBJ_TREND,0,time1,price1,time2,price2);

は、一度も失敗したことがありません。

コードや端末のバグでしょうか?

 
Silent:

エラーの発生箇所を教えてください。

どこがエラーなのか分かりませんが、オブジェクト名の 扱いははっきり言って非常に疑問です。
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
オブジェクトの名前に乱数を入れる理由が不明ですが、これもエラーになる可能性があります。
 
Silent:

オブジェクト作成 関数を初めて呼び出すと、エラー5040(Corrupted parameter of type string)が発生します。

通話設定前の場合

error 4002 (Invalid parameter when calling client terminal function internally) クライアント端末の関数を内部で呼び出す際に発生したエラーです。

通話前に設定した場合

の場合、最初のオブジェクトはaという名前になります。

私はこう呼んでいます。

エラーの発生箇所を教えてください。

Get LastError が 0 以外を表示するので、心配ですか?もしそうなら、関数が失敗を報告した場合のみ、エラーを呼び出すようにします。また、プロットの最後にエラーを求めるべきではない、ゴミのような値が出るかもしれない。MT4ではこうなのですが、もしかしたらこちらでは違うかもしれません。

疑似コードです。

if( ! ObjectCreate(...) )
    Print( GetLastError() );
 
Silent:

オブジェクト作成 関数を初めて呼び出すと、エラー5040(Corrupted parameter of type string)が発生します。

通話設定前の場合

error 4002 (Invalid parameter when calling client terminal function internally) クライアント端末の機能を内部で呼び出す際、パラメータが不正です。

呼び出し前に設定した場合

の場合、最初のオブジェクトはaという名前になります。

私はこのように呼んでいます。

エラーの発生箇所を教えてください。

StringConcatenate()で文字列を "接着 "してみる。

 
TheXpert:
どこがエラーなのかわからないが、オブジェクト名の 扱いは控えめに言っても非常に疑問である。
あと1週間、頭を悩ませることになりそうです。もう少し詳しく教えてください。(下品でもいいんです :))
zfs です。
オブジェクト名に乱数が必要な理由が不明です、エラーになる可能性があります。

ユニークな名前を持つ数百のオブジェクトのための他のオプションはありますか?

(オブジェクトのグループは、グループを削除するために、名前に同じ部分の文字列が含まれている必要があります)。

 
220Volt:

Get Last Errorが0以外を表示するので心配ですか?もしそうなら、関数が失敗を報告した場合のみ、エラーを求めるようにします。また、プロットの最後にエラーを求めるべきではない、ゴミのような値が出るかもしれない。MT4ではそうなのですが、もしかしたらこちらでは違うかもしれません。

いいえ、最初の呼び出しがエラーでオブジェクトが作成されないからです。1回目の呼び出しの行を(とりあえず)複製し、2回目からはそれが作成されます。
 
220Volt:

Get Last Errorsが0以外を表示するので心配ですか?

さて、論理的には、もし関数が最後のエラーを設定するならば、関数が正常に終了すると、ゼロエラーまたはドキュメントに記述されている 値が発生するはずです。それ以外の方法はない。

つまり、呼び出しが成功し、エラーがゼロでない場合、このケースはドキュメントに記述されなければならない。

サイレント

あと1週間はこうして頭を悩ませることになりそうです。もう少し詳しく説明してもいいですか?(下品かもしれませんが :))

さて、通常、同じ型のオブジェクトの名前は、削除しやすいように共通の部分(あなたの場合は "nTL_")と相違点から形成されています。また、チャート上に複数のモジュールが同時に存在する場合は、モジュール識別子を使用します。

差分はカウンタでも何でもよく、オブジェクトを作成するたびに増やします。しかし、論理的に区別したほうがいい。オブジェクトの時間、オブジェクトの座標、目標は一意性を保証することだ。副作用として、名前を再度構成することで、すでに作成されたオブジェクトの プロパティを変更することができます。

ランダムは、この「一意性の保証」を提供しない。

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5