脚本: 切换图表

 

切换图表:

本脚本程序每隔一定的时间在所有打开的图表中做切换。也可以值显示某些交易品种的图表。

作者: Vladimir Karputov

 
晚上好!有可能循环使用脚本吗?这样,在开放图表结束后,它就会重新开始,而不是结束工作。
 
Skyline Real:
晚上好!有可能循环使用脚本吗?这样,在开放图表结束后,它就会重新开始,而不是完成工作。
原则上是可以的。但需要循环多少次呢?或者像万花筒一样整天循环?
 
Karputov Vladimir:
原则上可以。你需要做多少个循环?或者像万花筒一样--一整天?
嗯,一整天会更好.....。
 
Skyline Real:
那么,最好是一整天.....。

在这种情况下,您需要在 OnTimer() 中调用整个旋转木马的 EA。我会考虑的。

已添加。修正了文本。

 

总之,这就是智能交易系统。主要是要记住,在无限显示图表时,关闭/卸载智能交易系统有点麻烦:)。因此,让我提醒您,该智能交易系统显示在 "导航器 "窗口中:

导航器 "窗口中的 "专家顾问

这就是智能交易系统本身:

//+------------------------------------------------------------------+
//|Chart_bringing_too_top.mq5
//|版权 © 2016, 弗拉基米尔-卡尔普托夫 ||
//|http://wmua.ru/slesar/ ||
//+------------------------------------------------------------------+
#property copyright "版权归弗拉基米尔-卡尔普托夫 2016 所有
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The indicator switches all open charts after a certain interval."
//--- 输入参数
//--- 输入参数
input uchar Seconds=3;              // 间隔 // 间隔
//---
bool        IsCicle=false;          // true - in cicle // true - in cicle
//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建计时器
   if(Seconds<3)
     {
      MessageBox("Interval must be greater than 3 seconds");
      EventSetTimer(3);
     }
   else
      EventSetTimer(Seconds);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 专家去初始化函数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 销毁计时器
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| 定时器功能|
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(IsCicle)
      return;
   IsCicle=true;
//---
   uchar temp_second;
   if(Seconds<3)
      temp_second=3;
// 图表 ID 的变量
   long currChart,prevChart=ChartFirst();
//--- 显示第一个图形
//--- 显示第一个图表
   ChartBringToTop(prevChart);
   Sleep((int)MathAbs(temp_second*1000));
   int i=0,limit=100;
//Print("ChartFirst = ",ChartSymbol(prevChart)," ID = ",prevChart);
// 我们的开放图形可能不超过 100 个
// 我们的开放式图表肯定不超过 100 个
   while(i<limit)// 
     {
      // 基于前一个图形,我们得到一个新图形
      // 使用之前的图表 ID 获取新图表 ID
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  // 图表列表已结束 // 图表列表已结束
                              //Print(i," ",ChartSymbol(currChart)," ID =",currChart);
      ChartBringToTop(currChart);
      Sleep((int)MathAbs(temp_second*1000));
      // 为 ChartNext() 记住当前图表的 ID
      // 为 ChartNext() 保存当前图表 ID
      prevChart=currChart;
      // 别忘了增加计数器的数量
      // 不要忘记增加计数器
      i++;
     }
   IsCicle=false;
  }
//+------------------------------------------------------------------+
//| 向终端发送命令,将图形显示在所有其他图形之上。
//| 向终端发送命令,使图表显示在所有其他图表之上。
//+------------------------------------------------------------------+
bool ChartBringToTop(const long chart_ID=0)
  {
//-- 重置错误值
   ResetLastError();
//--- 将图表显示在所有其他图表之上
   if(!ChartSetInteger(chart_ID,CHART_BRING_TO_TOP,0,true))
     {
      //--- 将错误信息输出到 "专家 "日志中。
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
   ChartRedraw(chart_ID);
//--- 成功执行
   return(true);
  }
//+------------------------------------------------------------------+
附加的文件:
 
感谢您的及时回复。但是智能交易系统不能正常工作。如果打开的图表超过两个,EA 就会从第一个图表跳到最后一个图表,而跳过它们之间的其他图表。从最后一张图表到第一张图表之间没有过渡,即旋转木马不起作用。
 
Skyline Real:
感谢您的及时回复。但是智能交易系统不能正常工作。如果打开的图表超过两个,EA 就会从第一个图表跳到最后一个图表,而跳过它们之间的其他图表。从最后一张图表到第一张图表之间没有过渡,即旋转木马不起作用。
终端会在内部记录打开图表 的顺序。如果您在工作过程中调整图表,也不会改变内部记录。做个实验:关闭所有图表,打开五个新图表,并将智能交易系统附加到第 3 个图表。
 
Karputov Vladimir:
终端会对打开图表 的顺序进行内部核算。如果您在工作过程中调整图表,也不会改变内部记录。做个实验:关闭所有图表,打开五个新图表,将智能交易系统附加到第 3 个图表。

我检查了一下,一切正常。它从第 3 个图表切换到最后一个图表,然后停止。它不会从最后一个图表切换到第一个图表,也没有旋转木马。

我不知道这是否会影响它--我用的是 mt4。我将文件重命名为 mt4 并进行了编译。先前的脚本切换正确....

 

EA 1.01 版。修正了一个错误并替换了变量名。而不是

Seconds

现在变量名为

Seconds_
因为在 MQL4 中,"秒 "不能用作变量名。(关于 的帮助)。


Expert Advisor 可在 MetaTrader 5 和 MetaTrader 4 中使用(对于 MT4,只需重命名文件)。

Seconds - Документация на MQL4
  • docs.mql4.com
Seconds - Документация на MQL4
附加的文件:
 

一段 EA 运行视频--在无限模式下切换所有可用图表的万花筒: