Kütüphaneler: Uzman - sayfa 13

 
fxsaber #:

Bir sorun varsa, lütfen oynatma için hazır mq5 dosyaları verin.

#define  MT4ORDERS_LIBRARY
#include "../../utils/MT4Orders.mqh" 
// #define REPORT_BROWSER // Tarayıcı başlangıcı ile rapor oluşturma - DLL izni gerektirir.
#define  TESTER_CUSTOM // Uzman Danışmanı Kullanıcı Test Cihazında Çalıştırma
#include "../../utils/fxsaber/Tester/Tester.mqh" // https://www.mql5.com/tr/code/24848

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  KEY_B 66
#define  KEY_S 83
#define  KEY_C 67

input int In1 = 1;
input group "label1"
input double In2 = 2.0;
// 
void OnChartEvent( const int id, const long &lparam, const double &dparam, const string &sparam ) {
  if (id == CHARTEVENT_KEYDOWN) {
    switch ((int)lparam) {
    case KEY_B: // satın al
      OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0);
      break;
    case KEY_S: // satmak
      OrderSend(_Symbol, OP_SELL, 1, Bid, 100, 0, 0);
      break;
    case KEY_C: // kapat
      for (int i = OrdersTotal() - 1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL))
          OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
    }
  }
}


void OnTick() {
  //Print(_Symbol, " ", SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE));
}
void OnTimer() { /* Comment(REPORT::OrdersToString(_Symbol, 0, 5)); */ }
int OnInit() {
  Print(_Symbol, " ", SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE));
  Print(_Symbol, " In2 = ", In2);
  return(INIT_SUCCEEDED);
}
//
void OnDeinit( const int ) {}
//
void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) {

}
//+------------------------------------------------------------------+

Örnek kod, Tester kütüphanenizin kodunu kullanır. Başlangıçtan sonra In2 değişkeni 2 değil 0 olur. Yani, tüm giriş parametreleri gruptan sonra alınamaz.
 
hini #:

Bu durum dikkate alınmamış gibi görünmektedir. Parametre bir grup olduğunda, belirli bir değer yoktur ve elde edilen değer null olacaktır, bu nedenle gruptan sonra hiçbir parametre elde edilmeyecektir.

Aşağıdaki kod her şeyin doğru şekilde işlendiğini göstermektedir.

input int In1 = 1;
input group "label1"
input double In2 = 2.0;

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

int GetAmountExperts()
{
  int Res = 0;
  
  for (long Chart = ChartFirst(); Chart != -1; Chart = ChartNext(Chart))
    Res += (ChartGetString(Chart, CHART_EXPERT_NAME) != "");
    
  return(Res);
}

void OnInit()
{
  if (GetAmountExperts() < 2)
  {
    MqlParam Params[];
    string Names[];
            
    const int Size = EXPERT::Parameters(0, Params, Names) - 1;
    
    ArrayPrint(Params);
    ArrayPrint(Names);
    
    for (uint i = Size; (bool)i--;)
      EXPERT::AddInputName(Params[i + 1], Names[i]);
            
    Params[Size].string_value = "7";
    EXPERT::Run(ChartOpen(_Symbol, _Period), Params);
  }
}


Sonuç.

    [type] [integer_value] [double_value]      [string_value]
[0]     14               0           0.00 "Scripts\Test6.ex5"
[1]     14               1           1.00 "1"                
[2]     14               0           0.00 null               
[3]     14               2           2.00 "2.0"              
"In1" null  "In2"


Expert.mqh Expert Advisor, Expert.mqh aracılığıyla başlatıldı.

 
input bool InRun = true;
input group "label1"
input double In2 = 2.0;

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


int GetAmountExperts()
{
  int Res = 0;
  
  for (long Chart = ChartFirst(); Chart != -1; Chart = ChartNext(Chart))
    Res += (ChartGetString(Chart, CHART_EXPERT_NAME) != "");
    
  return(Res);
}

void OnInit()
{
  if (InRun)
  {
    MqlParam Params[];
    string Names[];
            
    const int Size = EXPERT::Parameters(0, Params, Names) - 1;
    
    ArrayPrint(Params);
    ArrayPrint(Names);
    int nameSize = ArraySize(Names);
    for (int i = nameSize-1; i >= 0; i--) {
      if (Names[i] == "InRun")
        Params[i+1].string_value = "false";
      EXPERT::AddInputName(Params[i + 1], Names[i]);
    }  
            
    ArrayPrint(Params);
    ArrayPrint(Names);
    //Params[Size].string_value = "7";
    EXPERT::Run(ChartOpen(_Symbol, _Period), Params);
    return;
  }
  Print("In2 = ", In2);
}

