"MQL5 Nesne Yönelimli Programlama Yaklaşımını Kullanarak Expert Advisor Yazma" makalesi için tartışma - sayfa 2

[Silindi]  
Yedelkin:
Açılıştaki Teklif 1.2695'te olacaksa, zaten otomatik olarak 5 pip kaybımız var. Aynı zamanda SL, geliştiricinin fikrine göre 50 pip ise, tetiklenmeden önce 45 pip daha olumsuz yönde geçmelidir. Yani, stoploss tetiklendiğinde, Alış 1,2645'te değil, 1,2650'de olmalıdır; ve sırasıyla 1,2655'te sor.

1. Açılıştaki 5 piplik kayıp hakkında.

Kayıp konusunda haklısınız, eğer pozisyonu aynı anda kapatırsak (şartlı olarak) spread miktarı kadar, yani 5 pip kadar bir kayıp elde ederiz.

Çünkü uzun pozisyonlar Alış (karşı) fiyatından kapatılır.

En azından mantıksal olarak bu durumda bu zararı almalıyız (ve bu doğrudur).

Bu, bir karşı emirle kapatmak için de geçerlidir. Karşı emir 1,2695 fiyatından tetiklendiğinde (şu anda Alış fiyatının olduğu yer) nasıl bir sonuç elde edeceğimizi düşünüyorsunuz?

Peki, KISA pozisyonların açılış fiyatının Sor olduğunu iddia etmeyeceksiniz değil mi?

2. BU kapanışı ile ilgilenelim

Alış işlemini 1,27'den açtığımızı hatırlıyoruz (bu fiyat artık bizim için bir BU seviyesidir).

Alış fiyatı 1,27'ye ulaşırsa (yani tam olarak 5 pip yukarı giderse) BU kapanışının gerçekleşeceğini varsaymak mantıklıdır.

Bir karşı emir yardımıyla CU'yu kapatarak ifademizi kontrol edelim. Böyle bir pozisyonun açılış fiyatı 1,27 olmalıdır ve bildiğimiz gibi Satış emirleri Alış fiyatından verilir. Şu anda Alış fiyatı 1,2695'tedir. Bu nedenle, BU'da kapanmak için 5 pip geçmesi gerekir, bu nedenle hesaplamalarda hata yoktur ve ifade doğrudur.

3. SL ve TP hakkında

Burada iki ifade geçerlidir:

а. Uzunlar Alışta açılır ve Satışta kapanır; Kısalar Alışta açılır ve Satışta kapanır.

б. TP ve SL'ye olan mesafe Açılış Fiyatından hesaplanır, hesaplama pozisyonun yönünü dikkate alır.


İkinci ifadeye tam olarak uygun olarak, örneğimiz için SL ve TP fiyatlarını belirleyeceğiz. Açılış Fiyatı 1,27'de SL = 1,2650 ve TP = 1,28 (yukarıda açıklanan koşullara göre).

İlk ifadeye göre, UZUN (ve örnekte UZUN), Ask'ın 1,27'ye eşit olması (ve Bid'in 5 piplik spread'e göre 1,2695'e eşit olması) koşuluyla açılacaktır.

4. Şimdi SL ve TP'mizin hangi koşullar altında tetikleneceğini belirleyelim.

Koşullardan biri karşılandığında pozisyonumuz kapatılacaktır (başka faktör yoksa):

TP'de - Alış 1,28'e ulaşırsa (1,27'den 100 pip), şu anda Satış 1,2805'te olacaktır (buradaki ilk ifade ve spread kuralının boyutu).

Bir karşı pozisyon kullanarak TP üzerinde kapanış yaparak ifademizi kontrol edelim. Böyle bir pozisyonun açılış fiyatı 1,28 olmalıdır ve bildiğimiz gibi Satış emirleri Alış'a verilir. Şu anda Alış fiyatı 1,2695'tedir. Bu nedenle, TP'de kapatmak için 5 pip (spreaddeki kayıpları karşılamak için) + karı sabitlemek için 100 pip geçmek gerekir.

SL'de - Fiyat SL seviyesine ulaşırsa, hatırladığımız gibi 1.2650'ye eşittir.


Şimdi hangi fiyat olacağını anlayalım. Mantıksal olarak, Teklif fiyatı olmalıdır (bu, karşı siparişin açılış fiyatına karşılık gelir).

Şu anda (pozisyon açma koşuluna göre) Teklifin 1,2695'te olduğunu hatırlıyoruz. Bu nedenle, SL tetiklenmeden önce fiyatın 45 pip geçmesi gerekir.

Böylece, SL tetiklenmeden önce fiyatın geçmesi için zamanın olduğu spread (5 pip) + 45 pip'e eşit bir kayıp kaydedeceğiz.

Bu açıdan bakıldığında haklısınız

Bir karşı pozisyon kullanarak SL'de kapanış yaparak ifademizi kontrol edelim. Böyle bir pozisyonun açılış fiyatı 1,2650'de olmalıdır ve bildiğimiz gibi Satış emirleri Alış'ta açılır. Şu anda Alış fiyatı 1,2695'te. Bu nedenle, SL'de kapatmak için 45 pip geçmek gerekir. SL tetiklendiğinde, 50 piplik bir kayıp kaydedilecektir (spreadde 5 pip + bize karşı harekette 45 pip).

PS

Ancak bu açıdan bakıldığında, MQL4 için bu örnek benim için çok net değil.

int ticket;

  if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25)
    {
     ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point,"My order #"+counter,16384,0,Green);
     if(ticket<0)
       {
        Print("OrderSend failed with error #",GetLastError());
        return(0);
       }
    }

