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

 

下午好!

你能告诉我,代码编译是否可以在代码本身中设置?谢谢你。

 

我在点击轮子时,在评论中显示鼠标参数和4位数的价格标签。

只要按下滚轮,标记就会在光标后面运行,但在LC上按下鼠标之前松开滚轮时,我无法使同样的情况发生。

帮我搞清楚这个问题。


//+------------------------------------------------------------------+ 
//| Expert initialization function                                   | 
//+------------------------------------------------------------------+ 
void OnInit() 
  { 
//--- включение сообщений о перемещении мыши по окну чарта 
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1); 
//--- принудительное обновление свойств графика гарантирует готовность к обработке событий 
   ChartRedraw(); 
  } 
//+------------------------------------------------------------------+ 
//| MouseState                                                       | 
//+------------------------------------------------------------------+ 

string xlabel="Bid";
input color xcolor = clrCrimson;

string MouseState(uint state) 
  { 
   string res; 
   res+="\nML: "   +(((state& 1)== 1)?"DN":"UP");   // mouse left 
   res+="\nMR: "   +(((state& 2)== 2)?"DN":"UP");   // mouse right  
   res+="\nMM: "   +(((state&16)==16)?"DN":"UP");   // mouse middle 
   res+="\nMX: "   +(((state&32)==32)?"DN":"UP");   // mouse first X key 
   res+="\nMY: "   +(((state&64)==64)?"DN":"UP");   // mouse second X key 
   res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP");   // shift key 
   res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP");   // control key 
   res+="\nBID" + DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_BID), _Digits-1);
   return(res); 
  }
   
//+------------------------------------------------------------------+ 
//| ChartEvent function                                              | 
//+------------------------------------------------------------------+ 
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) 
  { 
  
int x=(int)lparam; 
int y=(int)dparam; 
datetime dt    =0; 
double   price =0;
int      window=0;

   if(id==CHARTEVENT_MOUSE_MOVE) 
      Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam)); 

   if(sparam =="16")
      {
         
      if(!ObjectCreate(0, xlabel, OBJ_LABEL,0, 0, 0));
      //ObjectCreate(0, xlabel, OBJ_LABEL,0, 0, 0);
      ObjectSetInteger(0, xlabel, OBJPROP_XDISTANCE, 100);
           ObjectSetInteger(0, xlabel, OBJPROP_YDISTANCE, dparam+7);
      ChartXYToTimePrice(0,x,y,window,dt,price);
      ObjectSetString(0, xlabel, OBJPROP_TEXT, DoubleToString(price, _Digits-1));
      }
      
      
  /*  while(sparam !="1")
      {
         ObjectMove(0,xlabel,0,lparam,dparam+7);      
      }
  */
  }
  
void OnDeinit(const int reason) 
   { 
      Comment("");
      ObjectDelete(0,xlabel);
   } 
 
psyman:

我在点击轮子时,在评论中显示鼠标参数和4位数的价格标签。

只要按下滚轮,标记就会在光标后面运行,但 在LK上按下鼠标之前松开滚轮时,我无法使同样的事情发生

移除(已评论)。
// if(sparam =="16")

 
Taras Slobodyanik:

移除(已评论)。
// if(sparam =="16")


那么标记就会一直出现在屏幕上,而你希望它只在你按下方向盘时出现。



PS

你的回答给了我正确的想法,谢谢你 :-)

 
psyman:

我在点击轮子时,在评论中显示鼠标参数和4位数的价格标签。

当滚轮被按下时,标记在光标后面运行,但当滚轮在LK上按下鼠标之前被释放时,我无法使同样的事情发生。

帮我搞清楚这个问题。


if(label)
{
   //применение изменяющихся параметров(перемещение и прочее)
}
if(sparam =="16")
{
   label = true;
   //создание метки и настройка неизменяющихся параметров метки
}
if(sparam =="1") // или какой там символ у ЛК мыши
{
   label = false;
   //удаление/скрытие метки, если нужно
}

标签为bool类型

 
Ilya Prozumentov:

标签为bool类型

我可以在创建标签之前移动它吗?


现在我有另一个问题:我想在屏幕的右侧放置一个标签,这是在OnCalculate中计算的。

int width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);

ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width); 

Print(width);

不知何故,它变成了在最左边的位置,而在OnChartEvent中对另一个标记的同样计算却给出了正确的结果。

为什么会导致倒计时倒置?

 
psyman:

能否在创建标记之前进行移动?


现在我有另一个问题:我想把一个标记移到屏幕的右边,这是在OnCalculate中计算的

但在OnChartEvent中对另一个标记进行同样的计算,结果却是正确的。

为什么会发生倒计时倒置?

标签最初被设置为false,因此带有移动标记的代码片段将不会被执行。但是,即使它在标签创建之前被执行,也不会发生任何事情,程序将继续运行,后来创建的标签也不会受到影响。

注意锚点,不同的锚点会导致不同的结果。你可以立即尝试用0来代替宽度,如果它表现得很好,就说明是锚点的问题。

OBJ_LABEL - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
OBJ_LABEL - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
Следующий скрипт создает и перемещает на графике объект "Текстовая метка". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах. //| Создает текстовую метку                                          |...
 
Ilya Prozumentov:

label最初被设置为false,所以移动标签的那段代码将不会被执行。但是,即使它在标签创建之前被执行,也不会发生任何事情,程序将继续运行,之后创建的标签也不会受到影响。

注意锚点,不同的锚点会导致不同的结果。你可以立即尝试写0来代替宽度,如果它的行为符合预期,这意味着问题出在锚点上。

我没有锚点,我只在垂直方向上移动,我设置一次地平线,通过屏幕的宽度。从另一边算起,这不是一个问题,但令人惊讶的是,同一个动作在不同的职能部门有不同的表现。


还有一个问题--如果Bid显示为标签文本,我应该用哪个函数来做最合适--OnChartEvent还是OnCalculate?

 
novichok2018:

下午好!

你能告诉我,代码编译是否可以在代码本身中设置?谢谢你。

这可能是一个愚蠢的问题,因为没有人回答,但我还如何处理EA在编译后停止和恢复的问题?

平台给出的信息是:数组超出了范围(284,17)。

第284行:NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);第17位用NomNews打开一个方括号,它由0全局启动

我把0改为1,但没有结果。
我把if(NomNews==300)break; 300这一行改成了360000,但没有 用。

我编译了它--它在几分钟内工作正常。那该怎么做呢?

 
novichok2018:

这可能是一个愚蠢的问题,因为没有人回答,但我还如何处理EA在编译后停止和恢复的问题?

平台给出的信息是:数组超出了范围(284,17)。

第284行:NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh);第17位用NomNews打开一个方括号,它是由0全局启动

我把0改为1,但没有结果。
我把if(NomNews==300)break; 300这一行改成了360000,但没有 用。

我编译了它--它在几分钟内工作正常。那该怎么做呢?

NewsArr数组 在第二维中的维度 是多少?
原因: