Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 186

 
per favore, consigliatemi il miglior indicatore di segnale su questo sito... purché sia gratuito, naturalmente!
 
barabashkakvn:
E "un bel po' di calcoli basati sulla storia" si aggiungono a una matrice dinamica?

Esiste una cosa del genere, sì :) Beh, più precisamente, vengono utilizzati diversi array dinamici, ma non si suppone che crescano fino a dimensioni troppo grandi.

E riguardo alla divisione a metà - non sembra fare molta differenza quale segmento prendere e quanti ingressi ha. In media un giorno è gestito in 2500-3500 ms, ma una settimana deve aspettare qualche minuto. Non ho un registro adatto a portata di mano al momento, non posso essere sicuro di quanto. Ma un ordine di grandezza più di 5x al giorno, e la maggior parte del tempo è speso nell'ultimo giorno o due. Un mese, d'altra parte, può essere lasciato durante la notte e al mattino sarà probabilmente ancora appeso.

 
Lone_Irbis:


E riguardo alla divisione a metà - non sembra fare molta differenza quale sezione prendere e quanti ingressi ha.

Includere un test in avanti con un rapporto 1 / 2. Dividerà automaticamente la storia in periodi. Inoltre, scoprirete anche se ne vale la pena.
 
Lone_Irbis:
Mi chiedo se c'è un articolo da qualche parte come "le ragioni più comuni per la lentezza di EA"? Sto cercando di capire perché l'Expert Advisor nello Strategy Tester vola all'inizio ma poi rallenta. Non è allo stadio di sviluppo per essere così critico (la velocità è sufficiente per lo sviluppo di meccanismi e strumenti di base). Ma è comunque scomodo che i segmenti più lunghi di una settimana non abbiano senso, perché dopo la velocità tende già a zero.

Provate a mettere un barile di vernice sulle sue ruote e a farlo scorrere dietro di voi secondo necessità.

https://www.mql5.com/ru/forum/14041/page3#comment_605412

Линейное торможение - ошибка программиста или особенность работы MT4?
Линейное торможение - ошибка программиста или особенность работы MT4?
  • www.mql5.com
Такая работа просто убивает возможность оперативной настройки советника.
 
MetaDriver:

Provate a mettere il barile di vernice sulle sue ruote e a farlo scorrere dietro di voi secondo necessità.

https://www.mql5.com/ru/forum/14041/page3#comment_605412

È una parabola interessante :) Grazie per il suggerimento. Non resta che trovare quel particolare barile... O piuttosto dei barili. Tuttavia, ho già un vago sospetto sui gestori di notizie e livelli di resistenza...
 
Lone_Irbis:
È una parabola divertente :) Grazie per il suggerimento. Non resta che trovare il barile... O piuttosto dei barili. Tuttavia, ho già un vago sospetto sui gestori di notizie e livelli di resistenza...
Il più delle volte un tale barile è "l'inizio dei tempi" - l'Expert Advisor cerca di rianalizzare la propria storia di trading (o qualche altra informazione accumulata) ad ogni barra (tick).
 
Recentemente si è rifocalizzato sulla creazione di pannelli, quindi la mia domanda è. Sto creando due etichette OBJ_RECTANGLE_LABEL e OBJ_LABEL e non so come trascinare OBJ_RECTANGLE_LABEL sul grafico in modo che OBJ_LABEL sia trascinato esattamente come uno. Forse c'è qualche meccanismo che li collega l'uno all'altro e un'azione su uno causerà lo stesso sull'altro (tutti gli altri)?
 
MetaDriver:
Il più delle volte tale barile è "l'inizio dei tempi" - la propria storia di trading (o qualche altra informazione accumulata) che un Expert Advisor cerca di rianalizzare ad ogni barra (tick).

