专业人士怎么说:如何在MQL中获得鼠标滚动值? [转贴自第五论坛]。 - 页 7

 
Artyom Trishkin:

什么能帮助他?你的悼词?你还没有显示出解决方案。你展示了你自己。这是非常、非常值得期待的。

为什么不呢? 稍微思考一下,每个人都会找到一个解决方案。我给了一个提示,在哪里可以找到它。在哪个方向探索。把所有的东西都放在银盘子里,这并不有趣。))如果你需要,我可以帮助这个人,引导他找到解决办法。但你似乎只想和我争论)。
 
Vitaly Muzichenko:

这就是它吗?

你有错误的倾向。你首先对我大喊大叫(比如 "你的代码是垃圾"、"死尸"),然后询问并讨论问题的解决方案。因此,请自己思考。

或者等待我去帮助那些值得帮助的人。

 
Artyom Trishkin:

什么能帮助他?你的悼词?你还没有显示出解决方案。你展示了你自己。这是非常、非常值得期待的。

你的注意力明显不集中。

看,在我回应的帖子的底部,这个人在请求 "指点迷津"。他不是在要求解决方法。所以我试图推他。现在你知道你的干涉是多么不恰当和可笑了吗?它所带来的只是无用的垃圾。你最好就事论事地进行沟通。你会对自己和他人有更多好处。

 
Реter Konow:

你有错误的倾向。你首先对我大喊大叫(比如 "你的代码是垃圾"、"死尸"),然后询问并讨论问题的解决方案。因此,请自己思考。

或者等待我去帮助那些值得帮助的人。

我不是在问,我是在陈述一个事实。

 
Vitaly Muzichenko:

我不是在问,我是在陈述一个事实。

什么事实?
 

在这里,许多人没有看到表格背后的内容。他们不能理解,如果没有想法,没有能力实现它,他们对形式的坚持就不会产生高质量的内容。

本质可以有多种体现形式,只有不称职的人才能通过其表达的语言来判断它。

 
Vitaly Muzichenko:

我不是在问,我是在陈述一个事实。

我也要陈述一个事实。

你的 "产品 "是一种无能和可笑的努力。

这是我在很长一段时间内见过的最垃圾的东西。


不要把真实的批评放在心上。:)

 
Реter Konow:
为什么? 稍微思考一下,每个人都会找到解决办法。我给了你一个提示,在哪里可以找到它。在什么方向调查。把所有的东西都放在银盘子里,这并不有趣。))如果你需要,我可以帮助这个人,引导他找到解决办法。但似乎你只是想和我争论)。

你好,彼得!
难道你不想说你有一个实用的解决方案,如何通过MQL滚动鼠标滚轮?而不是用键盘箭头或鼠标按钮--这并不难理解。当然,我们可以使用事件CHARTEVENT_CHART_CHANGE来确定图表是否用滚轮滚动,如果没有按下任何键,但只是概率性的,因为这个事件可能只是在一个新的条形图 到来或价格急剧变化 时发生,导致垂直比例的改变。另外,用这种方法不可能总是得到滚轮滚动事件,例如,当图表到达极左或极右位置时,如何在不滚动图表的情况下实现这一点。也许你的意思是使用ChartNavigate函数将图表向后移动,但这将是一个非常歪曲的实现,它不可能正确地过滤掉除滚动鼠标滚轮以外的所有其他图表变化的原因。 在我看来,这只能通过黑掉MT或了解一些未记录的命令和/或事件来实现。 无论如何,我不相信你有这样一个实现的例子。

而你有一个奇怪的暗示,虽然。对于 "如何通过鼠标滚轮获得滚动事件?"这个问题,你给出的答案是 "使用滚动事件和一个移动图形的函数"。

也许我错了,而你实际上有一个例子。那么你是一个很酷的人))好吧,那么至少放弃ex4(ex5)文件,而不是代码。

 
Nikolai Semko:

嗨,彼得!
难道你不想说你有一个实用的解决方案,如何在MQL中用鼠标滚轮滚动?而不是用键盘箭头或鼠标按钮--这并不难理解。当然,我们可以使用事件CHARTEVENT_CHART_CHANGE来确定图表是否用滚轮滚动,如果没有按任何键,但只是概率性的,因为这个事件可能只是在一个新的条形图 到来或价格急剧变化 时发生,导致垂直比例的改变。另外,用这种方法不可能总是得到滚轮滚动的事件,例如,当图表到达极左或极右位置时,如何在不滚动图表的情况下实现这一点。也许你的意思是使用ChartNavigate函数将图表向后移动,但这将是一个非常歪曲的实现,它不可能正确地过滤掉除滚动鼠标滚轮以外的所有其他图表变化的原因。 在我看来,这只能通过黑掉MT或了解一些未记录的命令和/或事件来实现。 无论如何,我不相信你有这样一个实现的例子。

