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

 
Artyom Trishkin:
まあ、私はそれを関数にすべて形成し、私がそれを必要とするとき、すべてのティック(それが合理的かつ必要である場合)、または新しいローソクの 開始時-例えば、我々はH1で動作する場合、1時間に1回でもそれを呼び出すだろう。

機能付きはもちろん、便利です。コードを把握した。これではっきりしましたね。どうすれば自分のやりたいことに持っていけるのか、いつ、どの段階で必要なデータを取ればいいのか、考えていきたいと思います。

 
Koldun Zloy:

あからさまに「無謀の極み」であれば、禁止されるはずだ。

WinAPIはMQLの機能を大幅に拡張します。そして、DLLがなくてもバカなことはできる。

そして、クリップボードへの文字列の受け渡しの例です。

よくやった、コメントもつけて。

ありがとうございます。

ここで、もうひとつ質問です。

与えられた座標でのマウスクリックをエミュレートすることは可能でしょうか?

 
mila.com:

素晴らしい、しかも解説付きで。

ありがとうございます。

もう1つ質問です。

指定した座標でマウスをクリックするエミュレーションを作ることはできますか?

MQLからやる必要がなければ、AutoITを見てください、そこでは何でもできます。製品は無料で、MQLと対話するために1つのDLLが必要なだけです。
 
mila.com:

素晴らしい、しかも解説付きで。

ありがとうございます。

もう1つ質問です。

指定した座標でマウスをクリックするエミュレーションを作ることはできますか?

はい、できます。

#define  MK_LBUTTON     0x0001
#define  WM_LBUTTONDOWN 0x0201
#define  WM_LBUTTONUP   0x0202

struct POINT
{
   int x;
   int y;
};

#import "User32.dll"
   uint WindowFromPoint( int x, int y );
   uint PostMessageW( uint hWnd, uint Msg, uint wParam, uint lParam );
   int ScreenToClient( uint hWnd, POINT& lpPoint );
#import

int x = 1000;  // Экранные координаты
int y = 350;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   uint hwnd = WindowFromPoint( x, y ); // Получаем дескриптор окна в нужном месте
   
   if( hwnd ){
      POINT point;
      point.x = x;
      point.y = y;
      ScreenToClient( hwnd, point );  // Преобразуем экранные координаты в координаты рабочей области окна
      
      uint lParam = (point.y * 65536) + (point.x & 0xFFFF);  // Упаковываем координаты в 32-разрядное целое
      
      PostMessageW( hwnd, WM_LBUTTONDOWN, MK_LBUTTON, lParam ); // Посылаем сообщения от "мыши"
      PostMessageW( hwnd, WM_LBUTTONUP, MK_LBUTTON, lParam );
   }
}
 
Artyom Trishkin:
さて、私はそれをすべて関数に定式化し、必要なときにそれを呼び出します - すべてのティック(必要かつ合理的であれば)または新しいキャンドルが 開くときに - 例えば、我々はH1で動作する場合、1時間に一度。

Artem、私は正しく理解しています、私たちはループを持っている場合:for(int i=0; i<copy_bars; i++) とループがある for(int j=0; j<copy_bars; j++) if(j==i) continue; ,

は、カウントが平行であることを意味し、おおよそ5本のローソク足があれば、比較は継続することになります。

1で1-捨てる。

2で1、3で1、4で1、5で1。

そうすれば、どこでどうなるかというサイクルが始まります。

2 with 1、2 with 3、2 with 4、2 with 5。

といった具合に。

同じになるのでしょうか?

 
Andrey Koldorkin:

Artem、私は正しく理解しています、ループがある場合:for(int i=0; i<copy_bars; i++) とループがある場合 for(int j=0; j<copy_bars; j++) if(j==i) continue; ,

というのは、計算が並行しているということになり、ローソク足が大体5本あれば、比較は進みます。

1で1-捨てる。

2で1、3で1、4で1、5で1。

そうすれば、どこでどうなるかというサイクルが始まります。

2 with 1、2 with 3、2 with 4、2 with 5。

といった具合に。

同じになるのでしょうか?

はい。
 
