Librerie: Esperto - pagina 2

 
fxsaber:

Oh, quegli hacker russi.... Beh, perché fermare tutti gli esperti quando si è un po' fregati?

A proposito, avete anche un bug. La statica non funziona.

 
Алексей Тарабанов:

A proposito, avete anche un bug. La statica non funziona.

Non ho visto un errore qui

Forum sul trading, sui sistemi di trading automatizzati e sulla verifica delle strategie di trading.

Domande dei principianti MQL5 MT5 MetaTrader 5

fxsaber, 2018.08.02 17:09

// Arresta tutti gli Expert Advisor se viene attivato lo SL.

#include <MT4Orders.mqh>      // https://www.mql5.com/it/code/16006
#include <fxsaber\Expert.mqh> // https://www.mql5.com/it/code/19003

void OnTrade()
{
  static int PrevTotal = OrdersHistoryTotal();
  const int Total = OrdersHistoryTotal();
  
  for (int i = Total - 1; i >= PrevTotal; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == DEAL_REASON_SL))
    {
      long Chart = ChartFirst();
  
      while (Chart != -1)
      {
        if ((Chart != ChartID()) && EXPERT::Is(Chart))
          EXPERT::Remove(Chart);
  
        Chart = ChartNext(Chart);
      }

      break;
    }        
    
  PrevTotal = Total;
}
 
// L'indicatore interrompe tutti i tentativi di trading tramite Expert Advisor. Permette solo di operare con le mani.
// Per evitare la tentazione di spegnerlo mentre il Terminale è in funzione, l'indicatore è in modalità invisibile.

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

#include <Symbol.mqh>         // https://www.mql5.com/it/code/18855
#include <fxsaber\Expert.mqh> // https://www.mql5.com/it/code/19003

void MyAlert( const string Str )
{
  string StrArray[];
  
  for (int i = StringSplit(Str, '\n', StrArray) - 1; i >= 0; i--)
    Alert(StrArray[i]);
}

bool NextOnCalculate( const string SymbName = NULL )
{
  const SYMBOL Symb(SymbName);
  
  MqlRates Rates[1] = {0};
  Rates[0].time = TimeCurrent();
          
  return(Symb.IsCustom() ? Symb.CloneRates(Rates) : ChartSetSymbolPeriod(0, _Symbol, _Period));
}

const SYMBOL SymbTimer("Timer");

void OnInit()
{
  if (_Symbol == SymbTimer.Name)
    ChartIndicatorGet(0, 0, ChartIndicatorName(0, 0, 0));    
  else if (SymbTimer.IsExist() && SymbTimer.On() && NextOnCalculate(SymbTimer.Name))
  {
    iCustom(SymbTimer.Name, PERIOD_CURRENT,
            ".." + StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5));
    
    SymbTimer.Off(); 
  }
}

string GetExpertData( const ulong Chart = 0 )
{
  string Str = NULL;

  MqlParam Parameters[];
  string Names[];

  if (EXPERT::Parameters(Chart, Parameters, Names))
  {
    Str += "\n" + ::ChartSymbol(Chart) + " " + ::EnumToString(::ChartPeriod(Chart)) + " " + Parameters[0].string_value + "\n";

    const int Amount = ::ArraySize(Names);

    for (int i = 0; i < Amount; i++)
      Str += (string)i + ": "+ Names[i] + " = " + Parameters[i + 1].string_value + "\n";
  }

  return(Str);
}

void Active( const int AlertTime = 5 )
{
  static const uint StartTime = GetTickCount();
  static uint PrevInterval = 0;
  const uint Interval = (GetTickCount() - StartTime) / 1000;
  const string Str = MQLInfoString(MQL_PROGRAM_NAME) + ": I've been watching you for " + TimeToString(Interval, TIME_SECONDS);
    
  long Chart = ChartFirst();

  if (Chart != -1)  
    do
    {
      if (EXPERT::Is(Chart))
        MyAlert(GetExpertData(Chart) + "Removed - " + (string)EXPERT::Remove(Chart));
        
      ChartSetString(Chart, CHART_COMMENT,  Str);
      ChartRedraw(Chart);
    }
    while ((Chart = ChartNext(Chart)) != -1);    
  else if (!(Interval % AlertTime) && (Interval != PrevInterval))
  {
    MyAlert(Str);
    
    PrevInterval = Interval;
  }
}

int OnCalculate( const int, const int, const int, const double &[] )
{
  static int i = 0;
  
  if ((_Symbol == SymbTimer.Name) && NextOnCalculate())
    Active();
  else if (i++ > 0)
    ChartIndicatorDelete(0, 0, ChartIndicatorName(0, 0, ChartIndicatorsTotal(0, 0) - 1));           
    
  return(0);
}


ZY Se si riavvia il terminale, a volte si può verificare (MT5 build 1881) che si blocca nei processi. Il problema può essere risolto rimuovendo forzatamente il processo corrispondente terminal64.exe ed eliminando MetaTrader 5BasesCustom\history\Timer\*.hcc.

 
Grazie. Fantastico!
 

Nell'articolo l'autore ha evidenziato in modo molto dettagliato le sfumature dei risultati di questa biblioteca. Ne consiglio la lettura.

