Kütüphaneler: Uzman

 

Uzman:

Rastgele EA'ların parametrelerini okuma/yazma kütüphanesi.

Author: fxsaber

 

Bunun açıklaması

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

MQL4 MT4 MetaTrader 4 yeni başlayanların soruları

fxsaber, 2017.09.08 13:52

ChartApplyTemplate kullanırken, İncil'de şu şekilde yaptığım zorunlu senkronizasyon gereklidir

  static bool TemplateApply( const long Chart_ID, const string &Str, const bool Sync = true )
  {
    string TmpStr = Str;

    const bool SyncFlag = (Sync && Chart_ID && (Chart_ID != ::ChartID()) && !::IsStopped());

    if (SyncFlag)
    {
      const color ColorStopLevel = (color)::ChartGetInteger(Chart_ID, CHART_COLOR_STOP_LEVEL);

      if ((bool)(ColorStopLevel >> 24))
        ::ChartSetInteger(Chart_ID, CHART_COLOR_STOP_LEVEL, ColorStopLevel & 0xFFFFFF);

      const int NewColorStopLevel = (int)EXPERT::StringBetween(TmpStr, EXPERT_STOPLEVEL, STRING_END) | (0x01 << 24);

      TmpStr = Str;
      EXPERT::StringReplace(TmpStr, EXPERT_STOPLEVEL, STRING_END, EXPERT_STOPLEVEL + (string)NewColorStopLevel + STRING_END);
    }

    short Data[];
    const bool Res = ::StringToShortArray(TmpStr, Data, 0, ::StringLen(TmpStr)) &&
                     ::FileSave(FILENAME, Data) && ::ChartApplyTemplate((ulong)Chart_ID, FILENAME);

    if (Res && SyncFlag)
    {
      long Value;

      while ((!::IsStopped() && ::ChartGetInteger(Chart_ID, CHART_COLOR_STOP_LEVEL, 0, Value) && (!(bool)((int)Value >> 24))))
        ::Sleep(0);

      ::ChartSetInteger(Chart_ID, CHART_COLOR_STOP_LEVEL, (int)Value & 0xFFFFFF);
    }

    return(Res);
  }

ChartApply hemen tetiklenmez. Ve başka herhangi bir eylem ancak tetiklendikten sonra yapılabilir.


