初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1284

 
Youri Lazurenko:

いつもありがとうございます!これで線は線のようになりましたね、うれしいです。ObjectDelete(0, name); だけは必要で、それ以外は一度描いた線は再描画されない。mql4でも同じです、忘れただけです。

私ならそうする

bool CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
 {
  if(ObjectFind(ChartID(), name) < 0)
    if(!ObjectCreate(ChartID(), name, OBJ_TREND, 0, 0, 0, 0, 0))
     {
      Print("Ошибка в создании линии");
      return (false);
     }
  ObjectSetInteger(ChartID(), name, OBJPROP_COLOR, clr);
  ObjectSetInteger(ChartID(), name, OBJPROP_STYLE, TrendStyle);
  ObjectSetInteger(ChartID(), name, OBJPROP_WIDTH, TrendWidth);
  ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 0, time1);
  ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 1, time2);
  ObjectSetDouble(ChartID(), name, OBJPROP_TIME, 0, price1);
  ObjectSetDouble(ChartID(), name, OBJPROP_TIME, 1, price2);

  ChartRedraw();
  return(true);
 }
 
Vladimir Karputov:

なんという戯言だろう。描画されたグラフィックオブジェクトは滑らかに動きます。例は各オブジェクトのヘルプに記載されています(水平線OBJ_HLINEの 場合)。

また、すでに描画されているオブジェクトの色、スタイル、匂いなど、あらゆるプロパティを変更することができます。

手動で行うものであり、異論はない。しかし、Expert Advisorはデマークのポイントによってトレンドラインを描きます。ObjectDelete(0, name); という関数で、ポイントが変わると、古いトレンドラインが削除され、新しいトレンドラインが描か れます。この機能を使用しない場合、最初に描いた線は再描画されなくなります。これはナンセンスではなく、事実なのです。

Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
ObjectDelete - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

マニュアルは論外。一方、Expert Advisorは、デマークのポイントによってトレンドラインを描きます。関数ObjectDelete(0, name);、ポイントが変わると、古いトレンドラインが削除され、新しいトレンドラインが描か れます。この機能を使用しない場合、最初に描いた線は再描画されなくなります。これはナンセンスなことではなく、事実なのです。

ヘルプを読んだらどうですか?そして、例を実行します。

 
Alexey Viktorov:

私ならそうする。

ありがとうございます。でも、私のバリアントはそのままにしておきます。ObjectDelete(0, name); の代わりに試してみますが。

 ChartRedraw();
Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
ObjectDelete - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

ヘルプを読めよ、頼むから!そして、例を実行します。

参考文献を読みました。あなただけが憤慨して、私は実践から書いているのです。もう一つは、ObjectDelet()の代わりにChartRedraw() を使用することですが、異論はないので確認します。これだけは、例を参考に指摘する必要があります。

 
Youri Lazurenko:

準備書面を読みました。あなただけが言葉で憤慨し、私は実践から書いているのです。もう一つは、ObjectDelet()の代わりにChartRedraw() を使用することです、私は議論して確認しません。これだけは、例を参考に指摘する必要があります。

みんな普通にこのスレで相談してるし、相談されたら聞いてる。少なくとも、ヘルプを読み、サンプルを適用してください。どうか、人の話を聞くのが嫌なら、一切何も聞かないでください。

 
Youri Lazurenko:


グラフィカルオブジェクト「Horizontal line」の任意のプロパティをその場で変更できる例。これを行うには、オブジェクトを削除する必要はありません。

C:\Users\barab\OneDrive\Изображения\Screenpresso\2021-02-01_16h09_06.gif

コード

//+------------------------------------------------------------------+
//|                       OBJ_HLINE change properties on the fly.mq5 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input string          InpName="HLine";     // Line name
//--- an array for storing colors contains 14 elements
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- the number of colors
   int size=ArraySize(colors);
//--- get a random value
   int number=MathRand();
//--- get an index in the col[] array as a remainder of the integer devision
   int i=number%size;
//--- set line color
   ObjectSetInteger(ChartID(),InpName,OBJPROP_COLOR,colors[i]);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

ありがとうございます。でも、私のバリアントはそのままにしておきます。ObjectDelete(0, name); の代わりに試してみますが。

完全に間違った判断です。グラフィカルオブジェクトの削除とチャートの更新は、決して相互に置き換えられるものではありません。

私の例では、まず、オブジェクト、特に、tfyuという名前のトレンドがあるかどうかをチェックします(ロシア語のキーボードレイアウトではnameです))。そして、存在しない場合は、トレンドを描きます。描画に失敗した場合は、メッセージを表示し、return false を返して関数を終了する。

それ以降は、トレンドがすでに存在しているか、描かれたばかりかにかかわらず、指定されたパラメーター、時間、座標価格、タイプ、太さ、その他追加したいものがすべて割り当てられる。その後、チャートは更新され、この関数は真を返します。

実行速度から言えば、トレンドを削除して新たに描くよりも、トレンドの有無を確認する方がコストがかからないだろう。

でも...最終的に決めるのはあなただし、あなたが右手の小指で左耳を掻くのが好きなら、私には止める権利はない。

 
Youri Lazurenko:

そして、トレンドラインの 描画に戻る。コードが必要な場合

非常に悪いコードです。

 
Alexey Viktorov:

私ならこうする。

私ならこうする。

void CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
 {
  if(ObjectFind(ChartID(), name) < 0)
   {
    ObjectCreate(ChartID(), name, OBJ_TREND, 0, 0, 0, 0, 0);
    ObjectSetInteger(ChartID(), name, OBJPROP_COLOR, clr);
    ObjectSetInteger(ChartID(), name, OBJPROP_STYLE, TrendStyle);
    ObjectSetInteger(ChartID(), name, OBJPROP_WIDTH, TrendWidth);
   }
   ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 0, time1);
   ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 1, time2);
   ObjectSetDouble(ChartID(), name, OBJPROP_PRICE, 0, price1);
   ObjectSetDouble(ChartID(), name, OBJPROP_PRICE, 1, price2);

  ChartRedraw();
 }
理由: