Erros, bugs, perguntas - página 37

 
kirill190982:
Provavelmente vou ignorá-lo por agora, mas na MQL4 o compilador não produziu tais observações
Isso é toda uma outra questão, havia muitas coisas que não estavam lá... :)
 
Interesting:

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
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Interesting:

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:

//+------------------------------------------------------------------+
//|                                            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                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим кнопку, для передачи пользовательских событий
   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                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete(0,buttonID);
   ObjectDelete(0,labelID);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем buttonID
      if(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++;                     // не забудем увеличить счетчик
     }
  }
//+------------------------------------------------------------------+

Experimente-o.

 
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...

 
Interesting:

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?

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
 
Rosh:

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...

 
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.

 
Interesting:
............

Infelizmente, não tenho tempo para o fazer...

Nós compreendemos. Demasiado tempo gasto a comentar tudo e todos....
 
AM2:

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

 
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)...

Razão: