Kütüphaneler: Uzman - sayfa 3

 
Kütüphanenin başka bir uygulamasına bir örnek

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi üzerine forum

ParameterGetRange()

fxsaber, 2018.11.16 09:17

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

#define  TOSTRING(A) (" " + #A + " = " + (string)(A))

// Optimizasyon için girdi parametreleri aralığı hakkında veri toplar
string OptimizationData( void )
{
  string Str = NULL;
  MqlParam Params[];
  string Names[];
  
  if (EXPERT::Parameters(0, Params, Names))
  {
    const int Size = ArraySize(Names);
    bool Enable;
    long Value, Start, Step, Stop;
    long Total = 1;
    
    Str = Params[0].string_value;
    
    for (int i = 0; i < Size; i++)
      if (ParameterGetRange(Names[i], Enable, Value, Start, Step, Stop))
      {
        const long Interval = Stop - Start + 1;
        const long Amount =  Enable ? Interval / Step + ((bool)(Interval % Step) ? 1 : 0) : 1;
        
        Str += "\n" + Names[i] + " = " + (string)Value + (Enable ? TOSTRING(Start) + TOSTRING(Step) + TOSTRING(Stop) + TOSTRING(Amount) : NULL);
        
        Total *= Amount;
      }
      
    Str += "\n" + TOSTRING(Total);
  }
  
  return(Str);
}

input int Range1 = 5;
input int Range2 = 5;
input int Range3 = 5;

void OnTesterInit()
{
  ParameterSetRange("Range1", true, 5, 1, 2, 3);
  
  Print(__FUNCTION__ + "\n" + OptimizationData());
}

void OnTesterDeinit()
{
  Print(__FUNCTION__ + "\n" + OptimizationData());
  
  ChartClose();
}

int OnInit()
{
  return(INIT_FAILED);
}


OnTesterInit
Experts\fxsaber\Test3.ex5
Range1 = 5 Start = 5 Step = 1 Stop = 50 Amount = 46
Range2 = 5 Start = 23 Step = 1 Stop = 78 Amount = 56
Range3 = 5 Start = 26 Step = 5 Stop = 83 Amount = 12
 Total = 30912

OnTesterDeinit
Experts\fxsaber\Test3.ex5
Range1 = 5 Start = 1 Step = 2 Stop = 3 Amount = 2
Range2 = 5 Start = 23 Step = 1 Stop = 78 Amount = 56
Range3 = 5 Start = 26 Step = 5 Stop = 83 Amount = 12
 Total = 1344
 
Hata düzeltildi.
 
Hata düzeltildi. Son sürüm.
 

Bir Uzman Danışmanı .ex4 biçiminde farklı bir ada sahip bir Uzman Danışmana bağlayarak nasıl çalıştırabilirsiniz ve giriş parametrelerinin görüntülenmesi gerekir, yani onunla tam olarak çalışmak mümkündü.

"Trade.ex4" adıyla derlenmiş bir Uzman Danışmanımız var.

"Hand.ex4" adıyla yeni bir Uzman Danışman oluşturun.

"Hand.ex4" başlatıldığında, "Trade.ex4" tamamen işlevsel olacak ve "Trade.ex4" "Hand.ex4" içine gömülecek şekilde bunları nasıl birleştirebiliriz?

Yani, makinede sadece Hand.ex4 dosyamız var, ancak işte Trade.ex4 kullanıyoruz

Teşekkür ederim!

 
Vitaly Muzichenko:

Bir Uzman Danışmanı .ex4 biçiminde nasıl çalıştırabilirsiniz ...

Mevcut haliyle kütüphane yalnızca EX5 ile çalışır.

 
Sergey Eremin:

Kendimde, belirli bir projenin bir parçası olarak, bu şekilde çözdüm ("name" etiketi ile aynen böyle):

Teşekkürler, bu şekilde çalışıyor!

Sadece kaydedilen şablonun adına chartId ekledim, böylece farklı grafiklerdeki aynı EA'lar aynı dosya için savaşmaz.


@fxsaber, kodda "#ifndef __MQL5__" var, neden çapraz platformu mantıksal sonucuna götürmüyorsunuz?

Is'in çalışmasını sağlamak için kodun başına ekliyoruz:

#property strict

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

   string GetChartEAName(const long chartId)
   {
      if(!SaveTemplate(chartId))
      {
         return "";
      }
      
      string result = "";
      
      int handle = FileOpen("ea_name_checking_" + (string)chartId + ".tpl",FILE_TXT|FILE_READ);
      if(handle == INVALID_HANDLE)
      {
         Print
         (
            "Error in ", __FILE__,", line ", __LINE__,
            ": can't open template file 'ea_name_checking_" + (string)chartId + ".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_" + (string)chartId + ".tpl");
      
      return result;
   }
   
   bool SaveTemplate(const long chartId)
   {
      ResetLastError();
      
      if(!ChartSaveTemplate(chartId, "\\Files\\ea_name_checking_" + (string)chartId + ".tpl"))
      {            
         Print
         (
            "Error in ", __FILE__,", line ", __LINE__,
            ": can't save template to the file 'ea_name_checking_" + (string)chartId + ".tpl', error code = ", GetLastError()
         );
         
         return false;
      }
      
      return true;
   }      
 #endif

Ve fonksiyonun kendisini düzeltin:

  static bool Is( const long Chart_ID = 0 )
  {
                #ifdef __MQL4__
                        string chartEAName = GetChartEAName(Chart_ID);
                #endif 
                
                #ifdef __MQL5__     
                        string chartEAName = ChartGetString(Chart_ID, CHART_EXPERT_NAME);
                #endif
                return(chartEAName != NULL);
  }


Başka zorluklar var mı?

 
Andrey Khatimlianskii:

Başka zorluklar var mı?

Yalnızca bir göstergenin çalıştığı bir grafik.


ZY Bu şekilde çalışması gerekir

SubstringParser eaSectionTextParser(text, "\r\n\r\n<expert>", "</expert>");
 

Kütüphanenin tüm işlevleri artık MT4 üzerinde çalışıyor.

Kütüphane çapraz platform haline geldi.

 
Tüm kütüphane işlevleri artık MT4 üzerinde çalışıyor.
Kütüphane çapraz platform haline geldi.


MT4-örnek:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Uzman

fxsaber, 2019.04.09 13:19

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

void OnStart()
{
  MqlParam Params[2];

  // Путь к советнику
  Params[0].string_value = "Moving Average";
  
  // Первый входной параметр советника
  Params[1].type = TYPE_DOUBLE;
  Params[1].double_value = 0.5;  

  Print(EXPERT::Run(ChartOpen(_Symbol, _Period), Params));
}
 
Vitaly Muzichenko:

.ex4'te bir EA çalıştırmanın en iyi yolu nedir ...

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

void OnStart()
{
  MqlParam Params[2];

  // Danışmanlığa Giden Yol
  Params[0].string_value = "Moving Average";
  
  // Uzman Danışmanın ilk giriş parametresi
  Params[1].type = TYPE_DOUBLE;
  Params[1].double_value = 0.5;  

  Print(EXPERT::Run(ChartOpen(_Symbol, _Period), Params));
}