Errori, bug, domande - pagina 37

 
kirill190982:
Probabilmente lo ignorerò per ora, ma in MQL4 il compilatore non produceva tali osservazioni
Questa è tutta un'altra questione, c'erano un sacco di cose che non c'erano... :)
 
Interesting:

Le variabili sono probabilmente a posto. Si prega di vedere il mio post sopra...

Non so, se si converte il doppio in int, ci sarà sicuramente una perdita, e se viceversa, molto probabilmente ci sarà un errore durante la normalizzazione, poiché il secondo valore della funzione è di tipo int
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Interesting:

Domanda agli sviluppatori riguardo agli eventi "utente" e a diversi esperti che lavorano sullo stesso terminale.

Voglio sapere se voglio fare bene o no?


L'idea è questa

Nel corso del gioco dobbiamo informare gli esperti "vicini" su alcuni dei processi che avvengono.

...

Se è una buona idea, può essere finita e formattata come un articolo. O aggiungerlo alla sezione Aiuto dedicata agli eventi utente?

C'è un esempio per la funzione 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++;                     // не забудем увеличить счетчик
     }
  }
//+------------------------------------------------------------------+

Provalo.

 
kirill190982:
Non so, se convertiamo double in int ci sarà sicuramente una perdita, ma se viceversa, molto probabilmente ci sarà un errore durante la normalizzazione, perché il secondo valore della funzione di tipo int

Se si scrive int a double, tutto viene gestito normalmente, il compilatore scarta solo la parte frazionaria (secondo la regola).

Nella situazione inversa, però, il compilatore inizia a dubitare, e dà un avvertimento su possibili problemi (come gli sembra).

E siccome tutti sappiamo del fatto, che quando è necessario CREARE in una situazione simile, gli "consigliamo" di farlo. :)

PS

Forse in futuro gli sviluppatori spegneranno QUALSIASI avvertimento, e allora, come in MQL4, il compilatore smetterà di urlare per cose banali...

 
Interesting:

Domanda agli sviluppatori riguardo agli eventi "utente" e a diversi esperti che lavorano sullo stesso terminale.

Quindi voglio chiedere se voglio fare la cosa giusta o no?


Ecco un'idea.

Nel corso del gioco abbiamo bisogno di informare i Consulenti Esperti "vicini" su alcuni processi che avvengono.

Per esempio, i seguenti processi dovrebbero essere monitorati per primi:

1. Chiusura esperta;

2. Scarico dell'Expert Advisor;

3. Cessazione delle operazioni di trading;

4. Riprendere le operazioni di trading.


Implementare

I. Crea 4 identificatori di eventi:

1 - CHARTEVENT_CUSTOM+1//Avviare l'Expert Advisor

2 - CHARTEVENT_CUSTOM+2//scarico dell'Expert Advisor

3 - CHARTEVENT_CUSTOM+3 //Stop delle operazioni di trading

4 - CHARTEVENT_CUSTOM+4//Riavvio delle operazioni commerciali


II. Monitoraggio degli eventi

Quando succede una certa situazione, l'Expert Advisor genera un messaggio SPARTEVENT usando EventChartCustom.

Nelfare ciò, l'Expert Advisor scrive in sparam un commento (il nome e il tipo dell'evento, o altre informazioni) , elparam il proprio identificatore grafico.

Gli Expert Advisors su altri grafici (se possono identificare correttamente la natura di un evento) risponderanno a questo specifico EA.


PS

Se l'idea è buona, può essere finita e formata come articolo. O aggiungerlo alla sezione di aiuto dedicata agli eventi personalizzati?

E non vedo il senso di usare diversi EA contemporaneamente, soprattutto se si gioca con diversi strumenti - si può facilmente fare con un solo EA, la modifica, l'apertura e la chiusura può essere fatta anche da un solo EA, l'analisi degli indicatori anche
 
Rosh:

C'è un esempio della funzione EventChartCustom:

Provalo.

Sì, ho già visto questo esempio (non so nemmeno quanto tempo fa). Volevo chiedere se la mia idea è corretta e interessante in termini di implementazione.

PS

Se non si adatta all'aiuto, allora forse qualcuno accetterà di perfezionarlo e di scrivere un articolo su questa applicazione degli eventi.

Sarebbe anche interessante utilizzare eventi personalizzati sotto forma di ordini da un EA a un altro (o altri). se si riassume il tutto, risulterebbe a mio parere un articolo molto interessante.

Sfortunatamente, non ho tempo di occuparmene...

 
kirill190982:
E non vedo il senso di usare diversi EA contemporaneamente, soprattutto se si giocano diversi simboli - si può facilmente fare con un solo EA, la modifica, l'apertura e la chiusura può essere fatta anche da un solo EA, l'analisi degli indicatori, anche

C'è sempre un senso, soprattutto perché non tutti gli EA sono multivaluta a priori (sulla base dell'esperienza in MQL4).

Ciò significa che non è facile per i principianti e per molti di coloro che erano impegnati nel trading meccanico organizzare correttamente gli Expert Advisors multivaluta.


Dio solo sa cosa succederà se qualcuno vuole eseguire, diciamo, 2-3 copie di MACD Sample su un conto.


Inoltre le situazioni sono diverse, altri Expert Advisors possono giocare un ruolo secondario ricevendo ordini dal primo.

Inoltre, questa variante sarà accettabile quando altri EA ("vicini") non fanno trading, ma elaborano solo dati o fanno un certo lavoro.

Anche cose simili possono essere implementate nella comunicazione tra indici e EAs (con un certo approccio).

PS

Ecco perché ho suggerito di lavorare su questa domanda e se qualche progamer esperto sarebbe disposto a scrivere un articolo. Sarei particolarmente felice se gli stessi sviluppatori dedicassero un po' del loro tempo a questo problema.

Penso che ci sia abbastanza materiale per più di un articolo...

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

Purtroppo non ho il tempo di farlo...

Noi capiamo. Troppo tempo speso a commentare tutti e tutto....
 
AM2:

Sto guardando vMA e Close[]. In wotch, sta contando bene. Ho anche provato così:

Di nuovo ottengo un altro errore. Forse c'è un altro modo per calcolare la media mobile semplice. O prendere l'handle iMA e CopyBuffer dove dovrebbe essere?

1. Nel wotcha, dovreste specificare o il nome dell'array Close (vedrete solo informazioni generali) o un valore specifico di Close[1], Close[2],..., Close[i].

2. Non puoi vedere come il tuo codice riempie l'array mrate

3. Guardate la libreria standard MovingAverages.mqh - ci sarà un esempio di calcolo MA

 
joo:
Noi capiamo. Si passa troppo tempo a commentare tutti e tutto....


C'è abbastanza tempo anche per commentare e per attuare certe idee.

È solo che probabilmente non affronterò la questione abbastanza seriamente da coprire l'intero campo (e mi sto già occupando di alcune applicazioni dell'idea, puramente per me stesso).

Ma in ogni caso probabilmente non scriverò articoli su questo argomento (per varie ragioni)...