而你有一个奇怪的暗示,虽然。对于 "如何通过鼠标滚轮获得滚动事件?"这个问题,你给出的答案是 "使用滚动事件和一个移动图形的函数"。

也许我错了,而你实际上有一个例子。那么你是一个很酷的人))好吧,那么至少放弃ex4(ex5)文件,而不是代码。

嗨,Nikolay!

信不信由你,解决方案非常简单。它需要15-20行代码。不过,有一点很微妙--滚动机制的具体实施。我的实现与标准的实现有一些不同。它滚动的是画布,不是对象。在Anatoly的库中也有类似的实现。

我是用滚轮滚动的,通过 "紧紧抓住 "图表的运动,我得到了一种能量化的效果。当然,图表会抽动,但总是会回到它的初始位置。这就是图表转换功能的作用。图表移位方向也是由mql-函数得到的。因此,我不需要入侵任何东西)。MQ已经试图给予尽可能广泛的功能,以实现几乎所有的任务。这甚至令人惊讶。也许他们自己也不知道他们为开发者开放的所有功能)。

 
Nikolai Semko:

总之,我不相信你有这样一个实施的例子。

而你有一个奇怪的暗示,虽然。对于"如何通过鼠标滚轮获得滚动事件?" 这个问题,你给出的答案是 "使用滚动事件和移动图形的函数"。

也许我错了,而你实际上有一个例子。那么你是一个很酷的人))好吧,至少放下ex4(ex5)文件,而不是代码。

情况是这样的。我回帖的那个人让我给他一个主意,如何用滚轮实现滚动机制。我给了他一个提示。当地不怀好意的人立即发难,开始指责我吹牛和其他一些无稽之谈。

从他们的角度来看,如果我给出一个解决方案,那么我要么是在为我的产品做广告,要么就是在吹牛,如果没有,那么我就是在欺骗,我什么都没有。

我可以给你代码,但首先,它将从滚动机制的实现中分离出来,其次,它将是俄语的。但也许你可以根据你的滚动机制来调整它。我不能把eh4,因为我不能把一个单一的机制从它运作的图形环境中 "撕裂"。

最好的选择,是在一般情况下给你解决方案,但不是为了证明什么,而是在友谊的基础上。

就这样。

CHARTEVENT_CHART_CHANGE事件是在鼠标滚轮移动事件中产生的,如果光标在图形上的话。图表偏移选项必须被启用。因此,从图表的偏移量来看,我们可以准确地知道我们何时转动轮子。我们可以生成一个自定义事件。例如,"SCROLLER_EVENT"。

接下来,我们的任务是确定偏移的方向。我们使用ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);在每个 "SCROLLER_EVENT "事件中,我们得到第一个可见条形的数字,并确定它是比我们记录的前一个条形的数字多还是少。如果它更多,那么它就会向一个方向移动;如果它更少,那么它就会向相反方向移动。同时,我们的图表也会滚动,可以到达最末端。为了防止这种情况,我们使用ChartNavigate函数纠正其位置,并将图表设置在其初始位置。这个调用也产生了CHARTEVENT_CHART_CHANGE事件,它将使我们的滚动功能失效。因此,在图表位置修正时,我们必须跳过CHARTEVENT_CHART_CHANGE事件,不对其作出反应。这需要使用一个标志系统。

这是我的代码,看起来是这样的。

