MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 618

 
neverness:

自分がわからないのに人に教えるな、とストレートに言ったんです。

ヘルプは「通りすがり」ではなく「適格」であるべきだ!

何が必要なのか、もう一度問題を記述してください。

 
Vitaly Muzichenko:

具体的に何が必要なのか、もう一度タスクを記述し直してください。

MT4/MT5で異なるモジュール間でデータを転送できることに興味があります。

例えば、こんな感じです。

あるインジケーターから別のインジケーターへデータを転送する方法は?

インジケーターからスクリプトにデータを転送する方法は?

インジケータからExpert Advisorに データを転送する方法は? などなど・・・。

データを転送する一般的な方法は、データを別のファイルに書き出し、そのファイルから他のモジュールでデータを読み出すという単純な方法です。

しかし、この場合、送受信データの同期に問題がある。

直感的には、MT4/MT5端末には一定の共有バッファメモリ領域があり、この領域を介したデータのやり取りを規制する手順があるのだろうと推測します。

でも、説明文にはそんなことは書いてありませんでした。

 
neverness:

異なるモジュール間のMT4/MT5転送手順に興味があります。

例えば、こんな感じです。

あるインジケーターから別のインジケーターへデータを転送する方法は?

インジケーターからスクリプトにデータを転送する方法は?

インジケータからExpert Advisorにデータを転送する方法は? などなど・・・。

転送されたデータを別のファイルに追加し、他のモジュールでこのデータをファイルから読み取るという単純な方法は、ごく当たり前で一般的な転送方法である。

しかし、この場合、転送・読み込みデータの同期に問題がある。

直感的には、MT4/MT5端末には一定の共有バッファメモリ領域があり、この領域を介したデータのやり取りを規制する手順があるのだろうと推測します。

しかし、説明書にはそのようなことは書いてありませんでした。

さて、データ転送は、ファイルや 端末の グローバル 変数を通じて行うことができます。

グローバル変数であれば

// записываем значение, помещаем это всё в OnTick()
GlobalVariableSet("Sname", 123.25);

// Получаем в любой программе эти значения, так-же внутри OnTick()
GlobalVariableGet("Sname"); // получим 123.25

1つの端末で全てのプログラム間のやり取りができる最も簡単な方法です

 
Vitaly Muzichenko:

さて、データの転送は、先に書いたように、ファイルを介して、あるいは 端末の グローバル変数を介して 行うことができます。

グローバル変数の場合。

1つの端末ですべてのプログラム間のやり取りができる最も簡単な方法です

オッケーです。インジケータ式に書いてみましょう。

GlobalVariableSet("Sname", 123.25); このイベントは、例えばonTick()のように発生 します。

しかし、スクリプトはデータ配列を扱うことができず、OnTick()イベントも持っていません。OnTick()イベントが発生したことをスクリプトが認識し、新しいデータを取得するためにプロシージャを適用すべき方法

GlobalVariableGet("Sname")。

OnTick()の代わりにOnTimer()イベントを使用することができます。しかし、スクリプトは独自のOnTimer()を持ち、インジケータは独自のものを持つので、両者は関係ない。

ここで問題です。

GlobalVariableSet("Sname", 123.25); とGlobalVariableGet("Sname"); イベントを確実に同期させるにはどうすればよいですか?

あるいは、"Sname "の値の変更を監視するプロシージャーがあるのでしょうか?OnChangeのように。

つまり、インジケータが "Sname "の値を変更し、その値が125,35になったことをスクリプトはどのようにして知るのでしょうか?

GlobalVariableSet("Sname", 123.25); とGlobalVariableGet("Sname"); の間のブリッジはどこにあるのでしょうか。

それぞれ別のプログラムになっています。


 
neverness:

OKです。インジケータに式を書いてみましょう。

GlobalVariableSet("Sname", 123.25); このイベントは、例えばOnTick()したときに発生 します。

しかし、スクリプトはデータ配列を扱うことができず、OnTick()イベントも持っていません。OnTick()イベントが発生したことをスクリプトが認識し、新しいデータを取得するためにプロシージャを適用すべき方法

GlobalVariableGet("Sname")。

OnTick()の代わりにOnTimer()イベントを使用することができます。しかし、スクリプトは独自のOnTimer()を持ち、インジケータは独自のものを持つので、両者は関係ない。

ここで問題です。

GlobalVariableSet("Sname", 123.25); とGlobalVariableGet("Sname"); イベントを確実に同期させるにはどうすればよいですか?

あるいは、"Sname "の値の変更を監視するプロシージャーがあるのでしょうか?OnChangeのように。

つまり、インジケータが "Sname "の値を変更し、その値が125,35になったことをスクリプトはどのようにして知るのでしょうか?

GlobalVariableSet("Sname", 123.25); とGlobalVariableGet("Sname"); の間のブリッジはどこにあるのでしょうか。

それぞれ別のプログラムになっています。