Daha doğrusu, SL'nin hangi mantık ve hangi ifadeler temelinde ve sadece bunun dikkate alındığı konusunda çok net değilim.

Ancak bu örneğe dayanarak (ve sadece ondan) aşağıdakileri elde ediyorum

//Temel örnek
ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,SL = Bid-Loss*Point,TP = Ask+Profit*Point,"My order #"+counter,16384,0,Green);
//Pazar pozisyonu açma emri
ticket=OrderSend(Symbol(),OP_BUY,1,1.27,3,1.2645 = 1.2695-50*Point,1.28 = 1.27+100*Point);

Open = 1.27, SL = 1.2645 ve TP = 1.28 değerlerine dayanarak aşağıdakileri anlıyorum:

1. Pozisyon, Ask 1.27 fiyatına ulaştığında açılır (bizim durumumuzda zaten oradadır);

2. BU seviyesi 1.27 fiyatında bulunur ve üzerinde kapanmak için sembolün oranı (bizim durumumuzda EUR) spread boyutu kadar büyümelidir (bizim durumumuzda 5 pip);

3. Açılış anında, hemen spread tutarında bir kayıp elde ederiz (pozisyonu HEMEN kapatmamız durumunda), çünkü mantıksal ifadelere dayalı olarak açık pozisyon bir karşı emirle kapatılmalıdır. MQL4 kodunda, böyle bir işlem aşağıdaki gibi görünecektir

//Temel örnek
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,3,0,0);
//Piyasadaki bir pozisyonu karşı emir ile kapatmak
ticket=OrderSend(Symbol(),OP_SELL,1,1.2695,3,0,0);

4. TP, fiyat 1,28 seviyesine ulaştıktan sonra tetiklenir. Mantıksal olarak, bu fiyat Teklif fiyatı olmalıdır, çünkü karşı emir bu fiyattan açılır (Teklif fiyatı 1,28 değerine ulaştığında işlem gerçekleştirilir). Buna dayanarak, MQL4 kodundaki kapanış aşağıdaki gibi görünmelidir

//Piyasa emri (karşı emir) ile TP pozisyonu kapatma
ticket=OrderSend(Symbol(),OP_SELL,1,1.28,3,0,0);
//Bir pozisyonu bekleyen karşı emirle kapatma (sınırlayıcı)
ticket=OrderSend(Symbol(),OP_SELLLIMIT,1,1.28,3,0,0);

5. SL, işlem gören sembolün oranı (bizim durumumuzda EUR) açılış anından itibaren 50 pip düştükten sonra tetiklenecektir.


Şimdi en ilginç şey

MQL4 Yardım'daki aynı örneği (muhtemelen binlerce kişi tarafından kullanılmış olan klasik bir örnek) temel alarak bir piyasa pozisyonunun açılışını kontrol edelim.

Kontrol etmek için bu kodu kullanacağız

//+------------------------------------------------------------------+
double PriceOpen,PriceSL,PriceTP;
int ticket;
//+------------------------------------------------------------------+
//Sipariş için fiyatları formüle edin
PriceOpen = Ask;
PriceSL   = Bid-500*Point;
PriceTP   = PriceOpen+1000*Point;
//Pazar pozisyonu açma emri
ticket = OrderSend(Symbol(),OP_BUY,0.10,PriceOpen,5,PriceSL,PriceTP);
//+------------------------------------------------------------------+

Bu kod Alpari'nin sunucusunda çalıştırıldığında (gerçek tırnak işaretleri kullanılarak) aşağıdaki sonuç elde edilir

2010.08.24 09:12:47 '******': instant order buy 0.10 EURUSD at 1.26292 sl: 1.25776 tp: 1.27292

Bu durumda aşağıdaki boyutları elde edeceğimizi tahmin etmek kolaydır SL = 516 (veya 4 basamak için 51 pip) TP = 1000 (veya 4 basamak için 100 pip)

