MQL5 dilini sıfırdan kendi kendine öğrenme - sayfa 52

 

Konum döngüsünde sembol ve sihir ile filtreye dikkat edin. Filtre yoksa, ancak tüm sembollerdeki tüm açık pozisyonları takip ediyorsanız, bu kötüdür.

Eh, ilk bakışta, her şey normal görünüyor.

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Andrei Novichkov :

Konum döngüsünde sembol ve sihir ile filtreye dikkat edin. Filtre yoksa, ancak tüm sembollerdeki tüm açık pozisyonları takip ediyorsanız, bu kötüdür.

Eh, ilk bakışta, her şey yolunda görünüyor.

Çok teşekkür ederim Andrey! Magic hakkında her şey açıktır, çünkü bir sembolde, aslında, aynı anda birkaç pozisyon açılabilir, ancak bir karşı soru ortaya çıktı. EA, mevcut sembole açıkça işaret edilmemişse, tüm semboller için aynı anda açık pozisyonlardan geçecek mi? Ve bu, örneğin EURUSD gibi belirli bir döviz çiftine ayarlanmış olmasına rağmen mi? Dürüst olmak gerekirse, bu anı pek anlamıyorum.

Saygılarımla, Vladimir.

 
MrBrooklin :

Çok teşekkür ederim Andrey! Magic hakkında her şey açıktır, çünkü bir sembolde, aslında, aynı anda birkaç pozisyon açılabilir, ancak bir karşı soru ortaya çıktı. EA, mevcut sembole açıkça işaret edilmemişse, tüm semboller için aynı anda açık pozisyonlardan geçecek mi? Ve bu, örneğin EURUSD gibi belirli bir döviz çiftine ayarlanmış olmasına rağmen mi? Dürüst olmak gerekirse, bu anı pek anlamıyorum.

Saygılarımla, Vladimir.


Evet. Tüm semboller için tüm açık pozlar için...
Sürekli açık pozisyonlar.
İşte ders kitabında zaten basit bir trol.

https://book.mql4.com/ru/build/trading
 
MrBrooklin :

Bu nedenle, okuduğum literatüre dayanarak, izleyen durdurma işlevine sahip bir Uzman Danışman oluşturmak için küçük bir algoritma yazdım:

  1. Durma seviyesinin takibi (bakım) üzerindeki çalışmayı otomatikleştirmek için bir Uzman Danışman oluşturuyoruz Kayıp Belirtilen Kâr Al ve Durdur seviyelerine sahip zaten açık bir pozisyon kayıp .
  2. EA'da, iki parametreli bir giriş parametreleri bloğu oluşturuyoruz: "sondaki seviyeyi" ayarlayın ve "sondaki adımı" ayarlayın.
  3. Yeni alıntılar geldiğinde, bunları OnTick() işleviyle işleriz. İzleme, yalnızca geçerli sembol için yeni bir onay işareti geldiğinde çalışır.
  4. Tüm konumların bir numaralandırma döngüsünü oluşturalım ve başlatalım.
  5. Aniden herhangi bir açık pozisyon bulamazsak, döngüye geri döneriz.
  6. Teklifleri güncelleyin.
  7. Açık bir pozisyon varsa, devam edin.
  8. Açık pozisyonun türünü belirleyin: Satın alın ya da sat.
  9. Bir Alış pozisyonu açıksa , mevcut fiyatın açık pozisyona göre nerede olduğunu belirleriz.
  10. Mevcut fiyat, pozisyon açılış fiyatından yüksekse, hangi seviyeye yükseldiğini kontrol ederiz.
  11. Mevcut fiyat, giriş parametrelerinde belirtilen "sondaki seviyeye" ulaştıysa, Durdur'u hareket ettirin. Kayıp Satın alma pozisyonunun açılış fiyatına eşit kayıpsız seviyeye . Aksi takdirde hiçbir şey yapmıyoruz.
  12. Mevcut fiyat "sondaki seviyeyi" "sondaki adıma" eşit bir miktarda aşmışsa, Durdur Satın alma pozisyonunun açılış fiyatı seviyesinden zarar hareketi fiyat, bu pozisyon için belirlenen Kâr Al düzeyine ulaşana kadar "sondaki adıma" eşit bir değerle ve bu şekilde devam eder.
  13. Fiyat tersine döner ve halihazırda taşınmış olan Durdurma seviyesine ulaşırsa Kayıp , daha sonra pozisyon kapatılır.
  14. Bir Satış pozisyonu açıksa , mevcut fiyatın açık pozisyona göre nerede olduğunu belirleriz.
  15. Mevcut fiyat pozisyon açılış fiyatından düşükse hangi seviyeye düştüğünü kontrol ederiz.
  16. Mevcut fiyat, giriş parametrelerinde belirtilen "sondaki seviyeye" ulaştıysa, Durdur'u hareket ettirin. Kayıp Satış pozisyonunun açılış fiyatına eşit kayıpsız seviyeye . Aksi takdirde hiçbir şey yapmıyoruz.
  17. Mevcut fiyat "sondaki seviyeyi" "sondaki adıma" eşit bir miktarda aşmışsa, Durdur Zarar , Satış pozisyonunun açılış fiyatı seviyesinden hareket eder. fiyat , bu pozisyon için belirlenen Kâr Al düzeyine ulaşana kadar "sondaki adıma" eşit bir değerle ve bu şekilde devam eder.
  18. Fiyat tersine döner ve halihazırda taşınmış olan Durdurma seviyesine ulaşırsa Kayıp , daha sonra pozisyon kapatılır.

