記事「チャートをより面白くする: 背景の追加」についてのディスカッション

 

新しい記事「チャートをより面白くする: 背景の追加」はパブリッシュされました:

多くのワークステーションには、ユーザーに関する何かを語る代表的な画像が含まれています。これらの画像は、作業環境をより美しくエキサイティングなものにします。背景を追加してチャートをより面白くする方法を見てみましょう。

多くのワークステーションには、ユーザーに関する何かを語る代表的な画像が含まれています。人々は常に壁紙として使用するのに最高で最も美しい画像を選択しようとするため、これらの画像は、作業環境をより美しく刺激的なものにします。しかし、取引プラットフォームを開くと、それはどういうわけか退屈であることがわかります。あるのは、数値データのグラフィック表現だけです。

 


画像や写真は飽きることなく長時間見続けることができますが、価格チャートを見るのは数分でもとても疲れます。ですから、背景の画像が私たちを動機づけ、何か良いことを思い出させながら、チャートを見て分析できるようにしましょう。

作者: Daniel Jose

 
ダニエルは、投資エージェントのオフィスに貼るには非常に良い記事だ。MT5にはもちろん限界があるが、グラフィカルな 部分で多くのことが可能で、結局はあまり使われていない。
 
非常に良い
削除済み  
ユーティリティは完璧に動作していますが、OnChartEventを使用するいくつかのインジケータは、バックグラウンドにこのEAを適用すると動作しなくなり、クリックできなくなります。
 
Arpit Tailang # : ユーティリティは、OnChartEventが動作するために使用し、私がバックグラウンドでこのEAを適用したときに使用不能になるシナライザの一部を除いて、完全に動作します

実際、MT5のアップデートに関連して何かが起こり、壁紙が予想と異なるものに変換されました:

ObjectSetInteger ( Terminal.Get_ID(), szName, OBJPROP_BACK , true ); 

Isso informa que o objeto terá que ficar no fundo, mais estranhamente, ele está vindo para a frente, por conta disto o OBJETO que recebe ou BitMap começa a receber os cliques, uma solução seria aumentar o Status de todos os objetos, ou tentar baixar o status do Bitmap, no caso esta segunda seria mais simples, isto seria conseguido alterando valor da propriedade OBJPROP_ZORDER no objeto que recebe o Wallpaper,この2つの解決策を試しましたが、問題を解決するためにこの方法を安定させることはできませんでした。..注意すると、ビットマップ画像がキャンドルのボディにプロットされ、ビットマップオブジェクトがフォアグラウンドにあることがわかります。🙁

 
このコードに含まれる関数を使用する可能性
//+------------------------------------------------------------------+
//|ファイルを選択します。mqh
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Edit.mqh>
#include <Controls\ListView.mqh>
#include <Controls\CheckGroup.mqh>
//+------------------------------------------------------------------+
//| 定義|
//+------------------------------------------------------------------+
#define  INDENT_LEFT             (4)             // 左からのインデント
#define  INDENT_TOP              (4)             // トップからインデント
#define  INDENT_RIGHT            (4)             // 右からインデント
#define  BUTTON_WIDTH            (60)     // X座標によるサイズ
#define  BUTTON_HEIGHT   (20)       // Y座標によるサイズ
#define  EDIT_HEIGHT             (20)       // Y座標によるサイズ
#define  COMMON_WIDTH            (90)       // X座標によるサイズ
//+------------------------------------------------------------------+
//| クラス CSelectFile|
//+------------------------------------------------------------------+
class CSelectFile : public CDialog
  {
   CEdit             m_filename;
   CButton           m_button_ok;
   CButton           m_button_cancel;
   CListView         m_filelist;
   CCheckGroup       m_common;
   string            m_instance_id,
                     m_files[],
                     m_folders[],
                     m_prevfolder,
                     m_cfolder,
                     m_fullname;
   int               m_numberfiles,
                     m_numberfolders,
                     m_totalfiles,
                     m_fileflag,
                     m_pressbutton;
protected:
   CChart            m_chart;
public:
                     CSelectFile(void);
                    ~CSelectFile(void);
   virtual bool      Create(const long chart,const string name,const int x1,const int y1,const int x2,const int y2);
   int               ChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
   string            Filename(){ m_pressbutton=0; return(m_fullname);}
   int               FileFlag(){ return(m_fileflag);}
protected:
   void              OnClickButtonOK(void);
   void              OnClickButtonCancel(void);
   virtual void      OnClickButtonClose(void);
   void              OnChangeList(void);
   void              OnCheckCommon(void);
   void              SetFolder(string m_fol="");
  };