Şablonun uygulandığını anlamak için, şablonun kendisini değiştirmeniz (grafiğin bir özelliğinin rengi İncil'de değiştirilir - şeffaflıktan sorumlu 4. bayt) ve bu değer grafiğin bir özelliği haline geldiğinde Sleep (ChartGetInterger) aracılığıyla beklemeniz gerekir. Bundan sonra, ChartSetInteger aracılığıyla normal değerini ayarlayın.


Komut dosyasının atıldığı aynı grafikte bir Uzman Danışman çalıştırmamız gerekirse, yeni bir grafik açmamız ve şablon aracılığıyla aynı (komut dosyasını) çalıştırmamız ve oradan Uzman Danışmanı ihtiyacımız olan grafikte çalıştırmamız gerekir. yardımcı olanı kapattı. Bu ExpertLoader_Example.mq5 tarafından yapılır.

 

может быть полезна при написании различных управляющих панелей чартами/советниками и т.п.

Kütüphane DLL'ler olmadan çalışır - Pazar gereksinimlerini tamamen karşılar.

 

Küçük bir hack - OBJ_CHART nesneleri üzerinde EA'lar/komut dosyaları çalıştırmak.

Böylece başlatılan Uzman Danışmanlar ölü olarak asılır - hiçbir şekilde yürütülmezler. Ancak komut dosyaları mükemmel şekilde çalışır. Bu nedenle, bu bazı olasılıkları açar.

Örneğin, halihazırda çalışan bir Uzman Danışmanın bulunduğu grafiklerdeki göstergelerden Sipariş işlevlerini kullanabilirsiniz. Ve herhangi bir yeni yardımcı grafik açmanıza gerek yoktur.


Scripts\OrderSend.mq5 komut dosyasını derleyin

#include <MT4Orders.mqh>       // https://www.mql5.com/tr/code/16006
#include <GlobalVariables.mqh> // https://www.mql5.com/ru/forum/189649#comment_4854618

struct ORDERSEND
{
  int Type;
  double Volume;
  double Price;
  int SlipPage;
  double SL;
  double TP;
  long Magic;
  datetime Expiration;
  color Arrow_Color;
};

void OrderSend()
{
  const ORDERSEND Order = _GlobalVariableGet<ORDERSEND>("ORDERSEND");
  const string Symb = _GlobalVariableGet<string>("Symbol");
  const string comment = _GlobalVariableGet<string>("Comment");
      
  _GlobalVariableSet(__FUNCTION__, OrderSend(Symb, Order.Type, Order.Volume, Order.Price, Order.SlipPage, Order.SL, Order.TP, comment, Order.Magic, Order.Expiration, Order.Arrow_Color));
  
  _GlobalVariableDel("ORDERSEND");
  _GlobalVariableDel("Symbol");
  _GlobalVariableDel("Comment");  
}

void OnStart()
{
  OrderSend();
}


Ve "ticaret yapabilen" göstergeyi çalıştırın.

#include <fxsaber\Expert.mqh>  // https://www.mql5.com/tr/code/19003
#include <GlobalVariables.mqh> // https://www.mql5.com/ru/forum/189649#comment_4854618

struct ORDERSEND
{
  int Type;
  double Volume;
  double Price;
  int SlipPage;
  double SL;
  double TP;
  long Magic;
  datetime Expiration;
  color Arrow_Color;
};

template <typename T>
long _GlobalVariableGet2( const string Name, const ulong MaxTime = 1 e6 )
{
  const ulong StartTime = GetMicrosecondCount();
  
  while (!IsStopped() && !GlobalVariableCheck(Name) && (GetMicrosecondCount() - StartTime < MaxTime))
    Sleep(0);
      
  return(_GlobalVariableGet<T>(Name));
}

// Uzman Danışmanı olan bir grafikte bile göstergeden bile çalışan OrderSend
long OrderSend( string Symb, const int Type, const double dVolume, const double Price, const int SlipPage, const double SL, const double TP,
                string comment = NULL, const long magic = 0, const datetime dExpiration = 0, color arrow_color = clrNONE )
{
  MqlParam Params[1];    
  Params[0].string_value = "Scripts\\OrderSend.ex5";

  ORDERSEND Order;

  Order.Type = Type;
  Order.Volume = dVolume;
  Order.Price = Price;
  Order.SlipPage = SlipPage;
  Order.SL = SL;
  Order.TP = TP;
  Order.Magic = magic;
  Order.Expiration = dExpiration;
  Order.Arrow_Color = arrow_color;

  const long Res = ObjectCreate(0, __FILE__, OBJ_CHART, 0, 0, 0) && _GlobalVariableSet("ORDERSEND", Order) &&
                   _GlobalVariableSet("Symbol", Symb) && _GlobalVariableSet("Comment", comment) &&
                   EXPERT::Run(ObjectGetInteger(0, __FILE__, OBJPROP_CHART_ID), Params) &&
                   ObjectDelete(0, __FILE__) ? _GlobalVariableGet2<long>(__FUNCTION__) : -1;  
  
  _GlobalVariableDel(__FUNCTION__);

  return(Res);
}

void OnInit()
{  
  Print(OrderSend(_Symbol, ORDER_TYPE_BUY, 1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0, "From Indicator", 9));
}

int OnCalculate( const int, const int, const int, const double &[] )
{
  return(0);
}
 
Kütüphaneyi platformlar arası bir duruma getirmeye izin vermeyen hiçbir teknik sınırlama yoktur - MT4'te de çalışmak için.
 

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

Uzman Danışmanları küresel bir algoritma aracılığıyla yönetme

Totosha16, 2018.02.07 18:57

Şu anda kütüphanenizi kullanarak basit bir sorunu çözmeye çalışıyorum, bu da şu şekilde özetlenebilir: mevcut grafik dışındaki tüm grafiklerdeki tüm Uzman Danışmanları kapatmak (ExpertRemove komut dosyasının çalıştırıldığı grafik). Bunu nasıl yapacağımı söyleyebilir misiniz?

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

void OnStart()
{    
  const long CurrentChart = ChartID();  
  long Chart = ChartFirst();

  while (Chart != -1)
  {
    if (Chart != CurrentChart)
      EXPERT::Remove(Chart);

    Chart = ChartNext(Chart);
  }
}
 

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

Hatalar, hatalar, sorular

Vladislav Andruschenko, 2018.02.09 10:14 AM

Uzman Danışman içindeki harici değişkenlerin listesini nasıl alabilirim? böylece onları tekrar tekrar dizide listelemek zorunda kalmam? yani bir grafikte ayarlarken, Uzman Danışman kendini okur ve harici ayarlarına bakar.

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

Hatalar, hatalar, sorular

fxsaber, 2018.02.09 12:44 pm.

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

input string Input1 = "Hello World!";
input int Input2 = 123;

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 OnInit()
{
  Print(GetExpertData());
}


Sonuç

0: Input1 = Hello World!
1: Input2 = 123


ya da bunun gibi

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

input string Input1 = "Hello World!";
input int Input2 = 123;

void OnInit()
{
  MqlParam Parameters[];
  string Names[];   
  
  if (EXPERT::Parameters(0, Parameters, Names))
    ArrayPrint(Parameters);
}


Sonuç

    [type] [integer_value] [double_value]      [string_value]
[0]    ...               0        0.00000 "Experts\Test2.ex5"
[1]    ...               0        0.00000 "Hello World!"     
[2]    ...             123      123.00000 "123"              
 

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

Hatalar, hatalar, sorular

fxsaber, 2018.02.22 23:53

Göstergeden herhangi bir süredeki bir ses dosyasını çalma.

Scripts\PlaySound.mq5 komut dosyası.

#include <GlobalVariables.mqh> // https://www.mql5.com/ru/forum/189649#comment_4854618

void OnStart()
{
  const string SoundName = "SOUND";

  if (GlobalVariableCheck(SoundName))
  {
    PlaySound(_GlobalVariableGet<string>(SoundName));
  
    _GlobalVariableDel(SoundName);
  }
}


Gösterge

#property indicator_chart_window

#property indicator_buffers 0
#property indicator_plots indicator_buffers

#include <fxsaber\Expert.mqh>  // https://www.mql5.com/tr/code/19003
#include <GlobalVariables.mqh> // https://www.mql5.com/ru/forum/189649#comment_4854618

class PLAYER
{
public:
  const string Name;
  const long Chart;
  const long chartID;
  
  PLAYER( const long iChart = 0 ) : Name(__FILE__), Chart(iChart ? iChart : ::ChartID()),
                                    chartID(::ObjectCreate(this.Chart, this.Name, OBJ_CHART, 0, 0, 0)   &&
                                            ::ObjectSetInteger(this.Chart, this.Name, OBJPROP_XSIZE, 0) &&
                                            ::ObjectSetInteger(this.Chart, this.Name, OBJPROP_YSIZE, 0) ?
                                            ::ObjectGetInteger(this.Chart, this.Name, OBJPROP_CHART_ID) : this.Chart)
  {
  }
  
  ~PLAYER()
  {
    if (this.chartID != this.Chart)
      ::ObjectDelete(this.Chart, this.Name);
  }
  
  void PlaySound( string FileName, const string ScriptName = "Scripts\\PlaySound.ex5" ) const
  {
    static const string SoundName = "SOUND";
    
    if (_GlobalVariableSet(SoundName, FileName))
    {
      MqlParam Params[1];
      
      Params[0].string_value = ScriptName;
      
      if (!EXPERT::Run(this.chartID, Params))      
        _GlobalVariableDel(SoundName);
    }    
  }
};

int OnCalculate( const int rates_total , const int prev_calculated, const int, const double& [] )
{  
  if (!prev_calculated)
  {
    const PLAYER Player;
    
    Player.PlaySound("email.wav");
  }

  return(rates_total);
}
 

MT4, ortaya çıktığı gibi, FileSave ve FileLoad'dan (her biri 3 satırda yazılmış) çok daha fazlasını kaçırıyor:

  1. CHART_EXPERT_NAME yok (ve diğer tüm nüansları düzelttikten sonra - isim etiketi dışında değiştirilecek bir şey yok).
  2. Frontal FileLoad, anladığım kadarıyla, kaydedilen şablonun ANSI kodlaması nedeniyle uygun değil.
    Dosyayı metin modunda okuyan bir TemplateToString analogu yazmak zorunda kaldım.
  3. STRING_END boş olmalıdır, dörtlü şablonlarda "\r\n" yoktur.
  4. MT4'teki <expert> etiketi göstergeler için de kullanılır, bu nedenle tüm bu düzenlemelerden sonra bile, göstergelerin nerede olduğunu ve EA'nın nerede olduğunu yalnızca EA'nın en son belirtildiği gerçeğine güvenerek öğrenebilirsiniz (ve her zaman böyle midir?). Peki, ve ona ulaşmanız gerekiyor.
Genel olarak, çok gerekli ve kullanışlı bir şey, uygulama için teşekkür ederim!
 

Andrey Khatimlianskii:

MT4'teki <expert> etiketi göstergeler için de kullanılır, bu nedenle tüm bu düzenlemelerden sonra bile, Uzman Danışmanın en son belirtildiği gerçeğine güvenerek göstergelerin nerede olduğunu ve Uzman Danışmanın nerede olduğunu öğrenebilirsiniz (ve her zaman böyle midir?). Peki, ve ona ulaşmanız gerekiyor.

Bu kaynak kodu sorunun anlaşılmasına yardımcı olabilir.

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

Bir göstergedeki gösterge çizgisinin mevcut rengini nasıl öğrenebilirim?

fxsaber, 2017.05.12 13:45

#property strict

#property indicator_chart_window
#property indicator_buffers 2

#define  PATH "MQL4\\indicators\\"

#include <TypeToBytes.mqh> // https://www.mql5.com/tr/code/16280

string GetIndicatorName( void )
{
  const string StrName = ::MQLInfoString(MQL_PROGRAM_PATH);
  const int Pos = ::StringFind(StrName, PATH) + ::StringLen(PATH);
  
  return(::StringSubstr(StrName, Pos, ::StringLen(StrName) - Pos - 4));
}

void SeekToString( const int handle, const string Str )
{
  while (!::FileIsEnding(handle))
    if (::FileReadString(handle) == Str)
      break;
  
  return;
}  

struct BUFFER_STRUCT
{
  int Shift;
  int Type;
  color Color;
  ENUM_LINE_STYLE Style;
  int Width;
};

const BUFFER_STRUCT GetBufferProperties( const uint Num = 0, const bool FlagSave = true )
{
  BUFFER_STRUCT Res = {0};
  
  const string FileName = ::WindowExpertName() + ".tpl";

  if (FlagSave ? ::ChartSaveTemplate(0, "..\\MQL4\\Files\\" + FileName) : true)
  {
    const int handle = ::FileOpen(FileName, ::FILE_READ|::FILE_CSV);

    if (handle > 0)
    {
      ::SeekToString(handle, "name=" + ::GetIndicatorName());
      
      if (Num == 0)
        ::SeekToString(handle, "</expert>");
      else
      {
        const string TmpStr = "weight_" + (string)(Num - 1);
        
        while (!::FileIsEnding(handle))
          if (::StringFind(::FileReadString(handle), TmpStr) == 0)
            break;
      }
            
      if (!::FileIsEnding(handle))
      {
        static const string Property[] = {"shift", "draw", "color", "style", "weight"};
        const string StrNum = "_" + (string)Num + "=";
              
        for (int i = 0; i < ::ArraySize(Property); i++)
          _W(Res)[i * sizeof(int)] = (int)::StringToInteger(::StringSubstr(::FileReadString(handle), ::StringLen(Property[i] + StrNum)));
      }
      
      ::FileClose(handle);
    }
  }
  
  return(Res);
}  

void OnInit()
{  
  string Str = "Colors:";
  
  for (int i = 0; i < indicator_buffers; i++)
    Str += " " + (string)i + "-" + (string)::GetBufferProperties(i).Color;
    
  Alert(Str);
}

void start()
{
}
 
fxsaber:

Bu kaynak konunun anlaşılmasına yardımcı olabilir.

Teşekkür ederim! Her zaman olduğu gibi, istediğimden biraz daha karmaşık ;)

Kodlarınızın inkar edilemez bir avantajı var - alınabilir ve kullanılabilirler. Ancak içlerinde herhangi bir değişiklik yapmak oldukça zor, bu bir dezavantaj.