接続するのは、コンピューターのハードディスクです。レコードは、私は問題がないと思うし、あなたも、スクリプトで、任意のイベントでそれを得ることができる、それはあなたが現在の値ASKとBIDを取得する方法と異なることはありません


追伸:例えばインジケーターとスクリプトを添付しますが、インジケーターではティックボリュームを 記録しています。

インジケーター

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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(tick_volume,true);
  
  // записываем значение
   GlobalVariableSet("Sname", tick_volume[0]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

スクリプト

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    Alert(GlobalVariableGet("Sname"));
  }
//+------------------------------------------------------------------+
ファイル:
Set.mq5  4 kb
Get.mq5  1 kb
 
Vitaly Muzichenko:

そのつなぎ役がパソコンのハードディスクです。書いても問題ないと思いますが、スクリプトでもどのイベントからでも取得できるので、現在のASKとBIDの値を取得する方法と変わりません

カッコイイ!

そして、その方法は?

例を挙げてください。

例えば、そのような場合のシミュレーションをどうするか。

インジケータはデータを受け取り、データの分散を計算し、スクリプトのための楕円点座標を準備する(スクリプトに渡される4つのグローバル変数 Q1,Q2,T1,T2)。

さて、インジケータは、これらのグローバル変数を使用して楕円を描くスクリプトにコマンドを与える必要があります。

インジケーターはどうすればいいのか?

 
Vitaly Muzichenko:

そのつなぎ役がパソコンのハードディスクです。記録するのは問題ないと思いますが、スクリプトでも任意のイベントから取得できますので、ASKやBIDの現在値を取得する方法と変わりません


追伸:例えばインジケーターとスクリプトを添付しますが、インジケーターではティックボリュームを 記録しています。

インジケーター

スクリプト

この例では、スクリプトは起動時、つまりOnStart()イベントが発生したときに一度だけ動作します。

そして、どのように?

シンクロはどこにあるのか?

スクリプトとインジケータを同期して動作させるにはどうしたらよいですか?

例えば、ボリュームがある値を超えたときにスクリプトを有効にするにはどうしたらよいでしょうか。

 
neverness:

つまり、この例では、スクリプトは起動時、つまりOnStart()イベントが発生したときに一度だけ動作することになります。

そして、どのように?

シンクロはどこにあるのか?

スクリプトとインジケータを同期して動作させるにはどうしたらよいですか?

例えば、ボリュームがある値を超えたときにスクリプトを有効にするにはどうしたらよいでしょうか。

スクリプトをどのように扱うかは、あなたの仕事です。スクリプトではなくExpert Advisorを作成 する方が簡単なのでは?

数値を出すインジケーターです。

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   return(INIT_SUCCEEDED);

  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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(tick_volume,true);

  // записываем нужные значение
   GlobalVariableSet("Q1", tick_volume[0]);
   GlobalVariableSet("Q2", tick_volume[1]);
   GlobalVariableSet("T1", time[0]);
   GlobalVariableSet("T2", time[1]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


ループするスクリプトの簡単な例です。

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   while(!IsStopped())
    {
     double Q1 = GlobalVariableGet("Q1");
     double Q2 = GlobalVariableGet("Q2");
     datetime T1 = (datetime)GlobalVariableGet("T1");
     datetime T2 = (datetime)GlobalVariableGet("T2");
     Print("Q1 = ",Q1,", Q2 = ",Q2,", T1 = ",TimeToString(T1),", T2 = ",TimeToString(T2));
     Sleep(1000); // Пауза 1 секунда
    }
  }
//+------------------------------------------------------------------+

P.S. コードを修正しました。

 
Vitaly Muzichenko:

スクリプトをどのように扱うかはあなた次第です。スクリプトではなく、EAを作る 方が簡単なのでは?

数値を出すインジケーターです。


ループするスクリプトの簡単な例です。

MQLでは、異なるモジュールを同期させることはできないと理解していました。

オッケーです。では、ここで質問です。フィールド上にボタンを配置し、そのボタンにスクリプトを送り込んだらどうでしょうか。

MQLにそのような可能性はあるのでしょうか? それとも、そのような可能性もないのでしょうか?

結局のところ、スクリプトはどうにかして起動させなければならないのです

 
neverness:

MQLでは、異なるモジュールを同期させることはできないと理解しています。

オッケーです。では、ここで質問です。フィールド上にボタンを配置し、このボタンにスクリプトを送り込むとどうなるか。

MQLにそのような可能性はあるのでしょうか? それとも、そのような可能性もないのでしょうか?

スクリプトは何らかの方法で起動させなければならない!

トピックは古いですが、まだ読めますし、誰かが新しいことを提案してくれるかもしれません。私はスクリプトを実行せず、全く作業しない)

Как вызвать скрипт из индикатора
Как вызвать скрипт из индикатора
  • 2008.10.15
  • www.mql5.com
Подскажите можноли и как вызвать на выполнение скрипт из индикатора...