新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 618

 
neverness:

我直截了当地告诉你,当你自己都不知道的时候,你不应该教别人。

帮助应该是 "合格的",而不是 "来自街头的"!

再次重新定义问题,到底需要什么。

 
Vitaly Muzichenko:

再次重新描述任务,确切地说是需要什么。

我对能够在不同模块之间传输MT4/MT5的数据感兴趣。

比如说。

如何将数据从一个指标转移到另一个指标?

如何将数据从一个指标转移到一个脚本?

如何将数据从指标转移到专家顾问?等等。

简单地将转移的数据添加到一个单独的文件中,然后在其他模块中从文件中读取这些数据是非常明显和常见的转移方式。

但在这种情况下,有一个传输/读取数据的同步问题。

直观地讲,我想MT4/MT5终端一定有一定的共享缓冲内存区域,而且一定有程序来规范通过该区域的数据交换。

但我在描述中没有发现这样的内容。

 
neverness:

我对不同模块之间的MT4/MT5转移程序感兴趣。

比如说。

如何将数据从一个指标转移到另一个指标?

如何将数据从一个指标转移到一个脚本?

如何将数据从指标转移到专家顾问?等等。

简单地将转移的数据添加到一个单独的文件中,然后在其他模块中从文件中读取这些数据是非常明显和常见的转移方式。

但在这种情况下,有一个传输/读取数据的同步问题。

直观地讲,我想MT4/MT5终端一定有一定的共享缓冲内存区域,而且一定有程序来规范通过该区域的数据交换。

但我在描述中没有发现这样的内容。

那么,数据传输可以通过一个文件或 终端的 全局变量 进行。

如果它是一个全局变量。

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

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

这是在一个终端中的所有程序之间进行交换的最简单方法。

 
Vitaly Muzichenko:

那么,数据传输可以通过一个文件,或者 终端的 一个全局变量,就像之前写的那样

如果是全局变量。

这是在一个终端中的所有程序之间进行交换的最简单方法。

好的。让我们在指标中写一个表达式。

GlobalVariableSet("Sname", 123.25); 这个事件发生,例如onTick()

但脚本不能与数据数组一起工作,而且它们没有OnTick()事件。脚本如何知道OnTick()事件已经发生,并且应该应用程序来获取新的数据

GlobalVariableGet("Sname")。

你可以使用OnTimer()事件而不是OnTick()。但是,脚本有自己的OnTimer(),而指标有自己的OnTimer(),它们之间并不相互关联。

问题就在这里。

如何确保GlobalVariableSet("Sname", 123.25);和GlobalVariableGet("Sname"); 事件是同步的

或者是否有一个程序可以监控 "Sname "值的变化?像OnChange一样。

也就是说,脚本如何知道指标已经改变了 "Sname "的值,并且这个值已经变成了125,35 ?

GlobalVariableSet("Sname", 123.25);和GlobalVariableGet("Sname"); 之间的桥梁在哪里

他们在不同的项目中。


 
neverness:

好的。让我们在指标中写一个表达式。

GlobalVariableSet("Sname", 123.25); 这个事件发生时,例如OnTick()

但脚本不能与数据数组一起工作,而且它们没有OnTick()事件。脚本如何知道OnTick()事件已经发生,并且应该应用程序来获取新的数据

GlobalVariableGet("Sname")。

你可以使用OnTimer()事件而不是OnTick()。但是脚本有自己的OnTimer(),而指标也有自己的OnTimer(),所以它们之间没有关系。

问题就在这里。

如何确保GlobalVariableSet("Sname", 123.25);和GlobalVariableGet("Sname"); 事件是同步的

或者是否有一个程序可以监控 "Sname "值的变化?像OnChange一样。

也就是说,脚本如何知道指标已经改变了 "Sname "的值,并且这个值已经变成了125,35 ?

GlobalVariableSet("Sname", 123.25);和GlobalVariableGet("Sname"); 之间的桥梁在哪里

他们在不同的项目中。

连接环节是计算机硬盘。记录 我认为问题不在于此,你可以在任何情况下得到它,甚至在脚本中,它与你如何得到当前值ASK和BID没有区别


P.S. 我附上一个指标和脚本,例如,在指标中我们记录了tick的数量

指标

//+------------------------------------------------------------------+
//|                                                          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的当前值没有区别。


P.S. 我附上一个指标和脚本,例如,在指标中我们记录了tick的数量

指标

剧本

在你的例子中,该脚本只工作了一次--在启动时,即当事件OnStart()发生时。

然后如何?

同步性在哪里?

你如何使脚本与指标同步工作?

例如,如何在数量超过一定值时启用脚本?

 
neverness:

因此,在你的例子中,该脚本只工作了一次--在启动时,也就是在OnStart()事件发生时。

然后如何?

同步性在哪里?

你如何使脚本与指标同步工作?

例如,如何在数量超过一定值时启用脚本?

如何使用该脚本是你的任务。创建一个专家顾问 而不是一个脚本不是更容易吗?

一个给出数值的指标。

//+------------------------------------------------------------------+
//|                                                          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
Подскажите можноли и как вызвать на выполнение скрипт из индикатора...