Lütfen algoritmaya bakın ve hangi anların kaçırıldığını söyleyin.

Saygılarımla, Vladimir.

İyi teori, şimdi pratik yapın. Bunu yapabilirmisin?

 
Aliaksandr Hryshyn :

İyi teori, şimdi pratik yapın. Bunu yapabilirmisin?

Deneyeceğim. Ancak bunun henüz sahip olmadığım tamamen farklı bir bilgi düzeyi gerektirdiğini siz kendiniz anlıyorsunuz.

Saygılarımla, Vladimir.

 
Aleksey Masterov :

Evet. Tüm semboller için tüm açık pozlar için...
Sürekli açık pozisyonlar.
İşte ders kitabında zaten basit bir trol.

https://book.mql4.com/ru/build/trading

Evet Alexey, bu kodu zaten görmüştüm. Include dosyası olarak yapılmıştır. Dürüst olmak gerekirse, birkaç kez incelememe rağmen sembol hakkında hiçbir şey bulamadım. Belki bir şeyleri özlüyorum ya da sadece kötü görünüyorum.

Saygılarımla, Vladimir.

 

Şimdilik, fonksiyonlar hakkında devam edelim.

Daha önce de yazdığım gibi, fonksiyonlar her yerdeler, sevilmeleri ve yazabilmeleri gerekiyor. Fonksiyonlar, küresel sorunları çözmede bizim küçük savaşçılarımızdır. Orduda general olsaydık, ne tür savaşçıları kontrol etmek isterdik? İşte örnek bir liste:

  • Savaşçı, emri açıkça takip etmelidir. Bir piyadenin ortalama entelektüel gelişim seviyesi büyük değildir. Bu nedenle, bu tür savaşçılar için açık ve basit hedefler belirlemek daha iyidir: "sığınağı al", "dili al", "köprüyü benimseyin".
  • Görev zorsa, onu uygulamak için süper akıllı bir dövüşçü aramaya gerek yoktur. Görevi birkaç alt göreve bölmek ve daha aptal ama daha verimli olan iki veya üç savaşçıyı almak daha iyidir. Bırakın herkes kendi alt problemini soru sormadan çözsün, hatta daha iyisi, fikri ve problemi bir bütün olarak bilmesinler. O zaman biri yakalanırsa - bu korkutucu değil, tüm plan ortaya çıkmayacak.
  • Bir dövüşçü, çevre koşullarından bağımsız olarak bir emri yerine getirmelidir: kar, yağmur, Paris ve kadınlar - böyle bir ortam emrin uygulanmasını etkilemiyorsa, bu koşullar ve dış ortam göz ardı edilmelidir.
  • Bazen görevler zordur. Onları çözmek için çok sayıda dövüşçüye ihtiyacınız var. Her dövüşçü için bir general koyamazsınız. Bunun yerine, daha zeki bir dövüşçüyü seçmeli ve onu birkaç dövüşçünün başına geçirmelisiniz. Bu grup, sırayla, askerler eşliğinde aynı kişiyle birleşir ve onlara daha yüksek bir lider atar.

Ama konuyu dağıtıyoruz, tekrar fonksiyonlara geçelim.

Bir işlev genel olarak çok fazla görevi çözüyorsa, benzetmeyi takip ederek, bir şeyler ters giderse tüm girişimi yok edebilecek çok akıllı bir savaşçıdır. Böyle bir fonksiyonun ne işe yaradığını sorarsanız cevap uzun olabilir. Bu işlevin sonucu aniden doğru olmaktan çıkarsa, hataya neyin neden olduğunu bulmak son derece zor olacaktır (çünkü çok sayıda görev, çok sayıda kod, çok sayıda alt prosedür çağrısı ve hatanın tam olarak nerede olduğunu anlamak zor).