PPS

MQL4 Yardım'a bir göz atalım:

Parametreler:
sembolü - Alım satım işleminin gerçekleştirildiği finansal aracın adı.
cmd - Ticari işlem. Ticari işlem değerlerinden herhangi biri olabilir.
hacim - Lot sayısı.
fiyat - Açılış fiyatı.
kayma - Piyasa emirleri (alış veya satış emirleri) için izin verilen maksimum fiyat sapması.
stoploss - Kayıp seviyesine ulaşıldığında pozisyon kapanış fiyatı (kayıp seviyesi olmaması durumunda 0).
kar elde etmek - Karlılık seviyesine ulaşıldığında pozisyon kapanış fiyatı (karlılık seviyesinin olmaması durumunda 0).
Yorum - Emir yorumunun metni. Yorumun son kısmı ticaret sunucusu tarafından değiştirilebilir.
sihirli - Siparişin sihirli numarası. Kullanıcı tanımlı bir tanımlayıcı olarak kullanılabilir.
Son kullanma tarihi - Bekleyen emrin sona erme süresi.
arrow_colour - Grafikteki açılış okunun rengi. Parametre yoksa veya değeri CLR_NONE ise, açılış oku grafikte görüntülenmez.
Örnek:
  int ticket; if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25) { ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point, "My order #"+counter,16384,0,Green); if(ticket<0) { Print("OrderSend failed with error #",GetLastError()); return(0); } }

"Bana gerçeğin nerede olduğunu söyle kardeşim?"...?

OrderSend - Документация на MQL4
  • docs.mql4.com
OrderSend - Документация на MQL4
[Silindi]  
Yedelkin:

Kodun aşağıdaki kısmını anlamıyorum:

// Önceki çubuğun (çubuk 1) kapanış fiyatını ilgili Uzman Danışman değişkenine kopyalayın
   Cexpert.setCloseprice(mrate[1].close);  // bar 1 kapanış fiyatı
//--- Alış pozisyonu olup olmadığını kontrol edin
   if (Cexpert.checkBuy()==true)
   {
      if (Buy_opened) 
         {
            Alert("Zaten satın almak için bir pozisyonumuz var!!!"); 
            return;    // Uzun pozisyona ekleme yapmayın
         }
      double aprice = NormalizeDouble(latest_price.ask,_Digits);
      double stl    = NormalizeDouble(latest_price.ask - STP*_Point,_Digits);
      double tkp    = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits);
      int    mdev   = 100;
      // siparişi ver
      Cexpert.openBuy(ORDER_TYPE_BUY,Lot,aprice,stl,tkp,mdev);
   }
Eğer bir alış pozisyonu açacaksak, latest_price.ask fiyatına odaklanmalıyız, ancak böyle bir pozisyon için Zararı Durdur ve Kar Al ayarlarken - latest_price.bid fiyatına. Bu doğru mudur? Zararı Durdur ve Kâr Al neden kod metnindeki satış fiyatına göre belirleniyor? Bu bir baskı hatası mı yoksa belirli bir stratejinin özelliği mi (kod, bir Satış pozisyonu açmak için benzer bir yapıya sahiptir)?

Kodun bu kısmı aşağıdaki ifadeler temelinde anlaşılmalıdır:

а. Uzun - Alışta açılır ve Satışta kapanır; Kısa - Alışta açılır ve Satışta kapanır;

б. Pozisyonlar karşı emirlerle kapatılır;

в. BU seviyesi Açık Fiyattadır;

г. TP ve SL'ye olan mesafe Açık Fiyattan (CU seviyesi) hesaplanır;

д. TP, Teklif fiyatı Açık Fiyat + Kar büyüklüğüne eşit bir seviyeye ulaştığında tetiklenecektir;

e. SL, güvenlik Açık Fiyat - Zarar boyutuna eşit Teklif seviyesine ulaştığında tetiklenecektir.

Uzman Danışmanın yazarı, çalışmalarında büyük olasılıkla benzer ifadelerle yönlendirildi. Her şeyi olabildiğince açık hale getirmek için, aşağıdaki ekranın yardımıyla yukarıdakilerin bir örneğini sunuyorum (kırmızı dikdörtgenle ilgileniyoruz).


 
Interesting:

e. SL, Teklif fiyatı Açık Fiyat - Zarar boyutuna eşit bir seviyeye ulaştığında tetiklenecektir.

Teşekkürler, mantığı anladım. Ancak yine de, "e" noktasına göre, stoploss tetiklendiğinde, Teklif 1.2645'te değil, 1.2650'de olmalıdır; ve sırasıyla 1.2655'te sor.

[Silindi]  
Yedelkin:

