Mt4 Fine del supporto. - pagina 30

 
Реter Konow:

L'onere è posto sul computer dall'atteggiamento negligente dello sviluppatore verso la coerenza del suo meccanismo. Il desiderio di risparmiare energia per migliorare il sistema. Consumo irragionevole di risorse informatiche in nome della semplificazione del loro lavoro.

Finché il computer riesce a far fronte con successo a un codice scritto in modo inefficiente, lo sviluppatore continuerà a "parassitare" la potenza di elaborazione. Questa è una strada senza uscita.

Prima o poi, il meccanismo inefficiente smetterà di evolversi e sarà sostituito da una controparte migliore.

Il tempo e lo sforzo dell'uomo saranno sprecati e la sua invenzione finirà nella pattumiera.

Nel mondo competitivo, questo rischio esiste sempre.

Progettando i meccanismi, dovremmo pensare al loro rendimento in primo luogo, e al comfort e alla comodità di passare le nostre ore di lavoro in secondo luogo).

Non hai ancora scritto una funzione per definire una nuova barra in stile procedurale.

Forum sul trading, sistemi di trading automatico e strategie di trading di prova

Mt4 Fine del supporto.

Artyom Trishkin, 2017.09.10 23:21

Avevo un obiettivo per il risultato finale del suo codice in stile procedurale per lavorare in un tale ciclo:

   ENUM_TIMEFRAMES array_timeframes[]=
      {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
      };
   int total=SymbolsTotal(true), total_tf=ArraySize(array_timeframes);
   for(int i=0; i<total; i++){
      string symbol_name=SymbolName(i,true);
      for(int j=0; j<total_tf; j++){
         if(IsNewBar(symbol_name,array_timeframes[j])){
            Print("Новый бар на ",symbol_name," ",EnumToString(array_timeframes[j]));
            }
         }
      }

 
Реter Konow:

Sì, ne abbiamo discusso ieri.

Trattavo con un'altra piattaforma e lì le barre si formavano in base al tempo, indipendentemente dalle quotazioni in arrivo (guarda in TWS).

Mi è stato detto che non è il caso su MT.

Aggiungerò un controllo dell'arrivo del preventivo per confermare un nuovo evento dell'evento del bar.

Lo sto guardando da un po' di tempo. Piattaforma interessante, ma da quanto ho capito non è gratuita, e se non sei sicuro di fare soldi, è un peccato pagare per usare il giocattolo...

 

A quanto pare il mio esperimento di cercare di spiegare il punto di vista degli autodidatti è fallito...

 
Vladimir:

C'è, in linea di principio, un esempio di questo? Anche se non il tuo? Ho profondi dubbi. Nei primi anni 2000 ho smesso di contare il numero di linee di codice debuggate e funzionanti che ho scritto perché superava il milione, è diventato poco interessante.

Un esempio elementare sarebbe quello di aggiungere un'altra serie n di ingressi all'EA, con diversi parametri di ingresso.
E, naturalmente, mantenendo queste n-posizioni, con parametri separati, fino alla chiusura.

...E molto probabilmente (usando oop) linee di codice, ne avresti meno. Anche se, ci sono abili a gonfiare il codice oop)

 
Aleksey Altukhov:

Non so se qualcuno lo ha suggerito, ma perché non spostare tutto in MT4 a MT5, allora tutti si sposterebbero.


E chi trasferirebbe questa montagna di EA, indicatori e script accumulati?

 

Credo di aver trovato un esempio primitivo dell'usabilità dell'OOP. Ecco una funzione per riempire un array con un valore specificato. Ci sono otto varietà, a seconda del tipo di matrice.

Immaginate di dover scrivere una funzione che ha bisogno di passare un set di parametri, poi un altro, poi un terzo... Usando l'approccio algoritmico si ottengono N nomi di funzioni diverse. Sembrerebbe che non ci sia niente di sbagliato, potete scrivere 8 funzioni come ArrayInitializeInt()ArrayInitializeDouble() e così via. Ma è bello non pensare al tipo di array, basta usare una sola funzione in ogni caso, e quanto sia sicuro confondere quale array ci metti...

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Sviluppato una nuova soluzione per la nuova funzione bar. È più semplice e conciso. Ha implementato la possibilità di ricevere la notifica del nuovo evento della barra su uno qualsiasi dei simboli disponibili nella panoramica del mercato e su uno qualsiasi dei timeframe preimpostati.

Se vedi degli errori, per favore commenta.

//+------------------------------------------------------------------+
//|                                                  Новый бар 2.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
datetime Время_последнего_бара;

int      Частота_таймера        = 25;
int      Всех_символов;
int      Таймфреймы[7]          = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1};
int      Всех_таймфреймов       = 7;
int      Количество_баров[][7];
bool     События_нового_бара[][7];

