As variáveis são provavelmente OK. Por favor, veja o meu post acima...
Não sei, se se converter o dobro para int, haverá definitivamente uma perda, e se vice-versa, muito provavelmente haverá um erro durante a normalização, uma vez que o segundo valor da função é do tipo int
//+------------------------------------------------------------------+//| 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++; // не забудем увеличить счетчик
}
}
//+------------------------------------------------------------------+
kirill190982: Não sei, se convertermos o dobro para int haverá definitivamente uma perda, mas se vice-versa, muito provavelmente haverá um erro durante a normalização, porque o segundo valor da função do tipo int
Se escrever int para duplicar, tudo é tratado normalmente, o compilador apenas descarta a parte fracionária (de acordo com a regra).
Na situação inversa, no entanto, o compilador começa a duvidar, e dá um aviso sobre possíveis problemas (como lhe parece).
E uma vez que todos sabemos que quando se tem de CRIAR em tal situação, "aconselhamo-lo" a fazê-lo. :)
PS
Talvez os programadores desliguem avisos REAIS no futuro, e então, como na MQL4, o compilador deixará de gritar sobre todo o tipo de trivialidades...
Quando uma determinada situação acontece, o Expert Advisor gera uma mensagem WIDE utilizando EventChartCustom.
Ao mesmo tempo,o consultor especializado escreve em sparam um comentário (o seu nome e tipo do evento, ou outra informação) , elparam o seu próprio identificador gráfico.
Os Conselheiros Peritos noutros gráficos (se conseguirem identificar correctamente a natureza de um evento) responderão a esta EA específica.
PS
Se a ideia for boa, pode ser elaborada e disposta como um artigo. Ou adicioná-lo à secção de ajuda dedicada a eventos personalizados?
E não vejo a utilidade de utilizar várias EA de uma só vez, especialmente se jogar várias ferramentas - pode facilmente fazer com uma EA, a modificação, a abertura e o fecho também podem ser feitos por uma EA, a análise de indicadores também
Sim, eu já vi este exemplo antes (nem sei há quanto tempo). Gostaria de perguntar se a minha ideia é correcta e interessante em termos de implementação.
PS
Se não se enquadrar na ajuda, então talvez alguém concorde em refiná-la e escrever um artigo sobre esta aplicação de eventos.
Também seria interessante utilizar eventos personalizados sob a forma de encomendas de uma EA para outra (ou outras). se resumir tudo isto, na minha opinião, resultaria num artigo muito interessante.
Infelizmente, não tenho tempo para lidar com isso...
kirill190982: E não vejo a utilidade de utilizar vários EA de uma só vez, especialmente se tocar vários símbolos - pode facilmente fazer-se com um EA, a modificação, a abertura e o fecho também podem ser feitos por um EA, a análise de indicadores, também
Há sempre um sentido, especialmente porque nem todos os EAs são, a priori, multimoedas (com base na experiência em MQL4).
Por isso, não é fácil para os principiantes e muitos dos que se dedicavam ao comércio mecânico organizar adequadamente os de múltiplas divisas...
Só Deus sabe o que vai acontecer se alguém quiser executar, digamos, 2-3 cópias da amostra MACD numa só conta.
Além das situações serem diferentes, outros Conselheiros Especialistas podem desempenhar um papel secundário recebendo ordens do primeiro.
Além disso, esta variante será aceitável quando outros EAs ("vizinhos") não negoceiam, mas apenas processam dados ou fazem determinado trabalho.
Também coisas semelhantes podem ser implementadas na comunicação entre índices e EAs (com uma certa abordagem).
PS
Foi por isso que sugeri trabalhar sobre esta questão e se algum progamador experiente estaria disposto a escrever um artigo. Ficaria especialmente satisfeito se os próprios criadores dedicassem algum do seu tempo a esta questão.
Acho que há material suficiente para mais do que um artigo.
joo: Nós compreendemos. Demasiado tempo é gasto a comentar tudo e todos....
Há tempo suficiente para comentar também, e para implementar certas ideias.
É que provavelmente não vou abordar o assunto com seriedade suficiente para cobrir todo o campo (e já estou a tratar de algumas das aplicações da ideia, puramente para mim).
Mas em todo o caso, provavelmente não vou escrever artigos sobre este assunto (por várias razões)...
Provavelmente vou ignorá-lo por agora, mas na MQL4 o compilador não produziu tais observações
As variáveis são provavelmente OK. Por favor, veja o meu post acima...
Pergunta aos programadores sobre eventos "utilizadores" e vários peritos que trabalham no mesmo terminal.
Quero saber se quero fazer as coisas bem ou não?
A ideia é a seguinte
No decurso da peça, precisamos de informar os peritos "vizinhos" sobre alguns dos processos em curso.
...Se for uma boa ideia, pode ser terminado e formatado como um artigo. Ou adicioná-lo à secção de Ajuda dedicada aos eventos dos utilizadores?
Há um exemplo para a função EventChartCustom:
Experimente-o.
Não sei, se convertermos o dobro para int haverá definitivamente uma perda, mas se vice-versa, muito provavelmente haverá um erro durante a normalização, porque o segundo valor da função do tipo int
Se escrever int para duplicar, tudo é tratado normalmente, o compilador apenas descarta a parte fracionária (de acordo com a regra).
Na situação inversa, no entanto, o compilador começa a duvidar, e dá um aviso sobre possíveis problemas (como lhe parece).
E uma vez que todos sabemos que quando se tem de CRIAR em tal situação, "aconselhamo-lo" a fazê-lo. :)
PS
Talvez os programadores desliguem avisos REAIS no futuro, e então, como na MQL4, o compilador deixará de gritar sobre todo o tipo de trivialidades...
Pergunta aos programadores sobre eventos "utilizadores" e vários peritos que trabalham no mesmo terminal.
Então quero perguntar se quero ou não fazer as coisas bem?
Aqui fica uma ideia.
No decurso da peça, precisamos de informar os Conselheiros Peritos "vizinhos" sobre alguns processos que têm lugar.
Por exemplo, os seguintes processos devem ser monitorizados em primeiro lugar:
1. Bloqueio por peritos;
2. Descarga do Conselheiro Especialista;
3. Cessação das operações comerciais;
4. Retomar as operações comerciais.
Implementar
I. Criar 4 identificadores de eventos:
1 - CHARTEVENT_CUSTOM+1//Starting the Expert Advisor
2 - CHARTEVENT_CUSTOM+2//Unloading do Conselheiro Especialista
3 - CHARTEVENT_CUSTOM+3 //Stop trading operations
4 - CHARTEVENT_CUSTOM+4//Restarting de operações comerciais
II. Seguimento de eventos
Quando uma determinada situação acontece, o Expert Advisor gera uma mensagem WIDE utilizando EventChartCustom.
Ao mesmo tempo,o consultor especializado escreve em sparam um comentário (o seu nome e tipo do evento, ou outra informação) , elparam o seu próprio identificador gráfico.
Os Conselheiros Peritos noutros gráficos (se conseguirem identificar correctamente a natureza de um evento) responderão a esta EA específica.
PS
Se a ideia for boa, pode ser elaborada e disposta como um artigo. Ou adicioná-lo à secção de ajuda dedicada a eventos personalizados?
Há um exemplo para a função EventChartCustom:
Experimente-o.
Sim, eu já vi este exemplo antes (nem sei há quanto tempo). Gostaria de perguntar se a minha ideia é correcta e interessante em termos de implementação.
PS
Se não se enquadrar na ajuda, então talvez alguém concorde em refiná-la e escrever um artigo sobre esta aplicação de eventos.
Também seria interessante utilizar eventos personalizados sob a forma de encomendas de uma EA para outra (ou outras). se resumir tudo isto, na minha opinião, resultaria num artigo muito interessante.
Infelizmente, não tenho tempo para lidar com isso...
E não vejo a utilidade de utilizar vários EA de uma só vez, especialmente se tocar vários símbolos - pode facilmente fazer-se com um EA, a modificação, a abertura e o fecho também podem ser feitos por um EA, a análise de indicadores, também
Há sempre um sentido, especialmente porque nem todos os EAs são, a priori, multimoedas (com base na experiência em MQL4).
Por isso, não é fácil para os principiantes e muitos dos que se dedicavam ao comércio mecânico organizar adequadamente os de múltiplas divisas...
Só Deus sabe o que vai acontecer se alguém quiser executar, digamos, 2-3 cópias da amostra MACD numa só conta.
Além das situações serem diferentes, outros Conselheiros Especialistas podem desempenhar um papel secundário recebendo ordens do primeiro.
Além disso, esta variante será aceitável quando outros EAs ("vizinhos") não negoceiam, mas apenas processam dados ou fazem determinado trabalho.
Também coisas semelhantes podem ser implementadas na comunicação entre índices e EAs (com uma certa abordagem).
PS
Foi por isso que sugeri trabalhar sobre esta questão e se algum progamador experiente estaria disposto a escrever um artigo. Ficaria especialmente satisfeito se os próprios criadores dedicassem algum do seu tempo a esta questão.
Acho que há material suficiente para mais do que um artigo.
............
Infelizmente, não tenho tempo para o fazer...
Estou a olhar para vMA e Close[]. Em wotch, está a contar bem. Também o experimentei assim:
Mais uma vez, recebo outro erro. Talvez haja outra forma de calcular a média móvel simples. Ou levar o cabo iMA e CopyBuffer para onde ele deve estar?
1. No wotcha, deve especificar ou o nome de Close array (verá apenas informações gerais) ou um valor específico de Close[1], Close[2],..., Close[i].
2. Não se pode ver como o seu código preenche a matriz de taxas
3. Veja a biblioteca padrão MovingAverages.mqh - haverá um exemplo de cálculo de MA
Nós compreendemos. Demasiado tempo é gasto a comentar tudo e todos....
Há tempo suficiente para comentar também, e para implementar certas ideias.
É que provavelmente não vou abordar o assunto com seriedade suficiente para cobrir todo o campo (e já estou a tratar de algumas das aplicações da ideia, puramente para mim).
Mas em todo o caso, provavelmente não vou escrever artigos sobre este assunto (por várias razões)...