Kütüphaneler: Uzman - sayfa 2

 
fxsaber:

Oh, şu Rus hackerlar.... Peki, biraz batmışken neden tüm uzmanları durduralım?

Bu arada, sizde de bir hata var. Statik çalışmıyor.

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

Bu arada, sizde de bir hata var. Statik çalışmıyor.

Burada bir hata görmedim

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerini test etme üzerine forum.

Yeni başlayanların soruları MQL5 MT5 MetaTrader 5

fxsaber, 2018.08.02 17:09

// SL tetiklenirse tüm Uzman Danışmanları durdurur.

#include <MT4Orders.mqh>      // https://www.mql5.com/tr/code/16006
#include <fxsaber\Expert.mqh> // https://www.mql5.com/tr/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;
}
 
// Gösterge, Uzman Danışmanlar aracılığıyla tüm ticaret girişimlerini keser. Yalnızca ellerle ticaret yapılmasına izin verir.
// Terminal çalışırken kapatma eğilimini önlemek için gösterge görünmez moddadır.

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

#include <Symbol.mqh>         // https://www.mql5.com/tr/code/18855
#include <fxsaber\Expert.mqh> // https://www.mql5.com/tr/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 Terminali yeniden başlatırsanız, bazen (MT5 build 1881) işlemlerde askıda kalmasıyla karşılaşabilirsiniz. İlgili işlem terminal64.exe'yi zorla kaldırarak ve MetaTrader 5\Bases\Custom\history\Timer\*.hcc'yi silerek üstesinden gelinebilir.

 
Teşekkür ederim. Harika!
 

Makalede yazar, bu kütüphanenin sonuçlarının nüanslarını çok detaylı bir şekilde vurgulamıştır. Okumanızı tavsiye ederim.

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

MT4'te FileSave ve FileLoad'dan (her biri 3 satırda yazılmıştır) çok daha fazlası eksiktir:

  1. CHART_EXPERT_NAME yok (ve diğer tüm nüansları düzelttikten sonra - name etiketi dışında değiştirilecek bir şey yok).

Projemde bunu bu şekilde çözdüm ("name" etiketi ile):

      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

SubstringParser'ın bu koda sahip olduğu yer:

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

Yani grafik şablonunu kaydedin, okuyun, ayrıştırın ve Uzman Danışmanın adını bulun. Bu hala bir koltuk değneği, ancak şimdiye kadar iyi çalışıyor (yaklaşık birkaç aydır). Normal bir HDD kullanıyorsanız, bunu çok sık yapmamanız gerektiğini düşünüyorum (örneğin, her tikte). CHART_EXPERT_NAME'in bir gün MQL4'te görüneceğini umuyorum.

 
Komut dosyalarını çalıştırma desteği olan yeni bir sürüm olacak mı?
 
Stanislav Korotky:
Komut dosyalarını çalıştırma desteği olan yeni bir sürüm olacak mı?

Bu örnek çalışmıyor mu?

 
fxsaber:

Bu örnek çalışmıyor mu?

Benim kullanım durumuma çok benzemiyor. Örnekle ilgili ana soru, müzik dosyasının adı global değişkenler aracılığıyla atmak yerine bir kod parametresinde belirtilirse ne olur? Projemi size özel mesaj olarak gönderebilirim.

 
Stanislav Korotky:

Benim kullanım durumuma çok benzemiyor. Örnekle ilgili asıl soru, müzik dosyasının adı global değişkenler aracılığıyla atılmak yerine bir kod parametresinde belirtilirse ne olacağıdır?

Nedenini hiç hatırlamıyorum, ancak bir giriş parametresi seçeneği hemen öneriliyor. Örnek çok çarpık olduğu için, MT5'in bir sınırlaması olmalı.