初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1461

 
Aleksandr Slavskii #:

如果 "智能交易系统 "中规定在删除 "智能交易系统 "时删除订单并平仓、

那么一切都将被删除和关闭

一个小补充:如果需要 2.5 秒。

Выполнение функции OnDeinit() ограничивается 2.5 секундами. Если за это время функция не закончила свою работу, то ее выполнение завершается принудительно.
 

我不知道该怎么做。

当鼠标滚轮滚动事件发生时,代码就会被执行。

鼠标滚轮可以一次滚动数次,我们得到的不是一个 dparam = 点击次数的事件,而是多个 dparam = +/-120 的事件。

代码会执行一段时间,这比滚动鼠标滚轮时的点击间隔时间要长得多。

结果,没有人再滚动鼠标滚轮,程序继续重新计算了一段时间。

//+------------------------------------------------------------------+
void OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_MOUSE_WHEEL, 0, true);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;

   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      //--- какой то код
      delta += dparam / 120;
      Sleep(1000);
      //---
      Print(delta);
     }
  }
//+------------------------------------------------------------------+
15:12:22.820    test (EURUSD,H1)        0.0
15:12:23.821    test (EURUSD,H1)        1.0
15:12:24.811    test (EURUSD,H1)        2.0
15:12:25.823    test (EURUSD,H1)        3.0
15:12:26.817    test (EURUSD,H1)        4.0
15:12:27.814    test (EURUSD,H1)        5.0
鼠标滚轮在 15:12:22.820 时滚动,然后程序又执行了 5 次,整整 5 秒钟。


问题:如何一次性执行程序代码,而不是多次执行。

即滚轮滚动 5 次,delta = dparam / 120 * 5。

 
Aleksandr Slavskii #:

我不知道该怎么做。

当鼠标滚轮滚动事件发生时,代码就会被执行。

鼠标滚轮可以一次滚动数次,我们得到的不是一个 dparam = 点击次数的事件,而是多个 dparam = +/-120 的事件。

代码会执行一段时间,这比滚动鼠标滚轮时的点击间隔时间要长得多。

结果是,没有人再滚动鼠标滚轮,程序继续重新计算了一段时间。

鼠标滚轮在 15:12:22.820 时滚动,然后程序又执行了 5 次,整整 5 秒钟。


问题:如何一次性执行程序代码,而不是多次执行。

即滚轮滚动 5 次,delta = dparam / 120 * 5。

试试这个

//+------------------------------------------------------------------+
void OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_MOUSE_WHEEL, 0, true);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;
   bool flag = true;
   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      //--- какой то код
      delta += dparam / 120;
      Sleep(1000);
      //---
      if(flag)
       {
        Print(delta);
        flag = false;
       }
     }
  }
//+------------------------------------------------------------------+

我没有检查,如果有的话,那就不是我的错了......))))))我得在标志上做文章......也许我得把代码放到一个自定义函数中,然后在那里处理标志。

 
非常感谢!
 

6 月 3 日,我发布了 MT5 的脚本(https://www.mql5.com/ru/code/44732).... 谁知道还要等多久?

Скачать бесплатно скрипт 'Quick Change MA (method, period)' от 'NotBuffett' для MetaTrader 5 в MQL5 Code Base
  • www.mql5.com
Скачать бесплатно скрипт 'Quick Change MA (method, period)' от 'NotBuffett' для MetaTrader 5 в MQL5 Code Base
 
Alexey Viktorov #:

试试这个

我没有检查,如果不是我的错......))))))我得想办法弄乱标志......也许我得把代码放到自定义函数中,然后在那里弄乱标志。

问题是自定义函数只能在事件函数中运行,而我的 EA 中只有两个这样的函数 OnInit 和 OnChartEvent。

总的来说,我成功地做到了,虽然不是王牌,但也比原来好一些。

//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;
   static ulong timeWheel = 0;
   static bool mouse_wheel = false;

   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      delta += dparam / 120;
      mouse_wheel = true;
      timeWheel = GetMicrosecondCount();
     }

   if(mouse_wheel && GetMicrosecondCount() - timeWheel > 0)
     {
      Print(delta);
      //--- какой то код
      Sleep(1000);
      //---
      delta = 0;
      mouse_wheel = false;
     }
  }
//+------------------------------------------------------------------+
23:48:28.853    test (EURUSD,H1)        1.0
23:48:29.857    test (EURUSD,H1)        1.0
23:48:30.856    test (EURUSD,H1)        4.0
23:48:31.881    test (EURUSD,H1)        2.0
23:48:32.880    test (EURUSD,H1)        4.0
23:48:33.887    test (EURUSD,H1)        11.0
23:48:34.914    test (EURUSD,H1)        15.0
23:48:35.926    test (EURUSD,H1)        7.0
23:48:36.936    test (EURUSD,H1)        9.0
23:48:46.477    test (EURUSD,H1)        6.0
23:48:47.479    test (EURUSD,H1)        -1.0
 
Aleksandr Slavskii #:

问题是自定义函数只能在事件函数中运行,而我的 EA 中只有两个这样的函数 OnInit 和 OnChartEvent。

总的来说,我设法做到了,虽然不是一个很好的主意,但还是比原来好一些。

您也可以OnChartEvent 调用自定义函数,不会有任何问题。

标志是在全局级别声明的。只插入 OnTick 来重置标志不会有问题,也不会延迟代码执行。

如果标志处于打开状态,则会调用自定义函数。在内部,标志是关闭的。在 OnTick 中,标志会再次打开并等待用户函数的下一次执行。

我认为这比卡住执行时间要容易得多。

 
Alexey Viktorov #:

您也可以OnChartEvent 调用自定义函数,这没有问题

标志是在全局级别声明的。仅插入 OnTick 来重置标志不会有问题,也不会延迟代码执行。

如果标志处于打开状态,则会调用自定义函数。在内部,标志是关闭的。在 OnTick 中,标志会再次打开,并等待用户函数的下一次执行。

我认为这比与执行时间绑定更简单。

我不太明白,或者说我完全不明白:)

如果没有 ticks,OnTick 在没有 ticks 的情况下也不起作用, 我该 怎么办?


事实上,无论如何我都会从OnChartEvent 调用自定义函数 这只是滚动滚轮时跟踪最后一次鼠标点击的问题。

我们的任务是将自定义函数的执行时间推迟到停止滚轮滚动的那一刻,同时计算滚动过程中的点击次数。

原则上,它是可行的。

 
NotBuffett #:

6 月 3 日,我发布了 MT5 的脚本(https://www.mql5.com/ru/code/44732).... 谁知道还要等多久?

刚刚发布了代码。验证时间不到一分钟。

很可能是您在发布时出错了。

 
Aleksandr Slavskii #:

刚刚发布了代码。检查还不到一分钟。

很可能是你在发布时犯了错误。

再次尝试发布...结果还是一样:

在 "5.测试 "下显示"测试已无差错完成",并提供了发布功能,但当你点击 "发布 "按钮时,却出现了一个错误

404.该页面不存在

在 "我的代码 "分栏中,现在有两个代码,并且都 "已被版主检查"。

一般来说,我会在普通主题中提问,也许版主还会注意到。