//+------------------------------------------------------------------+//| ButtonClickExpert.mq5 |//| Copyright 2009, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright "2009, MetaQuotes Software Corp."#property link "http://www.mql5.com"#property version "1.00"string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- создадим кнопку, для передачи пользовательских событийObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
ObjectSetInteger(0,buttonID,OBJPROP_COLOR,White);
ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,Gray);
ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
ObjectSetString(0,buttonID,OBJPROP_TEXT,"Кнопка");
ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
//--- создадим метку для вывода информацииObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
ObjectSetInteger(0,labelID,OBJPROP_COLOR,Red);
ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);
//---return(0);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---ObjectDelete(0,buttonID);
ObjectDelete(0,labelID);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
}
//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &sparam)
{
//--- проверим событие на нажатие кнопки мышкиif(id==CHARTEVENT_OBJECT_CLICK)
{
string clickedChartObject=sparam;
//--- если нажатие на объекте с именем buttonIDif(clickedChartObject==buttonID)
{
//--- состояние кнопки - нажата кнопка или нетbool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
//--- выведем в лог отладочное сообщениеPrint("Кнопка нажата =",selected);
int customEventID; // номер пользовательского события для отправкиstring message; // сообщение для отправки в событии//--- если кнопка нажатаif(selected)
{
message="Кнопка нажата";
customEventID=CHARTEVENT_CUSTOM+1;
}
else// кнопка не нажата
{
message="Кнопка отжата";
customEventID=CHARTEVENT_CUSTOM+999;
}
//--- отправим пользовательское событие "своему"графикуEventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
//--- отправим сообщение всем открытым графикам
BroadcastEvent(ChartID(),0,"Broadcast Message");
//--- отладочное сообщениеPrint("Отправлено событие с ID =",customEventID);
}
ChartRedraw();// принудительно перерисуем все объекты на графике
}
//--- проверим событие на принадлежность к пользовательским событиямif(id>CHARTEVENT_CUSTOM)
{
if(id==broadcastEventID)
{
Print("Получили широковещательное сообщение от графика с id="+lparam);
}
else
{
//--- прочитаем текстовое сообщение в событииstring info=sparam;
Print("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID =",id);
//--- выведем сообщение в меткеObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
ChartRedraw();// принудительно перерисуем все объекты на графике
}
}
}
//+------------------------------------------------------------------+//| послать широковещательное сообщение всем открытм графикам |//+------------------------------------------------------------------+void BroadcastEvent(long lparam,double dparam,string sparam)
{
int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
long currChart=ChartFirst();
int i=0;
while(i<CHARTS_MAX) // у нас наверняка не больше CHARTS_MAX открытых графиков
{
EventChartCustom(currChart,eventID,lparam,dparam,sparam);
currChart=ChartNext(currChart); // на основании предыдущего получим новый графикif(currChart==0) break; // достигли конца списка графиков
i++; // не забудем увеличить счетчик
}
}
//+------------------------------------------------------------------+
我可能会暂时忽略它,但在MQL4中,编译器并没有产生这样的注释
变量可能没有问题。请看我上面的帖子...
就 "用户 "事件和在同一终端上工作的几位专家向开发者提问。
我想知道我是否想把它弄好?
这个想法是这样的
在演出过程中,我们需要向 "邻近的 "专家通报一些正在发生的过程。
...如果它是一个好主意,它可能会被完成并被格式化为一篇文章。或者把它添加到专门针对用户事件的帮助部分?
有一个关于函数EventChartCustom的 例子。
试试吧。
我不知道,如果我们将double转换为int,肯定会有损失,但如果反过来,在归一化过程中很可能会出现错误,因为函数的第二个值是int类型 的。
如果你把int 写成double,一切都会正常处理,编译器只是丢弃小数部分(根据规则)。
然而,在相反的情况下,编译器开始怀疑,并对可能出现的问题发出警告(在它看来是这样)。
由于我们都知道这样一个事实,当你不得不在这种情况下进行创作时,我们 "建议他 "这样做。:)
PS
也许开发者将来会关闭REAL警告,然后像MQL4那样,编译器就不会再对各种琐事大喊大叫了......
就 "用户 "事件和在同一终端上工作的几位专家向开发者提问。
所以我想问,我到底要不要把它弄好?
这里有一个想法。
在播放过程中,我们需要告知 "邻近的 "专家顾问所发生的一些过程。
例如,应首先监测以下过程。
1.专家锁定。
2.卸载专家顾问。
3.终止交易业务。
4.恢复交易业务。
实施
I.创建4个事件的标识符。
1 -CHARTEVENT_CUSTOM+1//启动专家顾问。
2 -CHARTEVENT_CUSTOM+2//卸载专家顾问。
3 - CHARTEVENT_CUSTOM+3 //停止交易操作
4 -CHARTEVENT_CUSTOM+4//重新开始交易业务
II.追踪事件
当某种情况发生时,专家顾问使用 EventChartCustom生成一个SPARTEVENT信息。
同时,专家顾问在 sparam中写下 评论(其名称和事件的类型,或其他信息) ,并lparam 自己的图表标识符。
其他图表上的专家顾问(如果他们能正确识别事件的性质)将响应这个EA。
PS
如果想法很好,可能会完成并形成文章。或者把它添加到专门用于自定义事件的帮助部分?
在EventChartCustom 函数中,有一个例子。
试试吧。
是的,我以前见过这个例子(我甚至不知道是多久以前)。我想问问我的想法是否正确,在实施方面是否有趣。
PS
如果它不适合在帮助中,那么也许有人会同意完善它,并写一篇关于这种事件应用的文章。
如果你把这一切总结起来,在我看来,这将是一篇非常有趣的文章。
不幸的是,我没有时间来处理它......
我不认为同时使用几个EA有什么意义,特别是如果你玩几个符号--你可以用一个EA轻松完成,修改、开仓和平仓也可以用一个EA完成,指标的分析也可以用。
总有一种感觉,特别是由于不是所有的EA都是先验的多货币(基于MQL4的经验)。
这意味着,对于初学者和许多曾经从事机械交易的人来说,正确组织多币种的并不容易...
只有上帝知道,如果有人想在一个账户上执行,比如说2-3份MACD样本,会发生什么。
除了情况不同外,其他专家顾问可能会扮演次要角色,接收来自第一个专家顾问的订单。
另外,当其他EA("邻居")不进行交易,而只是处理数据或做某些工作时,这种变体将被接受。
同样,类似的事情也可以在指数和EA之间的沟通中实现(用某种方法)。
PS
这就是为什么我建议研究这个问题,如果有经验的程序员愿意写一篇文章。如果开发者自己能在这个问题上投入一些时间,我将特别高兴。
我认为有足够的材料来写一篇以上的文章......
............
不幸的是,我没有时间去做......。
我在看vMA和Close[]。在Wotch,它的计数很好。我也试过这样做。
我再次得到另一个错误。也许有另一种方法来计算简单移动平均线。 或者把手柄iMA和 CopyBuffer 放在它应该在的地方?
1.在wotcha中,你应该指定Close数组的名称(你将只看到一般信息)或Close[1], Close[2],..., Close[i]的具体值。
2.你无法看到你的代码是如何填充mrate数组的
3.看看标准库 MovingAverages.mqh--那里会有一个MA计算的例子。
我们理解。太多的时间花在评论每个人和每件事上....。
也有足够的时间进行评论,并实施某些想法。
只是我可能不会认真处理这个问题,以至于无法覆盖整个领域(而且我已经在处理这个想法的一些应用,纯粹是为了自己)。
但无论如何,我可能不会在这个问题上写文章(出于各种原因)......