新人对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

点的数值会定期更新,专家顾问需要接收这些数值。

因此,问题是:如何从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。

点的数值会定期更新,专家顾问需要接收这些数值。

因此,我的问题是:我怎样才能从Program.mqh请求数据?

没有人阻止你申报变量。

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

在CProgram类的公共区域中声明变量,并从Expert Advisor中访问它们,没有任何问题。

MakarFX:

你误解了我的意思...

当然,我没有马上理解,因为对问题的描述必须更加完整。理想情况下,最好能添加源代码。

 
Mihail Matkovskij:

Program.mqh 文件是否与EA连接

如果是,没有人阻止你声明变量。

在CProgram类的全局范围内,可以毫无问题地从Expert Advisor中访问它们。

Program.mqh 文件已连接...

现在我将尝试全局地声明变量

 
MakarFX:

Program.mqh 文件已连接...

现在试着用gobally来声明这些变量

编辑: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;
...
三人组是我不知道的,你的班级:)
 
Mihail Matkovskij:

需要源代码或CProgram 类的代码。否则,它将无法完成工作...

我的意思是让它像这样。

三个点,这就是我对你的班级不了解的地方 :)

谢谢你!!!。它起作用了。

我在不知不觉中把

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

我去掉了零,它就成功了。

非常感谢你。

 
MakarFX:

谢谢你!!!。这一切都成功了。

我在不知不觉中把

我去掉了零,它就成功了。

非常感谢你。

还有一件事。最好是进行初始化。

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

否则,如果在OnTick()中进行读取,专家顾问可能会在定时器的tick之前收到 变量中的随机 数据。