English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
EX5 Kitaplıklarını Kullanarak Geliştirme Projelerinizi Öne Çıkarın

EX5 Kitaplıklarını Kullanarak Geliştirme Projelerinizi Öne Çıkarın

MetaTrader 5Örnekler | 16 Aralık 2021, 16:10
216 0
---
---

Giriş

Tecrübeli bir okuyucu, kitaplıklardaki fonksiyon ve sınıf uygulamalarının neden gizlendiğine dair bir açıklamaya ihtiyaç duymaz. Aktif olarak yeni fikirler arayanlarınız, sınıfların/fonksiyonların uygulama ayrıntılarını bir .ex5 dosyasında gizlemenin diğer geliştiricilerle teknik bilgi algoritmalarınızı paylaşmanıza, ortak projeler oluşturmanıza ve bunları Web'de öne çıkarmanıza olanak sağlayacağını bilmek isteyebilir.

Ve MetaQuotes ekibi, ex5 kitaplık sınıflarının doğrudan kalıtım olasılığını gerçekleştirmek için elinden geleni yaparken, bunu hemen şimdi uygulayacağız.

İçindekiler

1. Fonksiyonların İçe ve Dışa Aktarılması
2. Bir Sınıfın Gizli Uygulamasının Dışa Aktarılması
3. Değişkenlerin .ex5 Dosyasında Başlatılması
4. Dışa Aktarma Sınıflarının Kalıtımı
5. ex5 Kitaplıklarının Yayınlanması


1. Fonksiyonların İçe ve Dışa Aktarılması

Bu, sınıfların dışa aktarılmasının altında yatan temel bir yöntemdir. Fonksiyonlarınızın diğer programlarda kullanılabilir olması için dikkate alınacak üç önemli şey vardır:

  1. Oluşturulacak dosya, .ex5 dosyasına derlenmesi için .mq5 (.mqh değil) uzantısına sahip olmalıdır;
  2. Dosya, #property kitaplık önişlemci direktifini içermelidir;
  3. "Dışa aktar" anahtar kelimesi, gerekli dışa aktarılmış fonksiyonların başlıklarından sonra konmalıdır.
Example 1. Let us create a function to be used in other programs

//--- library.mq5
#property library
int libfunc (int a, int b) export
{
  int c=a+b;
  Print("a+b="+string(с));
  return(с);
}

Bu dosyayı derledikten sonra, libfunc'ın başka bir programda daha sonra kullanılabileceği library.ex5 dosyasını alacaksınız.

Fonksiyonları içe aktarma işlemi de çok kolaydır. #import  önişlemci direktifi kullanılarak gerçekleştirilir.

Example 2. We will use the export function libfunc() in our script

//--- uses.mq5
#import "library.ex5"
  int libfunc(int a, int b);
#import

void OnStart()
{
  libfunc(1, 2);
}

Derleyicinin MQL5\Libraries klasöründe .ex5 dosyalarını arayacağını unutmayın. Dolayısıyla library.ex5 bu klasörde yer almıyorsa, ilgili yol adını belirtmeniz gerekecektir.

Örn;

#import "..\Include\MyLib\library.ex5" // the file is located in the MQL5\Include\MyLib folder
#import "..\Experts\library.ex5" // the file is located in the MQL5\Experts\ folder

İlerideki kullanımınız için, fonksiyonlar yalnızca hedef .mq5 dosyasına değil, aynı zamanda .mqh dosyalarına da aktarılabilir.

Pratik uygulamayı göstermek amacıyla bazı grafikler kullanalım.

Dışa aktarmak için bir fonksiyonlar kitaplığı oluşturacağız. Bu fonksiyonlar, bir grafik üzerinde Düğme, Düzenle, Etiket, Dikdörtgen Etiket gibi grafik nesnelerini gösterecek, nesneleri grafikten silecek ve grafiğin renk parametrelerini sıfırlayacak.

Bu, şematik olarak aşağıdaki gibi gösterilebilir:

Sınıf yöntemi dışa aktarma şeması

Tam Graph.mq5 dosyası, makalenin sonunda bulunabilir. Burada yalnızca Düzenle çizim fonksiyonunun bir şablon örneğini vereceğiz.

//+------------------------------------------------------------------+
//| SetEdit                                                          |
//+------------------------------------------------------------------+
void SetEdit(long achart,string name,int wnd,string text,color txtclr,color bgclr,color brdclr,
             int x,int y,int dx,int dy,int corn=0,int fontsize=8,string font="Tahoma",bool ro=false) export
  {
   ObjectCreate(achart,name,OBJ_EDIT,wnd,0,0);
   ObjectSetInteger(achart,name,OBJPROP_CORNER,corn);
   ObjectSetString(achart,name,OBJPROP_TEXT,text);
   ObjectSetInteger(achart,name,OBJPROP_COLOR,txtclr);
   ObjectSetInteger(achart,name,OBJPROP_BGCOLOR,bgclr);
   ObjectSetInteger(achart,name,OBJPROP_BORDER_COLOR,brdclr);
   ObjectSetInteger(achart,name,OBJPROP_FONTSIZE,fontsize);
   ObjectSetString(achart,name,OBJPROP_FONT,font);
   ObjectSetInteger(achart,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(achart,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(achart,name,OBJPROP_XSIZE,dx);
   ObjectSetInteger(achart,name,OBJPROP_YSIZE,dy);
   ObjectSetInteger(achart,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(achart,name,OBJPROP_READONLY,ro);
   ObjectSetInteger(achart,name,OBJPROP_BORDER_TYPE,0);
   ObjectSetString(achart,name,OBJPROP_TOOLTIP,"");
  }

Gerekli fonksiyonların içe aktarılması ve kullanımı, Spiro.mq5 hedef dosyasında uygulanacaktır:

Example 3. Using imported functions

//--- Spiro.mq5 – the target file of the Expert Advisor

//--- importing some graphics functions
#import "Graph.ex5" 
  void SetLabel(long achart, string name, int wnd, string text, color clr, 
               int x, int y, int corn=0, int fontsize=8, string font="Tahoma");
  void SetEdit(long achart, string name, int wnd, string text, color txtclr, color bgclr, color brdclr, 
                 int x, int y, int dx, int dy, int corn=0, int fontsize=8, string font="Tahoma", bool ro=false);
  void SetButton(long achart, string name, int wnd, string text, color txtclr, color bgclr, 
                int x, int y, int dx, int dy, int corn=0, int fontsize=8, string font="Tahoma", bool state=false);
  void HideChart(long achart, color BackClr);
#import

//--- prefix for chart objects
string sID; 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

void OnInit()
{
  HideChart(0, clrWhite);
  sID="spiro.";
  DrawParam();
}
//+------------------------------------------------------------------+
//| DrawParam                                                        |
//+------------------------------------------------------------------+
void DrawParam()
{
  color bgclr=clrWhite, clr=clrBlack;
//--- bigger radius    
  SetLabel(0, sID+"stR.", 0, "R", clr, 10, 10+3);
  SetEdit(0, sID+"R.", 0, "100", clr, bgclr, clr, 40, 10, 50, 20);
//--- smaller radius   
  SetLabel(0, sID+"str.", 0, "r", clr, 10, 35+3);
  SetEdit(0, sID+"r.", 0, "30", clr, bgclr, clr, 40, 35, 50, 20);
//--- distance to the center
  SetLabel(0, sID+"stD.", 0, "D", clr, 10, 60+3);
  SetEdit(0, sID+"D.", 0, "40", clr, bgclr, clr, 40, 60, 50, 20);
//--- drawing accuracy
  SetLabel(0, sID+"stA.", 0, "Alfa", clr, 10, 85+3); 
  SetEdit(0, sID+"A.", 0, "0.04", clr, bgclr, clr, 40, 85, 50, 20);
//--- drawing accuracy
  SetLabel(0, sID+"stN.", 0, "Rotor", clr, 10, 110+3); 
  SetEdit(0, sID+"N.", 0, "10", clr, bgclr, clr, 40, 110, 50, 20);
//--- draw button
  SetButton(0, sID+"draw.", 0, "DRAW", bgclr, clr, 39, 135, 51, 20); 
}

Uzman Danışmanın çalıştırılmasının ardından, nesneler grafik üzerinde görünecektir:

Kitaplık nesnelerini kullanma örneği

Görülebildiği gibi, fonksiyonların içe ve dışa aktarılma süreci çok zor değildir, ancak Yardım: dışa aktarma, içe aktarma kısmından belirli kısıtlamalar hakkındaki bilgileri okuduğunuzdan emin olun.


2. Bir Sınıfın Gizli Uygulamasının Dışa Aktarılması

MQL5'teki sınıflar henüz doğrudan dışa aktarılamadığı için, biraz fantastik bir yönteme başvurmamız gerekecek. Polimorfizm ve sanal fonksiyonlara dayanır. İşin doğrusu, ex5 modülünden döndürülen sınıfın kendisi değildir, ancak sınıfın oluşturulmuş bir nesnesidir. Buna gizli uygulama nesnesi diyelim.

Yöntemin özü, gerekli sınıfı ikiye bölmektir, böylelikle fonksiyon ve değişkenlerin bildiriminin genel erişime açıktır ve bunların uygulama detayları kapalı bir .ex5 dosyasında gizlenir.

Bu basitçe aşağıdaki gibi örneklenebilir. Uygulama detaylarını açıklamadan diğer geliştiricilerle paylaşmak istediğimiz CSpiro sınıfı var. Değişkenleri, yapıcıyı, yıkıcıyı ve çalışma fonksiyonlarını içerdiğini varsayalım.

Sınıfı dışa aktarmak için aşağıdakileri yapacağız:

  • CSpiro sınıfının alt öğesinin bir kopyasını oluşturun. Buna ISpiro diyelim ("arayüz (interface)" kelimesinden türetildiği için, ilk harf C, I ile değiştirilmiştir)
  • Tüm değişkenleri ve sahte fonksiyonları başlangıç CSpiro sınıfında bırakın.
  • Fonksiyon uygulama detayları, yeni bir ISpiro sınıfı oluşturacaktır.
  • Buna, kapalı ISpiro'nun bir örneğini oluşturacak olan dışa aktarma fonksiyonunu ekleyin.
  • Not! Gerekli tüm fonksiyonlar sanal ön eke sahip olacaktır

Sonuç olarak, iki dosyamız var:

Example 4. Hiding of the class implementation in the ex5 module

//--- Spiro.mqh – public file, the so called header file

//+------------------------------------------------------------------+
//| Class CSpiro                                                     |
//| Spirograph draw class                                       |
//+------------------------------------------------------------------+
class CSpiro
  {
public:
   //--- prefix of the chart objects
   string            m_sID;
   //--- offset of the chart center
   int               m_x0,m_y0;
   //--- color of the line
   color             m_clr;
   //--- chart parameters
   double            m_R,m_r,m_D,m_dAlfa,m_nRotate;

public:
   //--- constructor
                     CSpiro() { };
   //--- destructor
                    ~CSpiro() { };
   virtual void Init(int ax0,int ay0,color aclr,string asID) { };
   virtual void SetData(double aR,double ar,double aD,double adAlpha,double anRotate) { };

public:
   virtual void DrawSpiro() { };
   virtual void SetPoint(int x,int y) { };
  };

Lütfen tüm fonksiyon sınıflarının sanal anahtar kelimesiyle bildirildiğini unutmayın.

//--- ISpiro.mq5 – hidden implementation file

#include "Spiro.mqh"

//--- importing some functions
#import "..\Experts\Spiro\Graph.ex5"
void SetPoint(long achart,string name,int awnd,int ax,int ay,color aclr);
void ObjectsDeleteAll2(long achart=0,int wnd=-1,int type=-1,string pref="",string excl="");
#import

CSpiro *iSpiro() export { return(new ISpiro); }
//+------------------------------------------------------------------+
//| Сlass ISpiro                                                     |
//| Spirograph draw class                                       |
//+------------------------------------------------------------------+
class ISpiro : public CSpiro
  {
public:
                     ISpiro() { m_x0=0; m_y0=0; };
                    ~ISpiro() { ObjectsDeleteAll(0,0,-1); };
   virtual void      Init(int ax0,int ay0,color aclr,string asID);
   virtual void      SetData(double aR,double ar,double aD,double adAlpha,double anRotate);

public:
   virtual void      DrawSpiro();
   virtual void      SetPoint(int x,int y);
  };
//+------------------------------------------------------------------+
//| Init                                                             |
//+------------------------------------------------------------------+
void ISpiro::Init(int ax0,int ay0,color aclr,string asID)
  {
   m_x0=ax0;
   m_y0=ay0;
   m_clr=aclr;
   m_sID=asID;
   m_R=0; 
   m_r=0; 
   m_D=0;
  }
//+------------------------------------------------------------------+
//| SetData                                                          |
//+------------------------------------------------------------------+
void ISpiro::SetData(double aR,double ar,double aD,double adAlpha,double anRotate)
  {
   m_R=aR; m_r=ar; m_D=aD; m_dAlfa=adAlpha; m_nRotate=anRotate;
  }
//+------------------------------------------------------------------+
//| DrawSpiro                                                        |
//+------------------------------------------------------------------+
void ISpiro::DrawSpiro()
  {
   if(m_r<=0) { Print("Error! r==0"); return; }
   if(m_D<=0) { Print("Error! D==0"); return; }
   if(m_dAlfa==0) { Print("Error! Alpha==0"); return; }
   ObjectsDeleteAll2(0,0,-1,m_sID+"pnt.");
   int n=0; double a=0;
   while(a<m_nRotate*2*3.1415926)
     {
      double x=(m_R-m_r)*MathCos(a)+m_D*MathCos((m_R-m_r)/m_r*a);
      double y=(m_R-m_r)*MathSin(a)-m_D*MathSin((m_R-m_r)/m_r*a);
      SetPoint(int(m_x0+x),int(m_y0+y));
      a+=m_dAlfa;
     }
   ChartRedraw(0);
  }
//+------------------------------------------------------------------+
//| SetPoint                                                         |
//+------------------------------------------------------------------+
void ISpiro::SetPoint(int x,int y)
  {
   Graph::SetPoint(0,m_sID+"pnt."+string(x)+"."+string(y),0,x,y,m_clr);
  }
//+------------------------------------------------------------------+

Görüldüğü gibi, gizli sınıf .mq5 dosyasında uygulanmıştır ve #property kitaplık önişlemci komutunu içerir. Dolayısıyla önceki bölümde belirtilen tüm kurallar gözetilmiştir.

Ayrıca SetPoint fonksiyonu için kapsam çözünürlüğü operatörünü de unutmayın. Hem Graph kitaplığında hem de CSpiro sınıfında bildirilmiştir. Derleyicinin gerekli fonksiyonu çağırabilmesi için :: işlemini kullanarak bunu açıkça belirtir ve dosya adını veririz.

  Graph::SetPoint(0, m_sID+"pnt."+string(x)+"."+string(y), 0, x, y, m_clr);

Artık başlık dosyasını ekleyebilir ve uygulamasını ortaya çıkan Uzman Danışmanımıza aktarabiliriz.

Bu, şematik olarak aşağıdaki gibi gösterilebilir:

Kitaplık sınıflarının yöntemleriyle çalışma şeması

Example 5. Using export objects

//--- Spiro.mq5 - the target file of the Expert Advisor

//--- importing some functions
#import "Graph.ex5" 
  void SetLabel(long achart, string name, int wnd, string text, color clr,
               int x, int y, int corn=0, int fontsize=8, string font="Tahoma");
  void SetEdit(long achart, string name, int wnd, string text, color txtclr, color bgclr, color brdclr, 
              int x, int y, int dx, int dy, int corn=0, int fontsize=8, string font="Tahoma", bool ro=false);
  void SetButton(long achart, string name, int wnd, string text, color txtclr, color bgclr, 
                int x, int y, int dx, int dy, int corn=0, int fontsize=8, string font="Tahoma", bool state=false);
  void HideChart(long achart, color BackClr);
#import

//--- including the chart class
#include <Spiro.mqh> 

//--- importing the object
#import "ISpiro.ex5"
  CSpiro *iSpiro();
#import

//--- object instance
CSpiro *spiro; 
//--- prefix for chart objects
string sID; 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
{
  HideChart(0, clrWhite);
  sID="spiro.";
  DrawParam();
//--- object instance created
  spiro=iSpiro(); 
//--- initializing the drawing
  spiro.Init(250, 200, clrBlack, sID);
//--- setting the calculation parameters
  spiro.SetData(100, 30, 40, 0.04, 10);
//--- drawing
  spiro.DrawSpiro(); 
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  delete spiro; // deleting the object
}

Sonuç olarak, grafikteki nesne parametrelerini değiştirebilecek ve nesnenin grafiğini çizebileceksiniz



Grafik nesnesi parametreleri


3. Değişkenlerin .ex5 Dosyasında Başlatılması

ISuperClass'ınız genellikle içerik globals.mqh dosyasındaki değişkenleri kullanır. Bu değişkenler, diğer dosyalarınızda kullanmanız için benzer bir şekilde eklenebilir.

Örn;

Example 6. Public include file

//--- globals.mqh

#include <Trade\Trade.mqh>
//--- instance of the trade function object
extern CTrade *_trade; 

_trade nesnesinin tek örneği programınızda başlatılır, ancak gizli ISuperClass sınıfında kullanılır.

Bu amaçla, oluşturduğunuz nesne için bir işaretçi, ISuperClass sınıfından .ex5 dosyasına geçirilecektir.

Bu, nesne .ex5 dosyasından alındığında, aşağıdaki gibi en kolay şekilde yapılır:

Example 7. Initialization of variables upon creation of the object

//--- ISuperClass.mq5 –hidden implementation file

#property library
CSuperClass *iSuperClass(CTrade *atrade) export
{
//--- saving the pointer
   _trade=atrade; 
//--- returning the object of the hidden implementation of ISuperClass of the open CSuperClass class
  return(new ISuperClass); 
}
//... the remaining code

Böylelikle, tüm gerekli değişkenler nesnenin modülüne alınmasından sonra başlatılır.

Aslında, farklı türlerde birçok genel global değişken olabilir. iSuperClass fonksiyonunun başlığını her seferinde değiştirmek istemeyen kişilerin, bununla çalışmak için tüm global değişkenleri ve fonksiyonları toplayan özel bir sınıf oluşturması iyi olacaktır.

Example 8. Public include file

//--- globals.mqh
#include <Trade\Trade.mqh>

//--- trade "object"
extern CTrade *_trade; 
//--- name of the Expert Advisor of the system
extern string _eaname; 

//+------------------------------------------------------------------+
//| class __extern                                                   |
//+------------------------------------------------------------------+
class __extern // all extern parameters for passing between the ex5 modules are accumulated here
{
public:
//--- the list of all public global variables to be passed
//--- trade "object"
  CTrade *trade; 
//--- name of the Expert Advisor of the system
  string eaname; 
    
public:
  __extern() { };
  ~__extern() { };

//--- it is called when passing the parameters into the .ex5 file
  void Get() { trade=_trade; eaname=_eaname; };  // getting the variables

 //--- it is called in the .ex5 file
  void Set() { _trade=trade; _eaname=eaname; };  // setting the variables
                                                       
};
//--- getting the variables and pointer for passing the object into the .ex5 file
__extern *_GetExt() { _ext.Get(); return(GetPointer(_ext)); } 

//--- the only instance for operation
extern __extern _ext; 
ISuperClass.mq5 dosyası, aşağıdaki gibi uygulanacaktır:
Example 9.

//--- ISuperClass.mq5 –hidden implementation file

#property library
CSuperClass *iSuperClass(__extern *aext) export
{
//--- taking in all the parameters
  aext.Set();
//--- returning the object
  return(new ISuperClass); 
}
//--- ... the remaining code

Fonksiyon çağrısı, şimdi basitleştirilmiş ve en önemlisi genişletilebilir bir biçim dönüştürülecektir.

Example 10. Using export objects in the presence of public global variables

//--- including global variables (usually located in SuperClass.mqh)
#include "globals.mqh"    

//--- including the public header class
#include "SuperClass.mqh" 
//--- getting the hidden implementation object
#import "ISuperClass.ex5"
  CSuperClass *iSuperClass();
#import

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//--- creating the hidden implementation object providing for the passing of all parameters
  CSuperClass *sc=iSuperClass(_GetExt()); 
  //--- ... the remaining code
}


4. Dışa Aktarma Sınıflarının Kalıtımı

Nesnelerin bu şekilde dışa aktarılmasının, doğrudan ve basit kalıtımın söz konusu olmadığı anlamına geldiğini zaten anlamış olmalısınız. Gizli uygulama nesnesinin dışa aktarılması, nesnenin kendisinin kalıtım zincirinin son halkası olduğunu ve sonuçta kullanılabilecek olan olduğu anlamına gelir.

Genel anlamda, ek bir ara sınıf yazarak bir kalıtım "öykünmesi" oluşturabilirsiniz. Ve burada elbette polimorfizm ve sanallığa ihtiyacımız olacak.

Example 11. Emulation of inheritance of hidden classes

//--- including the public header class
#include "SuperClass.mqh" 

//--- getting the hidden implementation object
#import "ISuperClass.ex5"
  CSuperClass *iSuperClass();
#import

class _CSuperClass
{
public:
//--- instance of the hidden implementation object
  CSuperClass *_base;
public:
//--- constructor
  _CSuperClass() {  _base=iSuperClass(_GetExt()); };
//--- destructor
  ~_CSuperClass() { delete _base; };
//--- further followed by all functions of the base CSuperClass class
//--- working function called from the hidden implementation object
  virtual int func(int a, int b) { _base.func(a,b); }; 
};

Buradaki tek sorun, CSuperClass değişkenlerine erişimdir. Görülebileceği gibi, alt öğenin bildiriminde bulunmazlar ve _base değişkeninde yer alırlar. Genellikle, bir SuperClass.mqh başlık sınıfı olması koşuluyla kullanılabilirliği etkilemez.

Doğal olarak, temelde teknik bilgi fonksiyonlarına odaklanıyorsanız, önceden bunlarla ilgili olarak bir ISuperClass sarmalayıcısı oluşturmanıza gerek yoktur. Bu teknik bilgi fonksiyonlarını dışa aktarmak ve dışarıdaki geliştiricilerin daha sonra kalıt alması kolay olacak olan kendi sarmalayıcı sınıflarını oluşturmalarına izin vermek yeterli olacaktır.

Bundan dolayı, diğer geliştiriciler için geliştirmelerinizi hazırlarken, gerekli bir dizi dışa aktarma fonksiyonunun, .mqh ve .ex5 dosyalarının ve sınıflarının tamamını oluşturmaya dikkat etmelisiniz:
  1. Sınıftan bağımsız fonksiyonların dışa aktarılması
  2. Başlık .mqh dosyaları ve bunların .ex5 uygulamaları
  3. .ex5 dosyalarındaki değişkenlerin başlatılması


5. ex5 Kitaplıklarının Yayınlanması

Kasım 2011'de MetaQuotes bir dosya veri havuzuna erişim sağlamaya başladı. Bununla ilgili daha fazla bilgi duyuruda yer almaktadır.

Bu veri havuzu, geliştirmelerinizi saklamanıza ve daha önemlisi, diğer geliştiriciler için bunlara erişim sağlamanıza izin verir. Bu araç, dosyalarınızın yeni sürümlerini kolayca yayınlayarak bu dosyaları kullanabilecek olan geliştiriciler için hızlı erişim sağlamanıza olanak tanır.

Ayrıca, şirket web sitesi size Market'te kendi fonksiyon kitaplıklarınızı ticari olarak veya ücretsiz olarak sunma olanağı tanır.


Sonuç

Artık fonksiyonlarının veya sınıf nesnelerinin dışa aktarılmasıyla ex5 kitaplıklarının nasıl oluşturulduğunu biliyorsunuz ve bilginizi pratikte uygulayabilirsiniz. Tüm bu kaynaklar, diğer geliştiricilerle daha yakın bir işbirliği kurmanıza: ortak projeler üzerinde çalışmanıza, bunları Market'te öne çıkarmanıza veya ex5 kitaplık işlevlerine erişim sağlamanıza olanak tanır.


MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/362

Ekli dosyalar |
spiro.zip (3.91 KB)
AutoElliottWaveMaker - Elliott Waves Yarı Otomatik Analizi İçin MetaTrader 5 Aracı AutoElliottWaveMaker - Elliott Waves Yarı Otomatik Analizi İçin MetaTrader 5 Aracı
Makale, MetaTrader 5'teki Elliott Wave analizi için manuel ve otomatik dalga etiketlemenin bir kombinasyonunu temsil eden ilk geliştirme olan AutoElliottWaveMaker'ın bir incelemesini sunar. Dalga analizi aracı, yalnızca MQL5'te yazılmıştır ve harici dll kitaplıklarını içermez. Bu, MQL5'te sofistike ve ilginç programların geliştirilebileceğinin (ve geliştirilmesi gerektiğinin) bir başka kanıtıdır.
MQL5 kodunun güvenliğini sağlama: Parola Koruması, Anahtar Oluşturucular, Zaman Sınırları, Uzaktan Lisanslar ve Gelişmiş EA Lisans Anahtarı Şifreleme Teknikleri MQL5 kodunun güvenliğini sağlama: Parola Koruması, Anahtar Oluşturucular, Zaman Sınırları, Uzaktan Lisanslar ve Gelişmiş EA Lisans Anahtarı Şifreleme Teknikleri
Çoğu geliştiricinin kodlarının güvenliğini sağlaması gerekir. Bu makale, MQL5 yazılımını korumanın birkaç farklı yolunu sunacaktır - MQL5 Komut Dosyalarına, Uzman Danışmanlara ve Göstergelere lisanslama özellikleri sağlamak için yöntemler sunar. MQL5-RPC çağrılarını kullanarak parola koruması, anahtar oluşturucular, hesap lisansı, zaman sınırı değerlendirmesi ve uzaktan korumayı kapsar.
Son Haçlı Seferi Son Haçlı Seferi
Alım satım terminalinize bir göz atın. Hangi fiyat sunum araçlarını görebiliyorsunuz? Çubuklar, şamdanlar, çizgiler. Zamanı ve fiyatları kovalıyoruz, ancak yalnızca fiyatlardan kâr ediyoruz. Piyasayı analiz ederken yalnızca fiyatlara mı dikkat edelim? Bu makale, nokta ve şekil grafiği ("boşluklar ve çarpılar") için bir algoritma ve bir komut dosyası önermektedir. Verilen önerilerde pratik kullanımı özetlenen çeşitli fiyat paternlerine önem verilmektedir.
Trademinator 3: Alım Satım Makinelerinin Yükselişi Trademinator 3: Alım Satım Makinelerinin Yükselişi
“Dr. Tradelove..." makalesinde, önceden seçilmiş bir alım satım sisteminin parametrelerini bağımsız olarak optimize eden bir Uzman Danışman oluşturduk. Ayrıca, yalnızca EA’nın altında yatan bir alım satım sisteminin parametrelerini optimize etmekle kalmayıp aynı zamanda birkaç alım satım sistemi arasından en iyisini seçebilen bir Uzman Danışman oluşturmaya karar verdik. Bakalım buradan neler çıkacak...