О! Sorprendentemente, il problema è stato trovato e risolto in pochi minuti. In effetti, il problema era nella storia del trading, che andava oltre ogni tick. La funzione che ho ereditato dal codice a la "the simplest Expert Advisor for mql5" che è stato utilizzato all'inizio. Da allora, in qualche modo, mi è sfuggito di mente. Sembra funzionare, quindi penso - perché preoccuparsi di questo... Ovviamente, farei meglio a cercare tra i resti di quel codice :) Nel caso in cui qualcuno abbia cercato qui su Google con ritardi simili, posterò il frammento problematico e il mio lavoro creativo sull'argomento nel tentativo di risolvere questo problema. Non so quanto la mia versione sia più "corretta" rispetto alla fonte. Molto probabilmente è esattamente lo stesso codice di merda di tutto il resto che scrivo. [A me, ovviamente, non interessa. Voglio dire, se qualcuno penserà di usare il pezzo inferiore: tenete conto che l'autore è un shitcoder autodidatta. ^^] Ma almeno nulla sembra essere rotto e il robot sta volando come un jet :) Beh, rispetto a quello che era, almeno. La prova di due mesi è passata in circa un minuto, che è ancora un bel contrasto con le 6+ ore originali %)

Era:

// Эта функция вызывалась дважды за каждый тик. С ее помощью записывались две глобальные переменные: 
// с ценой последнего ордера и числом открытых ордеров (да, взятый за исходник код был примером самого простейшего мартина). 
double History(bool LastPrice = false){
   long Ticket, OldTicket = 0, PosID, Magic, Dir;
   double PriceOpen = 0, Count = 0;
   ENUM_DEAL_TYPE CheckDir;
   if(Sell) CheckDir = DEAL_TYPE_SELL; 
   else if(Buy) CheckDir = DEAL_TYPE_BUY;
   
   HistorySelect(0, Now);
   int HistoryTotal = HistoryDealsTotal();
   // Проблемное место было тут: в цикле перебиралась вся история торговли, что в начале немного. 
   // Но даже за сутки счетчик доходил до сотни (не рискну предположить, сколько там набиралось за месяц). 
   // И этот бессмысленный и беспощадный процесс повторялся на каждом тике вообще без всякой на то причины.
   for (int i=0; i < HistoryTotal; i++){ 
      Ticket = (int)HistoryDealGetTicket(i);
      PosID  = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
      Magic  = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
      Dir    = HistoryDealGetInteger(Ticket, DEAL_TYPE);
      
      if(LastPrice) { // Этой частью добывалась цена
         if(PosID == PositionID && Magic == MagicNumber && Dir == CheckDir) {
            if(Ticket > OldTicket) {
               PriceOpen = HistoryDealGetDouble(Ticket, DEAL_PRICE);
               OldTicket = Ticket;
            }
         }
      }
      
      else { // А тут оно считало ордера
         if(PosID == PositionID && Magic == MagicNumber) Count++;
      }                              
   }
   
   if(LastPrice) return(PriceOpen);
   else return(Count);
}

Diventato:

// Вызывается она теперь только в конце функций создания/изменения/закрытия позиций. Если открытых нет - глобальные переменные просто обнуляются.
// Хотя в принципе, если вызывать ее не каждый тик, а только на изменениях, вероятно и старая версия не тормозила бы так уж сильно
void History(){
   long Ticket, PosID, Magic, Dir;
   bool GotPrice = false;
   Total = 0;
   HistorySelect(0, Now);
   int HistoryTotal = HistoryDealsTotal();
   
   // Похоже, что быстрее будет считать с обратного конца
   for(int i=HistoryTotal;i>=0;i--){
      Ticket = (int)HistoryDealGetTicket(i);
      PosID  = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
      Magic  = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
      Dir    = HistoryDealGetInteger(Ticket, DEAL_TYPE);
      
      if(PosID == PositionID && Magic == MagicNumber) {
         // Корявую конструкцию заменяем на... другую корявую конструкцию... но она хотя бы компактнее :)
         Total++; 
         if(!GotPrice){
            LastOrderPrice = HistoryDealGetDouble(Ticket, DEAL_PRICE);
            GotPrice = true; // Раз уж нужная цена всегда в начале списка, на ней и остановимся
         }
      }
      // Чтобы не перепахивать всю торговую историю, если номер позиции уже меньше нашего (но больше ноля) - прерываем цикл
      else if(PosID > 0 && PosID < PositionID) break; 
   }
}

Comunque, grazie per l'aiuto :) Senza il suggerimento, probabilmente non mi sarebbe venuto in mente di guardare in quegli angoli lontani e polverosi del codice per molto tempo ancora...

 
Lone_Irbis:

О! Sorprendentemente, il problema è stato trovato e risolto in pochi minuti. In effetti, il problema era nella storia del trading, che andava oltre ogni tick. La funzione che ho ereditato dal codice a la "the simplest Expert Advisor for mql5" che è stato utilizzato all'inizio. Da allora, in qualche modo, mi è sfuggito di mente. Sembra funzionare, quindi penso - perché preoccuparsi di questo... Ovviamente, farei meglio a cercare tra i resti di quel codice :) Nel caso in cui qualcuno abbia cercato qui su Google con ritardi simili, posterò il frammento problematico e il mio lavoro creativo sull'argomento nel tentativo di risolvere questo problema. Non so quanto la mia versione sia più "corretta" rispetto alla fonte. Molto probabilmente è esattamente lo stesso codice di merda di tutto il resto che scrivo. [A me, ovviamente, non interessa. Voglio dire, se qualcuno penserà di usare il pezzo inferiore: tenete conto che l'autore è un shitcoder autodidatta. ^^] Ma almeno nulla sembra essere rotto e il robot sta volando come un jet :) Beh, rispetto a quello che era, almeno. La prova di due mesi è passata in circa un minuto, che è ancora un bel contrasto con le 6+ ore originali %)

Era:

Diventato:

Comunque, grazie per l'aiuto :) Senza il suggerimento, probabilmente non mi sarebbe venuto in mente di guardare in quegli angoli lontani e polverosi del codice per molto tempo ancora...

Ok.
 
paladin800:
Recentemente si è rifocalizzato sulla creazione di pannelli, quindi la mia domanda è. Sto creando due etichette OBJ_RECTANGLE_LABEL e OBJ_LABEL e non so come trascinare OBJ_RECTANGLE_LABEL sul grafico in modo che OBJ_LABEL sia trascinato esattamente come uno. Forse c'è un meccanismo per legarli l'uno all'altro e un'azione su uno causerà la stessa azione sull'altro (tutti gli altri)?

Non esiste un meccanismo del genere, dovrai crearne uno da solo, per fortuna non è così difficile. Ma ci vorrà del lavoro.

Buona fortuna.