Teşekkürler, mantığı anladım. Ancak yine de, "e" noktasına göre, bir stoploss tetiklendiğinde, Teklifin 1.2645'te değil, 1.2650'de olması gerektiği ortaya çıkıyor; ve sırasıyla 1.2655'te sor.

Öyle olabilir, piyasa tarafından bir stop-loss tetiklendiğinde tam olarak ne olduğunu kontrol etmeniz gerekir (veya matris modelini mevcut tüm kapanış olasılıklarını dikkate alarak ayarlamanız gerekir) ....


"e" noktası için (anladığım kadarıyla)

Açılıştan (Ask) sayma durumunda, doğru anladıysam 1.27-50 = 1.2650 olacaktır (fiyat 45 pip geçecek ve poz kapanacaktır). Bu durumda SL'nin Bid 1.2650 ve Ask 1.2655'te çalışması gerektiğini düşünüyorum.

Başka bir şey, eğer Bid'den sayarsak, 1.2695-50 - 1.2645 fiyatını alacağız (matematikle tartışamazsınız). SL'yi Bid'den hesaplarsak 1.27-1.2645 = 55 pip alacağız (anladığım kadarıyla planlarımızın bir parçası değildi).

PS

En azından bu model SL ve TP seviyelerini Açık fiyattan doğru bir şekilde kırmamızı sağlıyor (bence doğru bir şekilde)...

Tabii ki, geliştiricilerin fiyatların gerçekte nasıl hesaplanması gerektiğine dair resmi görüşlerini duymak ilginç olurdu (sadece SL ve TP değil).

 

Soru.


100 dolar - ruble mi yoksa İngiliz Sterlini mi? ;)

 
ortadan kalkacağına söz verilmişti.
 
Jager:

Soru.


100 dolar - ruble mi yoksa İngiliz Sterlini mi? ;)

Bu, milisaniye cinsinden zaman aşımı değeridir. Bu parametre tüm ticaret işlevlerinden zaten kaldırılmıştır.
 

Merhaba, iyi düzenlenmiş örnek için teşekkürler.

Ama sormak zorundayım doğru mu?

EA'da her yeni çubuğun başında bir ticaret fırsatı olup olmadığını kontrol ediyor.

Sınıf işlevi getbuffers () içinde, yalnızca yeni oluşturulmuş olan mevcut çubuk 0'dan başlayarak son 3 çubuk verisini alır ve bu nedenle değer hatalıdır.

void MyExpert::getBuffers()
{
if(CopyBuffer(ADX_handle,0,0,3,ADX_val)<0 || CopyBuffer(ADX_handle,1,0,3,plus_DI)<0
|| CopyBuffer(ADX_handle,2,0,3,minus_DI)<0 || CopyBuffer(MA_handle,0,0, 3,MA_val)<0)

Konum 1'den başlayarak son 3 çubuk gösterge verilerini alması gerekmez mi?

Teşekkürler

 

Harika Makale Samuel

Bu paha biçilmez makale için şimdiden teşekkür ederim,

Yani bu makaleye dayanarak, IsNewBar veya Buy_opened gibi fonksiyonları sınıfa dahil edebilir ve sadece EA'dan çağırabiliriz.

Tekrar teşekkür ederim,

Sizden daha fazla makale görmeyi umuyorum,

Hamed,

 

Lütfen anlamadığım bir şeyi anlamama yardım edin:

EA'nın en başında fonksiyon çağrılır:

  Cexpert.doInit(ADX_Period,MA_Period);
при этом для ее корректного выполнения требуются уже установленные параметры symbol  и period :
//+-----------------------------------------------------------------------+
// SINIFIMIZIN GENEL FONKSIYONLARI 
//+-----------------------------------------------------------------------+
/*
 
 başlatılıyor */
void MyExpert::doInit(int adx_period,int ma_period)
{
   //--- ADX gösterge tanıtıcısını al
   ADX_handle=iADX(symbol,period,adx_period);
  //--- Hareketli Ortalama gösterge tutamacını al
   MA_handle=iMA(symbol,period,ma_period,0,MODE_EMA,PRICE_CLOSE);
однако, заполнение этих параметров конкретными значениями происходит позже, уже после Cexpert.doInit :
//--- başlatma işlevini başlatın
   Cexpert.doInit(ADX_Period,MA_Period);
//--- sınıf nesnemiz için gerekli tüm değişkenleri ayarlama
   Cexpert.setPeriod(_Period);     // periyodu ayarlar
   Cexpert.setSymbol(_Symbol);     // sembolü belirtir (döviz çifti)
   
   Никак не пойму, как может правильно выполниться Cexpert.doInit, если переменной symbol пока не присвоено
значение (или как-то присвоено ?) Застрял тут и дальше никак . Спасибо.