专家顾问 - 杂项问题 - 页 12

 
Marco vd Heijden:

我想是的。

这一点略有不同,但。

全局与静态的问题既不在这里也不在那里。但你的重置方法是好的。它可以防止超限。
 
honest_knave:
全局与静态的问题既不在这里也不在那里。但你的重置方法是好的。它可以防止超限。

我说得太早了。你的超限是在另一个方向。它将在以后按CTRL时触发。如果你点击图表,然后按CTRL,就会触发。

 

@honest_knave- 谢谢你的评论。非常感谢 - 但我开始先尝试@Marco vd Heijden 的评论。( 我看了你所有关于这个的评论。 )

@Marco vd Heijden- 谢谢你,伙计。

但我认为我做错了什么,也许我没有理解得更清楚。无论如何,我试过了,你可以在下面的代码中找到它。
请问我的错误在哪里?

//+------------------------------------------------------------------+
//|                                                      keydown.mq4 |
//|      Copyright 2016, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Marco vd Heijden, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

string prefix = "Custom Expert |";
string lotedit = prefix + "Edit Name";
string lotbtnplus = prefix + "Lot button Plus";
string lotbtnminus = prefix + "Lot button Minus";

double lot = 0.01, lotstep = 0.01 ;
bool ctrl_click;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
   EventSetTimer(60);

   graphicsObj();

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
    EventKillTimer();
    ObjectsDeleteAll( 0, prefix );
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
    graphicsObj();
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---

  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

    if( id == CHARTEVENT_CLICK )
    {
        if ( sparam == lotbtnplus )
        {
            ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
            lot = lot + lotstep;
            update();

            Print( " | lot plus :  ", lot );
            return;
        }

        Print( "Click" );
        ctrl_click = 1;
    }

    if( id == CHARTEVENT_KEYDOWN )
    {
        //Print(lparam);// print to identify keycode

        if( lparam == 17 )  // ctrl key
        {
            if( ctrl_click == 1 )// if mouse click
            {
                //Do Something when CTRL (keycode 17) is pressed
                if ( sparam == lotbtnplus )
                {
                    ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
                    lot = lot + ( lotstep * 10 );
                    Print( " | lot plus + Ctrl initial:  ", lot );
                    update();

                    Print( " | lot plus + Ctrl:  ", lot );
                    return;
                }
                Print( "Ctrl + Click" );
                ctrl_click = 0;  // reset
            }
        }
        ctrl_click = 0; // reset if not ctrl
    }
}

//|+--------------------------------------------------------------------------------+
//| -   Function Update                                                             |
//|+--------------------------------------------------------------------------------+
void update()
{
    //---
    ObjectSetString( 0, lotedit, OBJPROP_TEXT, DoubleToString( lot, 2 ) );
    //---
    return;
}
void graphicsObj()
{
    ObjectCreate(0, lotedit, OBJ_EDIT, 0,0,0);
    ObjectSetInteger(0, lotedit, OBJPROP_XDISTANCE, 30);
    ObjectSetInteger(0, lotedit, OBJPROP_YDISTANCE, 30);
    ObjectSetInteger(0, lotedit, OBJPROP_XSIZE, 60);
    ObjectSetInteger(0, lotedit, OBJPROP_YSIZE, 30);
    ObjectSetString(0, lotedit, OBJPROP_TEXT, DoubleToString( lot, 2 ));

    ObjectCreate( 0, lotbtnplus, OBJ_BUTTON, 0, 0, 0);
    ObjectSetString( 0, lotbtnplus, OBJPROP_TEXT, "+");
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_XDISTANCE, 100);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_YDISTANCE, 30);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_XSIZE, 70);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_YSIZE, 30);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_BACK, false);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_SELECTABLE, false);
}
 

你的第一个问题是,CHARTEVENT_CLICK与CHARTEVENT_OBJECT_CLICK 不一样。你想捕捉对一个对象的点击,而不是对图表的任何点击。

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

//    if( id == CHARTEVENT_CLICK )
    if( id == CHARTEVENT_OBJECT_CLICK )
 
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   static bool wasCTRL=false;
   if(id==CHARTEVENT_OBJECT_CLICK && sparam == lotbtnplus)
     {
      ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
      lot+=(wasCTRL)?lotstep*10:lotstep;
      update();
      Print( " | lot plus :  ", lot );
      return;
     }
   wasCTRL=(id==CHARTEVENT_KEYDOWN && lparam==17);
}
这可能有帮助。你可能会发现,只有在第二次点击鼠标的时候才会到0.1,这取决于你在CTRL之后按按钮的速度。
 
honest_knave:
这可能有帮助。你可能会发现,只有在第二次点击鼠标的时候才会到0.1,这取决于你在CTRL之后按下按钮的速度。

#Ctrl + 鼠标键 - 关闭

哇,就像它一样,惊人的巨大的感谢诚实的!

特别感谢@honest_knave@Marco vd Heijden

 
#SpreadSheet - 打开

上周五"Spreadsheet"被OnTick函数更新(我需要这个函数,它对我很好)。

(MT4平台更新了两次。) 更新后,这个电子表格没有在图表上更新,我检查了关于电子表格的一切,我没有看到任何问题。

我需要说明的是,我也在电子表格上使用了买入和卖出价格,买入和卖出价格运行良好,但电子表格却没有。

所以我对标签对象 使用了标签 功能--每一个标签对象在没有 "电子表格 "的情况下都运行良好。另外,我需要告知大家,当我为电子表格创建Label对象时,如果没有功能,它也能正常工作。
这个问题是在MT4平台升级后开始的,我不确定这个问题是怎么来的。

如果您理解我的担忧,请告诉我如何解决这个问题。
谢谢。

 

你有一些关于电子表格 的代码吗?

 
Marco vd Heijden:

你有一些关于电子表格的代码吗?

我还在研究这个问题,我也会很快发布一些代码,哪些是有效的,哪些是无效的。
 

我可以写两个不同的标签 函数吗?
(例如:1个用于文本,2个用于文本和字体大小。)