//=====================================================================================================================================    
 if(id == CHARTEVENT_CHART_CHANGE && !n)
   {
    if(СОБЫТИЕ_ИНТЕРФЕЙСА != _SCROLLER_EVENT)
      {
       СОБЫТИЕ_ИНТЕРФЕЙСА = _SCROLLER_EVENT; 
      } 
    //------------------------------------  
    if(!Номер_первого_бара){ChartNavigate(0,CHART_END,-100); Номер_первого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);}
    //------------------------------------    
    Номер_этого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
    //------------------------------------
    int Основание_выпадающего_списка = КАНВАС - 1;
    int Ползунок_                    = КАНВАС + 4;
    int Вертикальная_полоса          = КАНВАС + 2;
    //------------------------------------
    if(Номер_этого_бара > Номер_первого_бара)
      {
       Прокрутка_вниз = 1;
       Прокрутка_вверх = 0;
       Сдвиг = 25;
       n = 1;
      }
    if(Номер_этого_бара  < Номер_первого_бара) 
      {
       Прокрутка_вниз = 0;
       Прокрутка_вверх = 1;
       Сдвиг = -25;
       n = 1;
      }//Alert(__FUNCTION__," Номер_первого_бара   ",Номер_первого_бара,"  Номер_этого_бара  ",Номер_этого_бара);  
    //------------------------------------
    if(КАТЕГОРИЯ_КАНВАСА_ОБЪЕКТА == _SCROLL_BAR_CANVAS && !G_CORE[ОКНО][Вертикальная_полоса][_OBJECT_HIDE])
      {
       int Поле_обзора = G_CORE[ОКНО][КАНВАС][_VIEW_SQUARE];
       //Элемент которому принадлежит сам канвас.
       int Элемент_прокручиваемого_канваса =  G_CORE[ОКНО][КАНВАС][_MAIN_ELEMENT];
       //Канвас элемента, которому принадлежит прокручиваемый канвас.
       int Канвас_того_элемента = G_CORE[ОКНО][Элемент_прокручиваемого_канваса][_DROWING_CANVAS];
       int Группа_элемента_прокручиваемого_канваса = G_CORE[ОКНО][Элемент_прокручиваемого_канваса][_OBJECT_GROUP];

       //------------------------------------
       G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] -= Сдвиг;
       //------------------------------------
       if(G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] > G_CORE[ОКНО][Поле_обзора][_Y])
        {          
         G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] = G_CORE[ОКНО][Поле_обзора][_Y];
        } 
       if((G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] + G_CORE[ОКНО][КАНВАС][_Y_SIZE]) < (G_CORE[ОКНО][Поле_обзора][_Y] + G_CORE[ОКНО][Поле_обзора][_Y_SIZE]))
         {
          G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y] = (G_CORE[ОКНО][Поле_обзора][_Y] + G_CORE[ОКНО][Поле_обзора][_Y_SIZE]) - G_CORE[ОКНО][КАНВАС][_Y_SIZE];
         }
       //------------------------------------  
       G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] = G_CORE[ОКНО][Поле_обзора][_Y] - G_CORE[ОКНО][КАНВАС][_IMAGE_VIRTUAL_Y];  
       //------------------------------------
       ObjectSetInteger(0,G_CORE[ОКНО][КАНВАС][_NAME],OBJPROP_YOFFSET,G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE]);
       //------------------------------------ 
       G_CORE[ОКНО][Ползунок_][_Y] = G_CORE[ОКНО][Вертикальная_полоса][_Y] + ((double)G_CORE[ОКНО][КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] / ((double)G_CORE[ОКНО][Ползунок_][_V_SCROLL_BAR_HANDLE_STEP] / 10000));
       //------------------------------------ 
       if(Группа_элемента_прокручиваемого_канваса == VIEW_BOX)
         {
          Нарисовать_элемент(ОКНО,Канвас_того_элемента,Элемент_прокручиваемого_канваса);
         } 
       //------------------------------------
       if(Группа_элемента_прокручиваемого_канваса == DROP_LIST)
         {
          Нарисовать_элемент(ОКНО,Поле_обзора,Элемент_прокручиваемого_канваса);
         } 
      }    
  }
//------------------------------------------------------
if(qw){n = 0; qw = 0;} 
if(n == 1){ChartNavigate(0,CHART_END,-100);  qw = 1;} 
//------------------------------------------------------
//Alert(__FUNCTION__,"  Прокрутка_вниз  ",Прокрутка_вниз,"  Прокрутка_вверх  ",Прокрутка_вверх);
//=====================================================================================================================================   



已添加。

至于其他导致图表转移的原因,当然,它们会给我们的系统带来错误。然而,这些错误是如此的微不足道,以至于我们不应该对它们给予过多的关注。因此,如果新条形图将我们的画布移动几个像素...这不是什么大问题。而且,这只是在当时光标将在滚动条上的情况下。

当然,实施是为了在无望的情况下找到一条出路。由于完全不能用滚轮滚动,这是最简单和最 "原生 "的解决方案。对于一个全面的解决方案,我已经联系了servicedesk。是否如此,取决于开发商。