//+------------------------------------------------------------------+
CSelectFile::CSelectFile(void)
  {
   m_instance_id=IntegerToString(rand(),5,'0');
   m_fileflag=0;
   m_pressbutton=0;
   m_fullname="";
   m_cfolder="";
   m_prevfolder="";
   m_numberfiles=0;
   m_numberfolders=0;
  }
//+------------------------------------------------------------------+
CSelectFile::~CSelectFile(void)
  {
   ArrayFree(m_folders);
   ArrayFree(m_files);
   m_chart.Detach();
   CDialog::Destroy();
  }
//+------------------------------------------------------------------+
bool CSelectFile::Create(const long chart,const string name,const int x1,const int y1,const int x2,const int y2)
  {
   if(x2-x1<280 || y2-y1<200) return(false);
   m_chart_id=chart;
   m_name=name;
   m_subwin=0;
//--- チャート・オブジェクトを初期化する
   m_chart.Attach(chart);
//--- オブジェクトとマウスイベントを指定する
   if(!m_chart.EventObjectCreate() || !m_chart.EventObjectDelete() || !m_chart.EventMouseMove())
     {
      Print("CSelectFile: object events specify error");
      m_chart.Detach();
      return(false);
     }
//--- 親クラスのメソッドを呼び出す
   if(!CDialog::Create(m_chart.ChartId(),m_instance_id,m_subwin,x1,y1,x2,y2))
     {
      Print("CSelectFile: expert dialog create error");
      m_chart.Detach();
      return(false);
     }
   Caption(name);
//--- 依存コントロールを作成する
//--- ファイルのリストを作成する
   int _x1=INDENT_LEFT;
   int _y1=INDENT_TOP;
   int _x2=ClientAreaWidth()-INDENT_RIGHT;
   int _y2=_y1+(ClientAreaHeight()-INDENT_TOP*5-EDIT_HEIGHT*2);
   if(!m_filelist.Create(m_chart_id,m_name+"FileList",m_subwin,_x1,_y1,_x2,_y2)) return(false);
   if(!Add(m_filelist)) return(false);
   m_prevfolder="";
   m_cfolder="";
   SetFolder(m_cfolder);
//--- ファイル名のフィールドを作成する
   _x1=INDENT_LEFT;
   _y1=INDENT_TOP+_y2;
   _x2=ClientAreaWidth()-INDENT_RIGHT;
   _y2=_y1+EDIT_HEIGHT+INDENT_TOP;
   if(!m_filename.Create(m_chart_id,m_name+"Filename",m_subwin,_x1,_y1,_x2,_y2)) return(false);
   if(!Add(m_filename)) return(false);
//--- 共通チェックを作成する
   _x1=INDENT_LEFT;
   _y1=INDENT_TOP+_y2;
   _x2=_x1+COMMON_WIDTH;
   _y2=_y1+EDIT_HEIGHT;
   if(!m_common.Create(m_chart_id,m_name+"Common",m_subwin,_x1,_y1,_x2,_y2)) return(false);
   if(!Add(m_common)) return(false);
   if(!m_common.AddItem("Common",1)) return(false);
//--- ボタンの作成 キャンセル
   _x1=ClientAreaWidth()-INDENT_RIGHT-BUTTON_WIDTH;
   _x2=_x1+BUTTON_WIDTH;
   _y2=_y1+BUTTON_HEIGHT;
   if(!m_button_cancel.Create(m_chart_id,m_name+"Cancel",m_subwin,_x1,_y1,_x2,_y2)) return(false);
   if(!m_button_cancel.Text("Cancel")) return(false);
   if(!Add(m_button_cancel)) return(false);
//--- ボタンの作成 OK
   _x1=_x1-INDENT_RIGHT-BUTTON_WIDTH;
   _x2=_x1+BUTTON_WIDTH;
   if(!m_button_ok.Create(m_chart_id,m_name+"OK",m_subwin,_x1,_y1,_x2,_y2)) return(false);
   if(!m_button_ok.Text("OK")) return(false);
   if(!Add(m_button_ok)) return(false);
//----
   m_pressbutton=0;
   m_fullname="";
   m_chart.Redraw();
//----
   if(Id(m_subwin*CONTROLS_MAXIMUM_ID)>CONTROLS_MAXIMUM_ID)
     {
      Print("CSelectFile: too many objects");
      return(false);
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| イベントハンドラ|
//+------------------------------------------------------------------+
int CSelectFile::ChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==(ON_CLICK+CHARTEVENT_CUSTOM) && lparam==m_button_ok.Id()) OnClickButtonOK();
   else if(id==(ON_CLICK+CHARTEVENT_CUSTOM) && lparam==m_button_cancel.Id()) OnClickButtonCancel();
   else if(id==(ON_CHANGE+CHARTEVENT_CUSTOM) && lparam==m_filelist.Id()) OnChangeList();
   else if(id==(ON_CHANGE+CHARTEVENT_CUSTOM) && lparam==m_common.Id()) OnCheckCommon();
   else if(!CDialog::OnEvent(id,lparam,dparam,sparam)) return(0);
   m_chart.Redraw();
   return(m_pressbutton);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void CSelectFile::OnClickButtonOK(void)
  {
   m_fullname=m_filename.Text();
   StringTrimLeft(m_fullname);
   StringTrimRight(m_fullname);
   if(StringLen(m_fullname)>0)
     {
      m_fullname=m_cfolder+m_fullname;
      m_pressbutton=1;
     }
  }
//+------------------------------------------------------------------+
void CSelectFile::OnClickButtonCancel(void)
  {
   m_pressbutton=-1;
   m_fullname="";
  }
//+------------------------------------------------------------------+
void CSelectFile::OnClickButtonClose(void)
  {
   OnClickButtonCancel();
  }
//+------------------------------------------------------------------+
void CSelectFile::OnChangeList(void)
  {
   int i=(int)m_filelist.Value();
   if(i<0) return;
   else if(i==0)
     {
      string s;
      if(m_cfolder==m_prevfolder || s==m_prevfolder)
        {
         m_cfolder="";
         m_prevfolder=m_cfolder;
         SetFolder(m_cfolder);
        }
      else
        {
         s="\\"+m_prevfolder;
         StringReplace(m_cfolder,s,"\\");
         m_prevfolder=m_cfolder;
         if(m_cfolder=="\\") m_cfolder="";
         SetFolder(m_cfolder+"\\");
        }
      m_filename.Text("");
     }
   else if(i<m_numberfolders)
     {
      m_prevfolder=m_folders[i];
      m_cfolder+=m_prevfolder;
      SetFolder(m_cfolder+"\\");
      m_filename.Text("");
     }
   else m_filename.Text(m_filelist.Select());
  }
//+------------------------------------------------------------------+
void CSelectFile::OnCheckCommon(void)
  {
   m_fileflag=m_common.Value()>0?FILE_COMMON:0;
   if(m_fileflag==0)
     {
      m_prevfolder="";
      m_cfolder="";
      SetFolder(m_cfolder);
      m_filename.Text("");
     }
   else
     {
      m_prevfolder="";
      m_cfolder="";
      SetFolder(m_cfolder);
      m_filename.Text("");
     }
  }
//+------------------------------------------------------------------+
void CSelectFile::SetFolder(string fol="")
  {
   string fl,ff,fld=fol;
   StringReplace(fld,"\\\\","\\");
   int i;
   m_filelist.Select(0);
   m_filelist.ItemsClear();
   ArrayResize(m_folders,1);
   ArrayResize(m_files,1);
   if(fld=="Files\\") fl=""; else fl=fld;
   //---フォルダ
   long  hfind=FileFindFirst(fl+"*",ff,m_fileflag);
   if(hfind==INVALID_HANDLE)
     {//空のフォルダ
      m_numberfiles=0;
      m_numberfolders=1;
      m_folders[0]="Files\\"+fld;
      m_filelist.ItemAdd(m_folders[0]);
      m_totalfiles=0;
     }
   else
     {
      m_numberfiles=0;
      m_numberfolders=0;
      do
        {
         if(StringFind(ff,"\\")>1) m_numberfolders++;
         m_numberfiles++;
        }
      while(FileFindNext(hfind,ff));
      FileFindClose(hfind);
      ArrayResize(m_folders,m_numberfolders+1);
      hfind=FileFindFirst(fl+"*",ff,m_fileflag);
      if(hfind==INVALID_HANDLE) return;
      m_numberfolders=1;
      do
        {
         if(StringFind(ff,"\\")>1){ m_folders[m_numberfolders]=ff; m_numberfolders++;}
        }
      while(FileFindNext(hfind,ff));
      FileFindClose(hfind);
      if(fld=="")
        {
         m_folders[0]="Files\\";
         ff="";
        }
      else
        {
         m_folders[0]=fld;
         ff="Files\\";
        }
      m_filelist.ItemAdd(ff+m_folders[0]);
      int nn=m_numberfolders;
      for(i=1; i<nn; i++) m_filelist.ItemAdd(m_folders[i]);
      //---ファイル
      hfind=FileFindFirst(fl+"*.*",ff,m_fileflag);
      m_numberfiles=0;
      do
        {
         if(StringFind(ff,"\\")<0) m_numberfiles++;
        }
      while(FileFindNext(hfind,ff));
      FileFindClose(hfind);
      if(m_numberfiles>0)
        {
         ArrayResize(m_files,m_numberfiles);
         m_numberfiles=0;
         hfind=FileFindFirst(fl+"*.*",ff,m_fileflag);
         if(hfind!=INVALID_HANDLE)
           {
            do
              {
               if(StringFind(ff,"\\")<0) { m_files[m_numberfiles]=ff; m_numberfiles++;}
              }
            while(FileFindNext(hfind,ff));
            FileFindClose(hfind);
           }
         for(i=0; i<m_numberfiles; i++) m_filelist.ItemAdd(m_files[i]);
        }
      m_totalfiles=m_numberfiles+m_numberfolders+1;
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|Test_SelectFile.mq5
//+------------------------------------------------------------------+
#include <class_SelectFile.mqh>
//+------------------------------------------------------------------+
CSelectFile *SelectFile=NULL;
//+------------------------------------------------------------------+
int OnInit()
  {
   SelectFile=new CSelectFile();
   if(!SelectFile.Create(0,"Select a file",20,20,350,300)) return(-1);
   return(0);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(SelectFile!=NULL) delete SelectFile;
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // イベントID 
                  const long& lparam,   // ロング・タイプのイベント・パラメーター
                  const double& dparam, // double型のイベントパラメータ
                  const string& sparam) // 文字列型のイベント・パラメーター
  {
   if(SelectFile!=NULL)
     {
      int key=SelectFile.ChartEvent(id,lparam,dparam,sparam);
      if(key>0)
        {//OKボタンを押す
         string file=SelectFile.Filename();
         int flag=SelectFile.FileFlag();
         delete SelectFile;
         SelectFile=NULL;
         Print("The selected file - ",flag==FILE_COMMON?"[Common]":"",file);
         int handle=FileOpen(file,flag);
         if(handle>0)
           {
            Print(file," - open");
            FileClose(handle);
           }
         else Print(file," - failed to open");
        }
      else if(key<0)
        {//ボタンを押す キャンセル
         delete SelectFile;
         SelectFile=NULL;
         Print("No file selected");
        }
     }
   if(SelectFile==NULL)
     {
      Print("The program is completed");
      ExpertRemove();
     }
  }
//+------------------------------------------------------------------+
をクリックすると、グラフィックの画像を変更することができます。queria saber se e possível, se no der e for complexo eu evito quebra meus neurônios kkkkkkkkkkkkk
 
Daniel Jose #:

実際、MT5のアップデートに関連して何かが起こり、壁紙が予想されていたものとは異なるものに変換されました:

このため、BitMapを受け取ったOBJECTはクリックを受け取り始めます。解決策は、すべてのオブジェクトのステータスを上げるか、Bitmapのステータスを下げることです、これは、壁紙を受け取るオブジェクトのOBJPROP_ZORDERプロパティの値を変更することで実現できます。私は両方の解決策を試しましたが、問題を修正するために全体を安定させることができませんでした。..注意すると、ビットマップ画像がキャンドルのボディにプロットされ、ビットマップオブジェクトがフォアグラウンドにあることがわかります。🙁


ダニエル

タイマーを設定し、壁紙を無効にして再び有効にする関数を実行するか、壁紙をバックグラウンド(バックグランド)にすることで機能を「再提示」するようなことはできませんか?
私が使用しているGUIパネルでは、この解決策を取らざるを得ませんでした。いくつかのグラフィック要素を削除し、オブジェクトのタイプに応じて背景または前面になるように再作成する必要があります。

 
役に立つ記事をありがとう。とても参考になった。
 

Daniel, おめでとうございます。私は何年もMT4を使っていますが、流動性プロバイダーやブローカーによる資産の制限により、MT5への移行を余儀なくされました。

また、必要な方のためにYoutubeのビデオもあります: https://www.youtube.com/watch?v=AMNhI45EZ2o

あらためて、あなたの仕事とオープンソース・コードに敬意を表します。

よろしくお願いします。

COMO MUDAR A IMAGEM DE FUNDO NO MT4 | COLOQUE UM BACKGROUND NO SEU META TRADER 4
COMO MUDAR A IMAGEM DE FUNDO NO MT4 | COLOQUE UM BACKGROUND NO SEU META TRADER 4
  • 2021.06.02
  • www.youtube.com
Aprenda a deixar seu meta trader 4 personalizado, escolha a imagem que desejar e use como plano de fundo, simples e fácil. No vídeo mostro passo a passo como...
 

やあ、ダニエル。どうしたんだい?

スレッドを復活させて申し訳ありません...E.A.であなたのコードを使用しているのですが、次のエラーが発生しました:"ファイルが見つかりません"。また、あなたがダウンロードした画像ファイルを使いましたが、同じエラーが発生しました。助けていただけますか?よろしくお願いします!

 
leandronetto011 #:

やあ、ダニエル。どうした?

スレッドを復活させて申し訳ありません...E.A.であなたのコードを使用しているのですが、次のエラーが発生しました:"ファイルが見つかりません"。また、あなたがダウンロードした画像ファイルを使いましたが、同じエラーが発生しました。助けていただけますか?よろしくお願いします!

よくわからないのですが...🤔🤔🤔 ...MQL5のフォルダにあるファイルをダウンロードして解凍する必要があります。これを正しく行うにはMetaEditorを開きます。右側にフォルダブラウザがあります。ROOT ( MQL5 )を右クリックし、OPEN FOLDERを選択します。エクスプローラーがMQL5フォルダで開きます。このフォルダでZIPファイルを解凍します。こうすることで、チャート上でシステムを起動したときに画像が見つかるようになります。