Методы дистанционного управления работой советников
Методы дистанционного управления работой советников
  • www.mql5.com
В наше время информационных технологий использование различных роботов и электронных экспертов для торговли на финансовых рынках стало довольно обычным явлением. Главными преимуществами электронных экспертов принято считать безукоризненное выполнение алгоритма и безустанная работа 24 часа в сутки. Для их круглосуточного использования арендуются...
 
Andrey Khatimlianskii:

Si dà il caso che a MT4 manchi molto di più di FileSave e FileLoad (che sono scritti in 3 righe ciascuno):

  1. Non c'è CHART_EXPERT_NAME (e non c'è nulla con cui sostituirlo, se non dopo aver sistemato tutte le altre sfumature - il tag name).

Nel mio progetto, ho risolto in questo modo (con il tag "name"):

      void Update()
      {                
         long chartId = ChartFirst();
         
         while(chartId > 0)
         {
            #ifdef __MQL4__
            string chartEAName = GetChartEAName(chartId);
            #endif 
            
            #ifdef __MQL5__     
            string chartEAName = ChartGetString(chartId, CHART_EXPERT_NAME);
            #endif
            
            if(chartEAName == m_eaName)
            {
               // ...
            }
            
            chartId = ChartNext(chartId);
         }
      }
      
      #ifdef __MQL4__
      string GetChartEAName(const long chartId)
      {
         if(!SaveTemplate(chartId))
         {
            return "";
         }
         
         string result = "";
         
         int handle = FileOpen("ea_name_checking.tpl",FILE_TXT|FILE_READ);
         if(handle == INVALID_HANDLE)
         {
            Print
            (
               "Error in ", __FILE__,", line ", __LINE__,
               ": can't open template file 'ea_name_checking.tpl', error code = ", GetLastError()
            );
         }
         else
         {
            string text = "";
            
            while(!FileIsEnding(handle)) 
            { 
               text = text + FileReadString(handle, (uint)FileSize(handle)) +"\r\n";
            }
            
            SubstringParser eaSectionTextParser(text, "<expert>", "</expert>");            
            string eaSectionText = eaSectionTextParser.Get();
            
            if(StringTrimLeft(StringTrimRight(eaSectionText)) != "")
            {
               SubstringParser eaNameParser(eaSectionText, "name=","\r\n");
               string eaName = StringTrimLeft(StringTrimRight(eaNameParser.Get()));
               
               if(eaName != "")               
               {
                  result = eaName;
               }
            }            
         }
         
         FileClose(handle);
         FileDelete("ea_name_checking.tpl");
         
         return result;
      }
      
      bool SaveTemplate(const long chartId)
      {
         ResetLastError();
         
         if(!ChartSaveTemplate(chartId, "\\Files\\ea_name_checking.tpl"))
         {            
            Print
            (
               "Error in ", __FILE__,", line ", __LINE__,
               ": can't save template to the file 'ea_name_checking.tpl', error code = ", GetLastError()
            );
            
            return false;
         }
         
         return true;
      }      
      #endif

Dove SubstringParser ha questo codice:

#property strict

class SubstringParser
{
   private:
      string m_text;
      string m_subStart;
      string m_subEnd;
   
   public:
      SubstringParser(const string text, const string subStart, const string subEnd)
      {
         m_text = text;
         m_subStart = subStart;
         m_subEnd = subEnd;
      }
      
      string Get()
      {
         int startPhraseLengt = StringLen(m_subStart);
         int startPos = StringFind(m_text, m_subStart) + startPhraseLengt;
         int endPos = StringFind(m_text, m_subEnd, startPos);
                 
         if(startPos >= startPhraseLengt && endPos > startPos)
         {
            return StringSubstr(m_text, startPos, endPos - startPos);      
         }
         else
         {
            return "";
         }
      }
};

Cioè salva il modello di grafico, lo legge, lo analizza e trova il nome dell'Expert Advisor. È ancora una stampella, ma finora funziona bene (per circa un paio di mesi). Penso che se si utilizza un HDD regolare, non si dovrebbe fare questa operazione troppo spesso (ad esempio, ad ogni tick). Spero che CHART_EXPERT_NAME appaia un giorno in MQL4 .

 
Ci sarà una nuova versione con il supporto per l'esecuzione di script?
 
Stanislav Korotky:
Ci sarà una nuova versione con il supporto per l'esecuzione di script?

Questo esempio non funziona?

 
fxsaber:

Questo esempio non funziona?

Non è molto simile al mio caso d'uso. La domanda principale sull'esempio è: cosa succede se il nome del file musicale è specificato in un parametro dello script, invece di lanciarlo attraverso le variabili globali? Posso inviarvi il mio progetto in un messaggio privato.

 
Stanislav Korotky:

Non è molto simile al mio caso d'uso. La domanda principale dell'esempio è: cosa succede se il nome del file musicale viene specificato in un parametro dello script invece di essere lanciato attraverso le variabili globali?

Non ricordo assolutamente il motivo, ma l'opzione con un parametro di input viene immediatamente suggerita. Poiché l'esempio è così contorto, deve trattarsi di una limitazione di MT5.