Artyom Trishkin:
はい。

もう一つの質問ですが、もし現在のローソクを比較する必要がないのであれば、カウントをゼロではなく1から始める必要はないのでしょうか?

それとも、ここでは0がローソク足1、1がローソク足2などと理解すればいいのでしょうか?

 
Andrey Koldorkin:

もう一つの質問ですが、もし現在のローソクを比較する必要がないのであれば、カウントをゼロではなく1から始める必要はないのでしょうか?

それとも、ここでは0がローソク足1、1がローソク足2などと理解すればいいのでしょうか?

ここで、0は配列の始まりです。そして、配列の中に、最初のローソク足から・・・まで、「まで」ではなく、必要な数だけ書くのです。

int copied=CopyRates(Symbol(),PERIOD_CURRENT,1,copy_bars,array);

1はコピーするローソク足の数、copy_barsはコピーするローソク足の数です。

したがって、array[]には、インデックス0-1または1+copy_bars-1のセルに必要なローソク足が含まれます。 array[]のインデックス方向によって(ArraySetAsSeries()はインデックス方向を設定 し、ArrayGetAsSeries(), ArrayIsSeries() で確認可能)、array[]のインデックス方向が変わります。

 
Artyom Trishkin:

ここで、0は配列の始まりです。そして、配列には、ローソク足を、「~まで」ではなく、必要な数だけ、先頭から...まで書きます。

1はコピーするローソク足の数、copy_barsはコピーするローソク足の数です。

したがって、array[] には、インデックス 0 のセルに必要なロウソクが 1 または 1+copy_bars-1 として格納される。 array[] のインデックス方向によって(ArraySetAsSeries() でインデックス方向を設定 し、ArrayGetAsSeries(), ArrayIsSeries() で確認できる)、インデックス方向が 決まる。

このプログラミング森の奥へ進むほど...。

まずAlert経由で表示されるものを確認しただけです。その逆、つまり現在のローソクに最も近いローソクが最大数を持つようです。

そして、経由して確認しました。

bool series=ArrayIsSeries(dataCandle)。

アラート(シリーズ)。

と表示され、スクリプトには "false "と表示されます。

私の論理では、falseが間違った側にあれば、trueが正しい側にあることになる。

と処方しました。

ArraySetAsSeries (dataCandle, true); //方向を変える

bool series=ArrayIsSeries(dataCandle); //再度チェックする。

Alert (series); //結果を画面に書き込む。

でも、その後も「false」が出るんです。

どうしたんだろう?

 
Andrey Koldorkin:

ああ、このプログラミング。森の奥へ進むほど...。

まず、Alertを通して、何を出しているのかだけ確認しました。それは逆であることが判明、すなわち、現在のローソクに最も近いローソクは、最大の数字を持っています。

そして、経由して確認しました。

bool series=ArrayIsSeries(dataCandle)。

アラート(シリーズ)。

と表示され、スクリプトには "false "と表示されます。

私の論理では、falseが間違った側にあれば、trueが正しい側にあることになる。

と処方しました。

ArraySetAsSeries (dataCandle, true); //方向を変える

bool series=ArrayIsSeries(dataCandle); //再度チェックする。

Alert (series); //結果を画面に書き込む。

でも、その後も「false」が出るんです。

どうしたんだろう?

dataCandles は構造体である。履歴からロウソクを書き込む配列-array[]。そして、そのインデックスがチャート上のローソク足のインデックスと一致するように、時系列として作成する必要があります。つまり、array[]の0番目のセルが、現在の日付に最も近いローソク足に対応することになります。

すなわち、1.ローソク足を配列array[]にコピーし、2.それを時系列にし、そこから値を構造体に読み込む。

あなたはarray[]なしで行うことができます - ちょうど構造体にチャートから直接データを書き込むが、私は5との互換性のためにこれを提案 - それは唯一の高[i]、低[i]と他のデータを使用して、指標の中で直接コピーすることができますが、スクリプトまたはエキスパート-アドバイザで、我々は最初の配列に必要な履歴間隔をコピーする必要がありますが、私はそれをしました。

理由: