Bibliotheken: Expert - Seite 2

 
fxsaber:

Oh, diese russischen Hacker.... Nun, warum alle Experten aufhalten, wenn man ein bisschen im Arsch ist?

Übrigens, Sie haben auch einen Fehler. Statik funktioniert nicht.

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

Übrigens, Sie haben auch einen Fehler. Statik funktioniert nicht.

Ich habe hier keinen Fehler gesehen

Forum über Trading, automatisierte Handelssysteme und das Testen von Handelsstrategien.

Fragen von Anfängern MQL5 MT5 MetaTrader 5

fxsaber, 2018.08.02 17:09

// Stoppt alle Expert Advisors, wenn SL ausgelöst wird.

#include <MT4Orders.mqh>      // https://www.mql5.com/de/code/16006
#include <fxsaber\Expert.mqh> // https://www.mql5.com/de/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;
}
 
// Der Indikator unterbricht alle Versuche, über Expert Advisors zu handeln. Er erlaubt nur den Handel mit Händen.
// Um die Versuchung zu vermeiden, die Anzeige bei laufendem Terminal auszuschalten, ist sie unsichtbar.

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

#include <Symbol.mqh>         // https://www.mql5.com/de/code/18855
#include <fxsaber\Expert.mqh> // https://www.mql5.com/de/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 Wenn Sie das Terminal neu starten, kann es manchmal vorkommen (MT5 Build 1881), dass es sich in Prozessen aufhängt. Dies kann durch das gewaltsame Entfernen des entsprechenden Prozesses terminal64.exe und das Löschen von MetaTrader 5\Bases\Custom\history\Timer\*.hcc behoben werden.

 
Ich danke Ihnen. Fantastisch!
 

In dem Artikel hat der Autor sehr ausführlich auf die Nuancen der Ergebnisse dieser Bibliothek hingewiesen. Ich empfehle, ihn zu lesen.

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

In MT4 fehlt viel mehr als FileSave und FileLoad (die jeweils in 3 Zeilen geschrieben sind):

  1. Kein CHART_EXPERT_NAME (und es gibt nichts, womit man es ersetzen könnte, außer nach der Fixierung aller anderen Nuancen - dem name-Tag).

In meinem Projekt habe ich es so gelöst (mit dem "name"-Tag):

      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

Wo SubstringParser hat diesen Code:

#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 "";
         }
      }
};

D.h. speichern Sie die Chart-Vorlage, lesen Sie es, analysieren Sie es und finden Sie den Namen des Expert Advisors. Es ist immer noch eine Krücke, aber es funktioniert gut so weit (für etwa ein paar Monate). Ich denke, wenn Sie eine normale Festplatte verwenden, sollten Sie dies nicht zu oft tun (zum Beispiel bei jedem Tick). Ich hoffe, CHART_EXPERT_NAME wird eines Tages in MQL4 erscheinen .

 
Wird es eine neue Version mit Unterstützung für die Ausführung von Skripten geben?
 
Stanislav Korotky:
Wird es eine neue Version mit Unterstützung für die Ausführung von Skripten geben?

Funktioniertdieses Beispiel nicht?

 
fxsaber:

Dieses Beispiel funktioniert nicht?

Es ist meinem Anwendungsfall nicht sehr ähnlich. Die Hauptfrage zu diesem Beispiel ist, was passiert, wenn der Name der Musikdatei in einem Skriptparameter angegeben wird, anstatt ihn über globale Variablen zu übergeben? Ich kann Ihnen mein Projekt in einer privaten Nachricht schicken.

 
Stanislav Korotky:

Es ist nicht sehr ähnlich zu meinem Anwendungsfall. Die wichtigste Frage zu dem Beispiel ist, was passiert, wenn der Name der Musikdatei in einem Skriptparameter angegeben wird, anstatt über globale Variablen übergeben zu werden.

Ich erinnere mich nicht mehr an den Grund, aber die Option mit einem Eingabeparameter wird sofort vorgeschlagen. Da das Beispiel so verdreht ist, muss es sich um eine Einschränkung des MT5 handeln.