Kütüphaneler: Uzman - sayfa 11

 
Girdilerin adlarını biliyorsanız, ikinci seçenek daha iyidir. Uzman Danışmandaki girdilerin sırasını düşünmemenizi sağlar. Ve teknik olarak daha iyi uygulanmaktadır.
#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[2];

  // Danışmanlığa Giden Yol
  Params[0].string_value = "Experts\\Test6.ex5";
  Params[0].string_value += "\nexpertmode=5";
  
  Params[1].type = TYPE_INT;
  Params[1].integer_value = 123423;
  EXPERT::AddInputName(Params[1], "inpFirst");

  EXPERT::Run(0, Params);
}


inpFirst ikinci sırada olmasına rağmen, herhangi bir şeye ayarlanabilir (bu durumda ilk ve tek olacak şekilde ayarlanmıştır). Ayarlanmamış olanlar varsayılan olacaktır.

 
Deneyler için birkaç grafik için bir robot klonlamam gerekiyordu. Bunu bu işlev aracılığıyla yaptım.
#include <fxsaber\Expert.mqh> // https://www.mql5.com/tr/code/19003

// Çalışan Uzman Danışmanı geçerli ayarlarla bir grafikten diğerine kopyalar
bool ExpertFromTo( const long ChartSource, const long ChartTarget )
{
  bool Res = false;
    
  MqlParam Params[];
  string Names[];

  const int ExpertMode = EXPERT::Parameters(ChartSource, Params, Names);  
  const int Size = ArraySize(Params);
  
  if (Size)
  {
    Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
    
    for (int i = 1; i < Size; i++)
      EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);

    Res = EXPERT::Run(ChartTarget, Params);
  }
  
  return(Res);
}


Bu şekilde kullandım.

#property script_show_inputs

input int inAmount = 5; // Kaç klon var

void OnStart()
{
  const int Size = SymbolsTotal(true);
  
  if (Size > inAmount)
    for (int i = 0, Count = 0; i < Size; i++)
    {
      const string Symb = SymbolName(i, true);
      
      if (Symb != _Symbol)
      {
        ExpertFromTo(0, ChartOpen(Symb, PERIOD_CURRENT)); // Mevcut EA'yı yeni grafik-semboller üzerinde çalıştırın.
        Count++;
        
        if (Count == inAmount)
          break;
      }
    }
}
 

Birden fazla Terminalde bir düzine farklı Uzman Danışmanı yeniden başlatma görevi ortaya çıkar. Genel olarak, büyük bir rutin.

Örneğin, bir şeyi düzelttik. Ardından ME'de toplu derleme ve yeniden başlatma. Bunun için böyle bir komut dosyası kullanıyorum.

// EA'ları tüm grafiklerde yeniden yükler.
input int inInterval = 5; // Grafiğin yeniden başlatılması arasındaki saniye cinsinden aralık

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // Görevi grafik kuyruğuna yerleştirin.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // Kuyruğu hareket ettirin.
}

void OnStart()
{
  const long chartID = ::ChartID();

  for (long Chart = ChartFirst(); (Chart != -1) && !IsStopped(); Chart = ChartNext(Chart))
    if ((Chart != chartID) && (ChartGetString(Chart, CHART_EXPERT_NAME) != NULL) && (ReloadChart(Chart)))    
      Sleep(inInterval * 1000);
}

Kodda önemli bir yeri işaretledim. Bu olmadan, şablonun uygulanması komut dosyasının sonuna kadar olmayacaktır. Benzer şekilde, Terminali yeniden yükledikten sonra Uzman Danışmanların başlat ılmasını çözebilirsiniz, vb.

 
fxsaber:

Birden fazla Terminalde bir düzine farklı Uzman Danışmanı yeniden başlatma görevi ortaya çıkar. Genel olarak, büyük bir angarya.

Örneğin, bir şeyi düzelttik. Sonra ME'de toplu derleme ve yeniden başlatma. Bunun için bu betiği kullanıyorum.