string   Символы[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(25);
   //-------------------------------------------------------------
   //Записываем время последнего бара на момент загрузки эксперта.  
   //Для корректного начала работы, робота нужно запустить на М1. 
   //-------------------------------------------------------------
   Время_последнего_бара = Time[0];
   //-------------------------------------------------------------   
   //Узнаем сколько символов есть в обзоре рынка.
   //---------------------------------------------------------
   Всех_символов = SymbolsTotal(true);
   //---------------------------------------------------------   
   //Устанавливаем размер массива Символы. Внутри него будут записаны
   //имена всех символов, которые есть в окне обзоре рынка.
   //---------------------------------------------------------
   ArrayResize(Символы,Всех_символов);
   //---------------------------------------------------------
   //Устанавливаем размеры массивов "Количество_баров[]" и "События_нового_бара[]".
   //В массиве "Количество_баров[]" будет записыватся текущее количество баров каждого символа
   //и каждого таймфрейма. А в массиве "События_нового_бара[]" устанавливаться флаги
   //события нового бара для каждого символа и каждого таймфрейма. 
   //---------------------------------------------------------
   ArrayResize(Количество_баров,Всех_символов);
   ArrayResize(События_нового_бара,Всех_символов);
   //---------------------------------------------------------
   //Записываем наименования символов обзора рынка в массив "Символы[]".
   //---------------------------------------------------------
   for(int a1 = 0; a1 < Всех_символов; a1++)
     {
      Символы[a1] = SymbolName(a1 + 1,true); 
      //Возможно, нумерация символов в обзора рынка идет с нуля.
      //Тогда: Символы[a1] = SymbolName(a1,true);
     }
   //---------------------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
 static bool Начало_отсчета;
 static int  Минута;
 //---------------------------
 //Нам нужен корректный старт отсчета. Это должно быть время начала бара.
 //---------------------------
 if(!Начало_отсчета && Time[0] != Время_последнего_бара)Начало_отсчета = true; 
 //--------------------------- 
 if(Начало_отсчета)Минута++;
 //--------------------------- 
 //В следующем цикле, мы будем обращатся к функции iBars (раз в минуту) для получения количества баров на 
 //каждом из символов и таймфреймов, которые будем проходить в цикле.
 //Далее, будем сравнивать записанное количество баров с текущим и при 
 //наличии разницы установим флаг события нового бара в массив "События_нового_бара[]".
 //---------------------------
 if(Минута*Частота_таймера >= 60000)
   {
    for(int a1 = 0; a1 < Всех_символов; a1++)
      {
       string Этот_символ = Символы[a1];
       //---------------------------------
       for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
         {
          int Этот_таймфрейм = Таймфреймы[a2];
          //------------------------------------------
          int Текущее_количество_баров = iBars(Этот_символ,Этот_таймфрейм);
          //------------------------------------------
          if(Текущее_количество_баров > Количество_баров[a1][a2])
            {
             //------------------------------------------------------------
             //Если это не самая первая запись в массив Количества баров,
             //то фиксируем событие нового бара.
             //------------------------------------------------------------
             if(Количество_баров[a1][a2])События_нового_бара[a1][a2]  = true;
             //------------------------------------------------------------
             //Устанавливаем новое значение текущего количества баров.
             //------------------------------------------------------------
             Количество_баров   [a1][a2]  = Текущее_количество_баров;
            }
          //------------------------------------------
         }
      }
    //---------
    Минута = 0;
   }
 //-----------------------------------------------
    
}
//+------------------------------------------------------------------+






//---------------------------------------------------------------------
//Функция Новый_бар() принимает наименование символа и таймфрейм.
//Она делает цикл по массиву символов, находит совпадение наименований и 
//с запрашиваемым символом, и далее ищет нужный таймфрейм для получения
//индекса ячейки массива в которой он находится. 
//Найдя индекс ячейки имени нужного символа и индекс ячейки нужного
//таймфрейма, функция обращается к массиву "События_нового_бара" и 
//возвращает факт события нового бара или его отсутствие.
//После возврата флага события, функция снимает этот флаг.
//Следовательно, флаг события можно получить только один раз за бар.
//---------------------------------------------------------------------
bool Новый_бар(string Символ, int Таймфрейм)
{
 bool Новый_бар;
 //-----------------------
 for(int a1 = 0; a1 < Всех_символов; a1++)
   {
    if(Символы[a1] == Символ)
      {
       for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
         {
          if(Таймфреймы[a2] == Таймфрейм)
            {
             Новый_бар  = События_нового_бара[a1][a2];
             if(Новый_бар)События_нового_бара[a1][a2] = 0;
             return(Новый_бар);
            }
         }
      }
   }
 //-----------------------
 return(false);
}
//+------------------------------------------------------------------+
 
Реter Konow:

Sviluppato una nuova soluzione per la nuova funzione bar. È più semplice e conciso. Ha implementato la possibilità di ricevere la notifica del nuovo evento della barra su uno qualsiasi dei simboli disponibili nella panoramica del mercato e su uno qualsiasi dei timeframe preimpostati.

Se vedi degli errori, per favore commenta.


4 cicli non è cool? a 600 simboli nella panoramica del mercato ogni minuto il terminale morirà ....

 
Реter Konow:

Sviluppato una nuova soluzione per la nuova funzione bar. È più semplice e conciso. Ha la possibilità di ricevere la notifica del nuovo evento della barra su uno qualsiasi dei simboli che sono disponibili nella panoramica del mercato e su uno qualsiasi dei timeframe preimpostati.

Se vedi degli errori, per favore commenta.

Non mi aspetto che questa funzione salti in OnTimer() e ho già commentato la mia idea

Forum sul trading, sistemi di trading automatico e test di strategia

Mt4 End Support.

Alexey Viktorov, 2017.09.11 10:09

A quanto pare il mio esperimento di cercare di spiegare un punto di vista da autodidatta è fallito...


 
Реter Konow:

Sviluppato una nuova soluzione per la nuova funzione bar. È più semplice e conciso. Ha la possibilità di ricevere la notifica del nuovo evento della barra su uno qualsiasi dei simboli che sono disponibili nella panoramica del mercato e su uno qualsiasi dei timeframe preimpostati.

Se vedi degli errori, per favore commenta.

Per quanto riguarda i commenti sul codice: E se avete bisogno di definire l'apertura del periodo corrente e solo un simbolo nel programma? L'intera struttura farà tutti i loop? Non è razionale.

ps; E perché dovrei avviare un timer di millisecondi? Non è sufficiente un secondo timer?