GetAmountExperts işlevi bilinmeyen bir nedenle çok uzun bir süre sonuç vermeden çalışıyor. Kodu biraz değiştirdim - lütfen tekrar çalıştırın. In2 parametresine 7 değerini atamamalısınız (2 değil 0 olduğunu göreceksiniz).


 
hini #:

Kodu biraz değiştirdim - lütfen tekrar çalıştırın.

Bu örnek bir hata raporu: hatayı hemen gösteren kısa kodu çalıştırdım.

Düzeltmeyi yaptım, teşekkürler.

 
fxsaber #:

Bu örnek bir hata raporu: hemen bir hata gösteren kısa ve öz bir kod çalıştırıldı.

Düzeltmeyi yaptım, teşekkür ederim.

Anlıyorum, sorun olması durumunda aynı formatta raporlama yapacağım.
 

Komut dosyası yüklenirse, giriş parametreleri değiştirilemez gibi görünür.

 //Test1.ex5
#property script_show_inputs
input string str = "test1" ;
//void OnInit() {
void OnStart () {
   Print (str);
}
 // Uzman Danışmanı belirtilen giriş parametreleri ile başlatın
#property script_show_inputs

#include "Expert.mqh"

input bool CurrentChart = false ; // EA'yı current(true)/new(false) grafiğinde çalıştırın

string GetMyName( void ) {
   return ( StringSubstr ( MQLInfoString ( MQL_PROGRAM_PATH ), StringLen ( TerminalInfoString ( TERMINAL_DATA_PATH ) + "\\MQL5\\" )));
}

bool RunExpert( const long Chart ) {
   MqlParam Params[ 2 ];
  Params[ 0 ].string_value = "Experts\\Advisors\\Test1.ex5" ;
   // Uzman Danışmanın ilk giriş parametresi
  Params[ 1 ].type = TYPE_STRING ;
  Params[ 1 ].string_value = "Hello World!" ;
   return (EXPERT::Run(Chart, Params));
}

#define  NAME __FILE__

void OnStart () {
   union UNION {
     double Double;
     long Long;
  } Chart;
   if (CurrentChart) {
    Chart.Long = ChartID ();
     GlobalVariableSet (NAME, Chart.Double);
     MqlParam Params[ 1 ];
     // Kendine giden yol (script)
    Params[ 0 ].string_value = GetMyName();
     // Yeni grafikte kendimizi başlatıyoruz
    EXPERT::Run( ChartOpen ( _Symbol , _Period ), Params);
  } else if ( GlobalVariableCheck (NAME)) {
    Chart.Double = GlobalVariableGet (NAME);
     GlobalVariableDel (NAME);
    RunExpert(Chart.Long);
     ChartClose ();
  } else // Uzman Danışmanı çalıştırmanın en kolay yolu (varsayılan olmayan parametrelerle) mevcut grafik üzerinde değildir
    RunExpert( ChartOpen ( _Symbol , _Period ));
}
//+------------------------------------------------------------------+
 
hini #:

Komut dosyası yüklenirse, giriş parametreleri değiştirilemez gibi görünür.

MT5'in mimarisi böyledir, komut dosyaları için giriş parametre değerlerini ayarlayamazsınız ve bunları okuyamazsınız.

Kütüphanenin güzel bir adı var.

 
fxsaber #:

MT5'in mimarisi öyle ki, komut dosyaları için giriş parametresi değerleri ayarlayamazsınız ve bunları okuyamazsınız.

Kütüphanenin güzel bir ismi var.

Tamam.
 
Optimizasyon aralıkları ayarlanmadan optimizasyon başlatıldığında, çerçeve modu konusunda daha fazla bilgi.
#include <fxsaber\Expert.mqh> // https://www.mql5.com/tr/code/19003

input group "Params"
input int inRange1 = 0;
input double inRange2 = 0;

// Optimizasyon aralıklarının ayarlanıp ayarlanmadığını kontrol eder.
bool OptimizationIsCorrect()
{
  bool Res = false;
  
  if (MQLInfoInteger(MQL_FRAME_MODE))
  {    
    MqlParam Parameters[];
    string Names[];

    EXPERT::Parameters(0, Parameters, Names);
  
    for (uint i = ArraySize(Names); !Res && (bool)i--;)
    {
      long S[4];
      
      ParameterGetRange(Names[i], Res, S[0], S[1], S[2], S[3]);
    }
  }
      
  return(Res);
}

void OnTesterInit()
{
  if (!OptimizationIsCorrect())
  {
    Alert("no optimized parameter selected, please check input(s) to be optimized and set start, step and stop values");
    
    ChartClose();
  }
}

void OnTesterDeinit() {}
Böyle bir çözüm olmadan, çerçeve modundaki bir Uzman Danışman grafikte asılı kalır. Test Cihazını otomatikleştirirken özellikle kritiktir.