İşlev Pazartesi, Çarşamba ve Pazar günleri ve "ruh hali" ne bağlı olarak diğer günlerde doğru sonucu hesaplarsa - böyle bir işleve güvenebilir miyiz? Diyelim ki OrderSend sistem fonksiyonunun sadece Perşembe günleri pozisyon açacağını ve 13 değerinde belirli bir sihirli parametre tanımlandığında yukarıdakilerin hiç de saçma veya fantezi olmadığını düşünün. Bu tür davranışlar bir parmak tıklamasıyla düzenlenebilir, işlevi dış ortamdaki belirli parametrelere bağımlı kılmak yeterlidir.

Bir fonksiyon diyelim:

 double sum( double a, double b)
{
   return a+b;
}

Dış ortamdan bağımsız olarak her zaman iki değerin toplamını döndürür. Bu, bu işlevi başka bir komut dosyasına veya Uzman Danışmana kopyala-yapıştır yapsak bile, onda da iyi çalışacağı anlamına gelir. Böyle bir işlev bir kez yazılabilir ve daha sonra aptalca kopyalayarak birçok programınızda kullanılabilir. Çalışmasının hiçbir şeye bağlı olmadığını bilerek, sonucuna her zaman güvenebiliriz. Sonuçları çevrelerine bağlı olmayan bu tür işlevlere yan etkisi olmayan işlevler veya saf işlevler denir. Saf işlevler yazmaya çalışırsanız, çok yakında bunlardan oldukça fazla olacaktır. Bu, bir dosyada birleştirilebilecekleri ve yeni projelerinize dahil edilebilecekleri anlamına gelir. Buna kodun yeniden kullanımı denir . İki kere iş yapmıyoruz. Bunun yerine, bildiğimiz ve güvenilirliği bir kereden fazla test edilmiş, önceden yazılmış fonksiyonları kullanıyoruz.

Şimdi anti örneğe bakalım:

 double c = 0.0 ;
double sum( double a, double b)
{
   return a+b+c;
}

Sonuç aynı gibi görünüyor çünkü c her zaman sıfıra eşittir. Yoksa her zaman değil mi? Ama ya birisi bir yerde c'yi değiştirirse? Sonra ne? Ve eğer birisi bir yerde c harici değişkenini kullanıyorsa, ancak kendi amaçları için ve farklı tipte bir c değişkenine sahipse, diyelim ki string? Bu iki işlevin ikisini birden birleştirmek artık mümkün değildir (derleyici aynı ada sahip iki değişken bildirmenize izin vermez). Ortak bağımlılıklarıyla başa çıkmak da zordur. Bununla ne yapılacağı hiç belli değil. Örneğin, bu tür işlevlerin birlikte çalışmasını sağlamak için hala güvenilir ve basit bir yol bilmiyorum.

Başka bir fonksiyon olmasa ve sadece bir fonksiyon harici değişkeni okusa bile, onu başka bir yere kopyalamak o kadar kolay olmaz. Hem bu işlevi hem de bağımlılığını kopyalamanız gerekir. Bu işlevleri paylaşılan bir dosyaya kopyalarsak ne olur? Orada bu fonksiyonlar 50, 100 adet yazılmıştır. Ve her biri kendisi ile birlikte bir grup bağımlı değişkenini kopyalar. İlgili değişkenlerin karışık bir karmaşası ortaya çıkıyor, hangi fonksiyonlarla açık değil. Ve neden tüm bunlar? Hangi sorunları çözüyor? Çoğu durumda onlarsız yapabileceğiniz halde neden gereksiz bağımlılıklar yaratasınız ki?

Fonksiyonların başka bir şaşırtıcı özelliği var. Fonksiyonlar kendi kendini tanımlar. Onlar. diyagram çizmeye gerek yok, sadece iyi isimler seçin ve genel algoritmayı fonksiyonlara ayırın. Bir örnek verelim:

 void OnTick ()
{
   if (SelectFirstPendingOrder( ORDER_TYPE_BUY ))
       CancelSelectPendingOrder();
}

Bu kodun ne işe yaradığını bilmiyorum çünkü fonksiyonlar yazılmamış bile. Ama eğer okursam, büyük ihtimalle, ORDER_TYPE_BUY yönü ile bekleyen ilk <gotcha> emrinin başarılı bir şekilde seçilmesi durumunda iptal edileceği anlamına gelirdi (birinci fonksiyon seçer, ikincisi iptal eder). Kod her onay işaretini çalıştıracağından, bekleyen emirlerin sayısı ne olursa olsun, her biri er ya da geç iptal edilecektir. Ayrıca, bekleyen bir satın alma emri verme girişiminin durdurulacağı anlamına gelir - sipariş hemen kaldırılacaktır. Bu durumda satış emirleri sorunsuz olarak verilecektir.

Sadece iki satır kod ve iki fonksiyon. Ve algoritmanın önemsiz ve en önemlisi güvenilir olduğu ortaya çıktı.