Kodda önemli bir yeri vurguladım. Bu olmadan, şablon komut dosyasının sonuna kadar kullanılmayacaktır. Benzer şekilde, Terminali yeniden yükledikten sonra Uzman Danışmanların başlatılmasını vb. çözebilirsiniz.

Belirtilen grafikte EA'nın adını alabilirseniz tam bir set olacaktır. Eğer sizin için zor değilse, bitirin.

 
Vladimir Pastushak:

Belirtilen çizelgede meclis üyesinin adını bulabilirseniz tamamlanmış olacaktır. Sakıncası yoksa, lütfen tamamlayın.

ChartGetString(Chart, CHART_EXPERT_NAME)

Bu MT5'tir. Uzman Danışman için çapraz platforma veya tam yola ihtiyacınız varsa, Expert.mqh aracılığıyla.

 
fxsaber:

Bu MT5'tir. Uzman Danışman için çapraz platforma veya tam yola ihtiyacınız varsa, Expert.mqh aracılığıyla.

Çapraz platforma ihtiyacınız var...

 
Vladimir Pastushak:

Bir cros-platformer lazım...

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

Kütüphaneler: Uzman

fxsaber, 2019.09.12 06:17 pm.

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

// Çalışan EA'nın verilerini çıkarır
string EAToString( const long Chart_ID = 0 )
{
  string Names[];
  MqlParam Params[];
  
  const int Flag = EXPERT::Parameters(Chart_ID, Params, Names);
  const int Size = ArraySize(Names);
  
  string Str = "Expert " + Params[0].string_value + ", expertmode = " + (string)Flag;
  
  for (int i = 0; i < Size; i++)
    Str += "\n" + Names[i] + " = " + Params[i + 1].string_value;
    
  return(Str);    
}
 
// Dosya giriş değişkenini seçilen dosyaya eşit yapar.
bool FileDialogToInput( const string InputName, const long Chart = 0 )
{  
  string FileNames[];
  const bool Res = (FileSelectDialog(MQLInfoString(MQL_PROGRAM_NAME) + " " + _Symbol + " " + EnumToString(_Period) +
                    ": input string " + InputName + " = ",
                    NULL, NULL, FSD_FILE_MUST_EXIST, FileNames, NULL) > 0);
  if (Res)
  {    
    MqlParam Params[];
    string Names[];
  
    const int ExpertMode = EXPERT::Parameters(Chart, Params, Names);  
    const int Size = ArraySize(Params);
    
    if (Size)
    {
      Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
      
      for (int i = 1; i < Size; i++)
      {
        if (Names[i - 1] == InputName)
          Params[i].string_value = FileNames[0];
        
        EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);
      }
  
      EXPERT::Run(Chart, Params);
    }    
  }
  
  return(Res);
}

Bu fonksiyon, bir dosyayı girdi değişkeni olarak seçmenize olanak tanır. Bu uygulama.

input string inFileName = NULL; // Seçilen dosya

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName))
    return(FileDialogToInput(TOSTRING(inFileName)) || INIT_FAILED);
    
  // Giriş değişkeninde geçerli bir dosya belirtilmişse kod.

  return(INIT_SUCCEEDED);
}


Başlangıç.


Tamam'a tıklayın ve seçin.


Aç'a tıklayın ve çalışan EA'nın özelliklerini (F7) görün.


Aynı şey herhangi bir sayıda dosya ile de çalışacaktır.

input string inFileName1 = NULL; // Seçilen dosya1
input string inFileName2 = NULL; // Seçilen dosya2

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName1))
    return(FileDialogToInput(TOSTRING(inFileName1)) || INIT_FAILED);

  if (!FileIsExist(inFileName2))
    return(FileDialogToInput(TOSTRING(inFileName2)) || INIT_FAILED);
    
  // Giriş değişkeninde geçerli bir dosya belirtilmişse kod.

  return(INIT_SUCCEEDED);
}
 
Ve anladığım kadarıyla set dosyalarından parametre yükleme henüz desteklenmiyor?
 
traveller00:
Ve anladığım kadarıyla set dosyalarından parametre yükleme henüz desteklenmiyor?

Ben yapmadım. Ama çok basit.