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

 

Program.mqhからデータを要求する方法を教えてください。

次のようなコードがあります。

//--- Определение точек
double stS=0,opS=0,stB=0,opB=0;
   if(ObjectsTotal(0,0,OBJ_TREND)>0)
      {
      stS=NormalizeDouble(ObjectGet("OrderS",OBJPROP_PRICE1)+5*Point,Digits-1);
      opS=NormalizeDouble(ObjectGet("OrderS",OBJPROP_PRICE2)-5*Point,Digits-1);
      stB=NormalizeDouble(ObjectGet("OrderB",OBJPROP_PRICE1)-5*Point,Digits-1);
      opB=NormalizeDouble(ObjectGet("OrderB",OBJPROP_PRICE2)+5*Point,Digits-1);
      }
EAにポイントデータを要求するには?
 
MakarFX:

Program.mqhからデータを要求する方法を教えてください。

このようなコードがあります。

EAにポイントデータを要求するには?

どのチャートからもオブジェクトを取得するのに必要なのは、オブジェクト名とチャート識別子だけ です。

#property script_show_inputs

//--- input parameters
input long     chartID = 0;
input string   name = "OrderS";
input int      subwin = 0;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
//---
  double stS = 0, opS = 0, stB = 0, opB = 0;
  if(ObjectsTotal(chartID, subwin, OBJ_TREND) > 0) {
    stS = NormalizeDouble(ObjectGetDouble(chartID, name, OBJPROP_PRICE1) * Point, Digits);
    opS = NormalizeDouble(ObjectGetDouble(chartID, name, OBJPROP_PRICE2) * Point, Digits);
    stB = NormalizeDouble(ObjectGetDouble(chartID, name, OBJPROP_PRICE1) * Point, Digits);
    opB = NormalizeDouble(ObjectGetDouble(chartID, name, OBJPROP_PRICE2) * Point, Digits);
    Print("stS: ", stS, "; opS: ", opS, "; stB: ", stB, "; opB: ", opB, ".");
  }
}

このように、MQL4では、どのプログラムからでも、どのオブジェクトのデータでも取得することができます。

Документация по MQL5: Операции с графиками / ChartID
Документация по MQL5: Операции с графиками / ChartID
  • www.mql5.com
Операции с графиками / ChartID - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mihail Matkovskij:

どのチャートからもオブジェクトを取得するのに必要なのは、オブジェクト名とチャート識別子だけ です。

このように、MQL4では、どのプログラムからでも、どのオブジェクトのデータでも取得することができます。

誤解しているようだが...

上記のコードは、ファイル Program.mqh =>OnTimerEvent にあります。

ポイントの値は定期的に更新され、Expert Advisorはこの値を受信する必要があります。

そこで、Program.mqhにデータを要求する方法について質問します。

void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//--- Индикатор выполнения
   static int count1=0;
//--- Пауза между обновлением элементов
   static int count2=0;
   if(count2<200)
     {
      count2+=TIMER_STEP_MSC;
      return;
     }
//--- Обнулить счётчик
   count2=0;
//--- Определение точек
double stS=0,opS=0,stB=0,opB=0;
   if(ObjectsTotal(0,0,OBJ_TREND)>0)
      {
      stS=NormalizeDouble(ObjectGet("OrderS",OBJPROP_PRICE1)+5*Point,Digits-1);
      opS=NormalizeDouble(ObjectGet("OrderS",OBJPROP_PRICE2)-5*Point,Digits-1);
      stB=NormalizeDouble(ObjectGet("OrderB",OBJPROP_PRICE1)-5*Point,Digits-1);
      opB=NormalizeDouble(ObjectGet("OrderB",OBJPROP_PRICE2)+5*Point,Digits-1);
      }
  }
 
MakarFX:

あなたは私を誤解している...

上記のコードは、Program.mqh =>OnTimerEvent の中にあります。

ポイントの値は定期的に更新され、Expert Advisorはこれらの値を受信する必要があります。

そこで質問ですが、Program.mqhからデータを要求するにはどうしたらよいのでしょうか?

変数を宣言することは誰にも止められない。

double stS = 0, opS = 0, stB = 0, opB = 0;

を宣言し、Expert Advisor から問題なくアクセスできるようになりました。

MakarFX:

誤解しているようだが...

もちろん、問題の説明がもっと充実していなければならないので、すぐには理解できなかった。理想的には、ソースコードを追加することが望ましい。

 
Mihail Matkovskij:

Program.mqh ファイルはEAに接続されていますか?

もしそうなら、誰もあなたが変数を宣言することを止めはしません。

のグローバルスコープを使用し、Expert Advisorから問題なくアクセスすることができます。

Program.mqh ファイルが接続されました...

では、グローバルに変数を宣言してみます。

 
MakarFX:

Program.mqh ファイルが接続されました...

ここで、変数を gobally に宣言してみます。

Edited:https://www.mql5.com/ru/forum/160683/page1199#comment_17172497 最初、私を混乱させたので...

 
Mihail Matkovskij:

変数を宣言することは誰にも止められない。

を CProgram クラスのパブリックエリアに配置し、Expert Advisor から問題なくアクセスできるようにしました。

はたらかない

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(void)
  {
  if (program.stS<0)::Print("ERROR");
  }


 
MakarFX:

ノーマーク


CProgram クラスのソースコードまたはコードが必要です。そうでないと、うまくいきませんから...。

こういう風に作れという意味です。

class CProgram : ... {
...
public:
  double stS, opS, stB, opB;
...
3人組は、あなたのクラスでは知らないことです :)
 
Mihail Matkovskij:

CProgram クラスのソースコードまたはコードが必要です。そうでないと、仕事にならないから...。

こういう風に作れという意味です。

3つの点、それはあなたのクラスについて知らないことです :)

ありがとうございます!!!うまくいった。

私は無意識のうちに

public:
  double stS=0, opS=0, stB=0, opB=0;

ゼロを取ったらうまくいった。

ありがとうございました。

 
MakarFX:

ありがとうございます!!!すべてうまくいった。

私は無意識のうちに

ゼロを取ったらうまくいった。

ありがとうございました。

もうひとつ。初期化を行った方が良い。

CProgram::CProgram():
  stS(0), opS(0), stB(0), opB(0)
{
  ...
}

そうでない場合、OnTick()で読み込みを行うと、Expert Advisorはタイマーのティック前にランダムな データを変数で受け取る可能性があります。