MCL'ye uygulandığı gibi, saf fonksiyonlar hakkında biraz daha söylenmelidir. Bu bir uygulama dili olduğundan, terminalden sağlanan verilere güvenmeden herhangi bir şey yazmak zordur. Sonunda, ana görev şudur: ticaret ortamıyla düzgün bir şekilde etkileşim kurmak. Resmi olarak, herhangi bir ticaret ortamı değişkendir: fiyatlar değişir, emir sayısı, bakiye vb. Bu nedenle, böyle değişken bir ticaret ortamıyla etkileşime giren herhangi bir işlev saf değildir. Çünkü dış ticaret ortamı da sürekli değişen bir tür küresel değişken olarak alınabilir. Ama OrdersTotal() yazdığımızda bu fonksiyonun her zaman aynı değeri döndürmesini beklemiyoruz. Bunun yerine, doğal olarak değişecek olan bekleyen siparişlerin sayısını döndürmesini bekliyoruz. Bu nedenle, MQL ile ilgili olarak, OrdersTotal() gibi harici API fonksiyonlarını çağırsalar bile fonksiyonları temiz ve yeniden kullanılabilir olarak kabul edeceğiz. Bu bizim makul hoşgörümüz olacak.

 
Vasiliy Sokolov :

Fonksiyonlar hakkında devam ederken ...

Vasily, sadece benimle değil, aynı zamanda bu konuyu okuyan veya okuyacak olan acemi programcılarla da paylaştığın paha biçilmez bilgi için çok teşekkür ederim!

Aynı büyük saygıyla Vladimir.

 

MQL5 programlama dilini öğrenmeye devam ediyorum. Şimdiye kadar, konunun katılımcılarından, Trailing_Stop danışmanının kodunu yazmak için algoritma hakkında ciddi bir yorum olmadı (sembol ve Magic hakkında hatırlıyorum, algoritmaya daha sonra ekleyeceğim!), Girişi oluşturdum danışmanın parametrelerini ve açık pozisyonlar üzerinde yinelemeye başlayan döngünün kodunu yazdı.

Danışmanı başlatırken, bir sorun bulundu - ticaret terminalinin "Uzmanlar" sekmesinde, her işarette , ticaret terminalinin yalnızca bir grafiği olmasına rağmen aynı anda 2 aynı "Döngü başladı" mesajı görüntüleniyor EURUSD döviz çifti ve üzerinde sadece bir pozisyon açık . Üstelik bu mesajların çıkış süresi tamamen aynı.

Gece yarısına kadar savaştı ama kazanamadı. Sorunun ne olduğunu anlayamıyorum.


EA kodu İngilizce yazılmıştır ve kodun yorumları, materyalin özümsenmesini kolaylaştırmak için Rusça'dır. Bu Expert Advisor'da, daha önce söz verdiğim gibi, bir programlama okulunun 1. sınıf öğrencisinin erişebileceği bir sunumda her şeyi açıklamaya çalıştım.

Saygılarımla, Vladimir.

 //+------------------------------------------------------------------+
//|                                                Trailing_Stop.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"

input ushort TrailingLevel= 100 ; //Уровень трейлинга (для включения)
input ushort TrailingStep= 10 ;   //Шаг трейлинга (для перемещения)
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   /* Для цикла for создаем локальную переменную i и присваиваем ей значение "торговая функция PositionsTotal",
      которая возвращает нам количество открытых позиций*/
   int i= PositionsTotal ();
   /* Разберемся, что такое оператор for.
      Оператор for состоит из трех Выражений и выполняемого Оператора:
      for(Выражение_1; Выражение_2; Выражение_3)
         Оператор;
      Выражение_1 описывает инициализацию цикла. За инициализацию цикла будет отвечать "Торговая функция PositionsTotal".
      Выражение_2 проверяет условия завершения цикла. Если оно истинно, то выполняется Оператор в теле цикла for.
      Все повторяется до тех пор, пока Выражение_2 не станет ложным. Если оно ложно, цикл заканчивается
      и управление передается следующему оператору.
      Выражение_З вычисляется после каждой итерации (т.е. после каждого повторения действия).
   */
   for (i; i>= 0 ; i--) //запускаем цикл перебора открытых позиций (i) от максимума до нуля (i>=0) с шагом минус 1 (i--)
       Print ( "Запущен цикл" );
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---

  }
//+------------------------------------------------------------------+
 
MrBrooklin :


i açık pozisyonların sayısına eşittir, o kadar çok döngü baskı ile olacak

 Print ( "Запущен цикл" );
"=" oturum açmayı kaldırmanız gerekiyor
   for (i; i>= 0 ; i--)
açık pozisyon sayısı 0 iken neden döngüden geçmeniz gerekiyor. bu sıfır arama ikinci baskıydı