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

 
MrBrooklin :

Gelecekte, kendi kendine çalışma planına göre, görev, komut dosyasında aşamalı bir değişiklik yapmaktır, yani:

  1. Zarar Durdur ve Kâr Al ekleyin;
  2. sondaki ekle;
  3. maksimum risk ekleyin;
  4. bekleyen siparişlerin seçimini genişletin.
Saygılarımla, Vladimir.
Boşuna, elbette, bir ders kitabından öğrenme tavsiyesine uymadınız. Burada örneğin, sıraların, emirlerin vb. nasıl yerleştirileceğini öğreniyorsunuz, ancak yine de bir strateji yazamayacaksınız çünkü teorik bir temel yok. Tüm bu satırlar ve komut dosyaları, programlamanın ana şeylerini anlamanıza yardımcı olmayacak ve onlarsız çok ileri gidemezsiniz. Sadece ilk 4 ay çalıştım, bir şeyler yazmaya bile çalışmadım. Tabii ki, sizin gibi küstah olabilirdi, ancak bu tür bilgilerin kalitesi yüksek değil - çoğu zaman ilköğretimde gelecekte doldurulması gereken boşluklar vardır ...
 
Реter Konow :
Boşuna, elbette, bir ders kitabından öğrenme tavsiyesine uymadınız. Burada örneğin, sıraların, emirlerin vb. nasıl yerleştirileceğini öğreniyorsunuz, ancak yine de bir strateji yazamayacaksınız çünkü teorik bir temel yok. Tüm bu satırlar ve komut dosyaları, programlamanın ana şeylerini anlamanıza yardımcı olmayacak ve onlarsız çok ileri gidemezsiniz. İlk 4 ay sadece çalıştım, bir şeyler yazmaya bile çalışmadım. Elbette sizin gibi küstahça olabilirdi ama bu bilginin kalitesi düşük. Oldukça sık olarak, temel düzeyde gelecekte doldurulması gereken boşluklar vardır ...

Selam Peter! Ders kitabını gerektiği gibi çalışırım, yani. Bilgide bir boşluk gördüğümde. Şimdi, şimdiden kısa bir ara vermem ve ders kitabıyla daha yakından çalışmam gerektiğini hissediyorum. Forum katılımcılarının tüm tavsiyelerini not aldım ve onlara uymaya çalıştım. Bu arada, bu kadar kısa sürede sadece MQL5 Reference kullanarak en azından kendi başıma bir şeyler yazabildiğime şaşırdım.

Saygılarımla, Vladimir.

 
MrBrooklin :

Herkese iyi akşamlar ve iyi bir ruh hali!

Yeni bir komut dosyası New6.mq5 gönderiyorum, bu, mevcut grafikte bir BuyStop ve SellStop bekleyen emrini bir kerede sabit bir lot büyüklüğü ile mevcut fiyattan belirli bir mesafede yerleştirmeye yardımcı olur. Bu senaryoda, daha önce söz verdiğim gibi, bir programlama okulunun 1. sınıf öğrencisi için erişilebilir bir sunumda her şeyi boyamaya çalıştım.

Senaryoyu yazarken sadece MQL5 Reference'dan alınan bilgileri kullandım!

Saygılarımla, Vladimir.

Örnek güzel. Başlangıç noktası olarak kullanmanızı öneririm. Temel.

BayBrooklin :

Gelecekte, kendi kendine çalışma planına göre, görev, komut dosyasında aşamalı bir değişiklik yapmaktır, yani:

  1. Zarar Durdur ve Kâr Al ekleyin;
  2. sondaki ekle;
  3. maksimum risk ekleyin;
  4. bekleyen siparişlerin seçimini genişletin.
Saygılarımla, Vladimir.

Hayır hayır. Henüz yeni işlevler eklemeyin. Şimdi mevcut mantığı geliştirin. Paralel olarak, betiğin uygulanmasındaki sorunlardan kurtulun (şimdi zaten görünüyorlar). Eğer ilgileniyorsanız tam olarak neyi yeniden yazacağınızı size söyleyeceğim.

 
Vasiliy Sokolov :

Örnek güzel. Başlangıç noktası olarak kullanmanızı öneririm. Temel.

Hayır hayır. Henüz yeni işlevler eklemeyin. Şimdi mevcut mantığı geliştirin. Paralel olarak, betiğin uygulanmasındaki sorunlardan kurtulun (şimdi zaten görünüyorlar). Eğer ilgileniyorsanız tam olarak neyi yeniden yazacağınızı size söyleyeceğim.

Merhaba Vasili! Tabii ki, neyin yeniden yazılması gerektiğini söyle, çok ilgileniyorum!

Saygılarımla, Vladimir.

 
MrBrooklin :

Merhaba Vasili! Tabii ki, neyin yeniden yazılması gerektiğini söyle, çok ilgileniyorum!

Saygılarımla, Vladimir.

Programcıların iki sorunu vardır: derleyici hataları ve mimari sorunlar. Başlangıç seviyesindeyken, derleyiciyle savaşmaya odaklanırsınız ve nihai hedefiniz doğru çalışan bir programdır. Bununla birlikte, yeni başlayanlar için program çok hızlı bir şekilde, yazarın yakında çözemediği sözde spagetti koduna dönüşür. Bu nedenle, artık derleyiciye ve son betiğin doğruluğuna değil, mimari konulara odaklanmanızı öneririm. Piyano çalmayı öğrenmek gibidir: ilk başta parmaklarınızı doğru tutmayı ve enstrümanlara doğru oturmayı öğretirler, hiç kimse Bach çalmak için yeni başlayanlara ihtiyaç duymaz.

 //+------------------------------------------------------------------+
//|                                                         New6.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"
//---
#property script_show_inputs
//---

#define       orderType1 "BUY_STOP"    //Тип ордера UP
#define       orderType2 "SELL_STOP"    //Тип ордера DOWN
input int     Distance= 100 ;           //Отступ отложенного ордера от текущей цены
input double Lots= 0.01 ;               //Фиксированный размер лота
input long    Pending_magic= 86513 ;     //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()                                                    
  {
   MqlTradeRequest request={ 0 };
   MqlTradeResult result={ 0 };
   request.action= TRADE_ACTION_PENDING ;
   request.symbol= Symbol ();
   request.volume=Lots;
   request.deviation= 2 ;
   request.magic=Pending_magic;
   double price;
   double point= SymbolInfoDouble ( _Symbol , SYMBOL_POINT );
   int digits=( int ) SymbolInfoInteger ( _Symbol , SYMBOL_DIGITS );
   if (orderType1== "BUY_STOP" )
     {
      request.type= ORDER_TYPE_BUY_STOP ;
      price= SymbolInfoDouble ( Symbol (), SYMBOL_ASK )+Distance*point;
      request.price= NormalizeDouble (price,digits);
     }
   if (! OrderSend (request,result))
       PrintFormat ( "OrderSend error %d" , GetLastError ());
   if (orderType2== "SELL_STOP" )
     {
      request.type= ORDER_TYPE_SELL_STOP ; 
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID )-Distance*point;
      request.price= NormalizeDouble (price,digits);
     }
   if (! OrderSend (request,result))
       PrintFormat ( "OrderSend error %d" , GetLastError ());
   PrintFormat ( "retcode=%u  deal=%I64u  order=%I64u" ,result.retcode,result.deal,result.order);
  }

Komut dosyanızın davranışı iki parametre grubu tarafından belirlenir: ilki, bir makro biçiminde statik olarak ayarlanır. İkincisi , komut dosyası grafiğe yüklenirken kullanıcı tarafından ayarlanır. Artık kullanıcı, bu betiği yeniden derlemeden verilecek siparişin türünü seçemez. Bu kötü. Bu nedenle, ek bir parametre lehine bu makroları terk etmek daha iyidir:

 enum ENUM_ORDER_TYPE_FLAGS
{
    BuyStop = 1 ,                 // Только BuyStop
    SellStop = 2 ,               // Только SellStop
    BuyStopAndSellStop = 4        // BuyStop и SellStop
};

input ENUM_ORDER_TYPE_FLAGS TypeSendOrders = BuyStop;   // Тип Выставляемого ордера(ов)

Buna göre, kullanıcı için bir seçim parametresi olarak uyguladığımız yeni bir enum tanımladık.

 
Vasiliy Sokolov :

Programcıların iki sorunu vardır: derleyici hataları ve mimari sorunlar. Başlangıç seviyesindeyken, derleyiciyle savaşmaya odaklanırsınız ve nihai hedefiniz doğru çalışan bir programdır. Bununla birlikte, yeni başlayanlar için program çok hızlı bir şekilde, yazarın yakında çözemediği sözde spagetti koduna dönüşür. Bu nedenle, artık derleyiciye ve son betiğin doğruluğuna değil, mimari konulara odaklanmanızı öneririm. Piyano çalmayı öğrenmek gibidir: ilk başta parmaklarınızı doğru tutmayı ve enstrümanlara doğru oturmayı öğretirler, hiç kimse Bach çalmak için yeni başlayanlara ihtiyaç duymaz.

Komut dosyanızın davranışı iki parametre grubu tarafından belirlenir: ilki, bir makro biçiminde statik olarak ayarlanır. İkincisi , komut dosyası grafiğe yüklenirken kullanıcı tarafından ayarlanır. Artık kullanıcı, bu betiği yeniden derlemeden verilecek siparişin türünü seçemez. Bu kötü. Bu nedenle, ek bir parametre lehine bu makroları terk etmek daha iyidir:

Buna göre, kullanıcı için bir seçim parametresi olarak uyguladığımız yeni bir enum tanımladık.

Mükemmel, aslında, komut dosyasının adım adım değiştirilmesinin 4. paragrafında yazılanları, yani bekleyen siparişlerin seçimini genişletmeyi önerdiniz.

Teşekkür ederim!

Saygılarımla, Vladimir.

 

Kodunuzdaki bir sonraki sorun, uzun bir prosedür sayfasına dönüşmesidir. Tüm yeni başlayanlar bunu yapar. Ve bu, uzun yıllar onlarla birlikte kalan bir problemdir. Bu komut dosyası gibi temel bilgilerden başlayarak algoritmanızı parçalara ayırmayı öğrenin. Bunu yapmanın iki yolu vardır: işlevler ve sınıflar aracılığıyla. Sınıf kavramını ilk başta kavramak çok zor, bu yüzden fonksiyonlarla çalışmaya odaklanmanızı öneririm. Özelliklerin önemini düşünün:

  • MQL'de yazılan tüm kodlar (ve bunların tümü örneğin CodeBase'deki komut dosyaları, göstergeler ve Uzman Danışmanlardır) ya sistem işlevlerinin içinde ya da kullanıcı işlevlerinin içindedir.
  • Herhangi bir MQL kodu, düzinelerce yerleşik MQL işlevini çağırır. MetaTrader ve ticaret ortamı ile tüm etkileşim, bir veya başka bir sistem işlevinin çağrısı yoluyla gerçekleşir.
  • Harici parametrelere bağlı olmayan herhangi bir fonksiyon her zaman aynı sonucu verir. Böyle bir işlev, bir komut dosyasından/göstergeden/uzmandan diğerine kopyalanabilir ve doğru şekilde çalışacaktır. Rastgele bir prosedürel kod parçasını kopyalamak, aksine, büyük olasılıkla çalışmayacaktır.
  • Yararlı iş yapan herhangi bir özel işlevi yazabilirsiniz. Böylece MQL'nin standart işlevselliğini ihtiyacınız olan şekilde genişletecektir. Örneğin, şöyle düşünüyorsunuz: "MQL'nin böyle bir işlevi olsa harika olurdu..." - Peki o zaman neden kendiniz yazmıyorsunuz?
 
Vasiliy Sokolov :

Kodunuzdaki bir sonraki sorun, uzun bir prosedür sayfasına dönüşmesidir. Tüm yeni başlayanlar bunu yapar. Ve bu uzun yıllar onlarla birlikte kalan bir sorun. Bu komut dosyası gibi temel bilgilerden başlayarak algoritmanızı parçalara ayırmayı öğrenin. Bunu yapmanın iki yolu vardır: işlevler ve sınıflar aracılığıyla. Sınıf kavramını ilk başta kavramak çok zor, bu yüzden fonksiyonlarla çalışmaya odaklanmanızı öneririm. Özelliklerin önemini düşünün:

  • MQL'de yazılan tüm kodlar (ve bunların tümü örneğin CodeBase'deki komut dosyaları, göstergeler ve Uzman Danışmanlardır) ya sistem işlevlerinin içinde ya da kullanıcı işlevlerinin içindedir.
  • Herhangi bir MQL kodu, düzinelerce yerleşik MQL işlevini çağırır. MetaTrader ve ticaret ortamı ile tüm etkileşim, bir veya başka bir sistem işlevinin çağrısı yoluyla gerçekleşir.
  • Harici parametrelere bağlı olmayan herhangi bir fonksiyon her zaman aynı sonucu verir. Böyle bir işlev, bir komut dosyasından/göstergeden/uzmandan diğerine kopyalanabilir ve doğru şekilde çalışacaktır. Rastgele bir prosedürel kod parçasını kopyalamak, aksine, büyük olasılıkla çalışmayacaktır.
  • Yararlı iş yapan herhangi bir özel işlevi yazabilirsiniz. Böylece MQL'nin standart işlevselliğini ihtiyacınız olan şekilde genişletecektir. Örneğin, şöyle düşünüyorsunuz: "MQL'nin böyle bir işlevi olsa harika olurdu..." - Peki o zaman neden kendiniz yazmıyorsunuz?

Böyle ayrıntılı bir tavsiye için teşekkür ederim Vasily. Kesinlikle not alacağım ve bana tavsiye ettiğiniz her şeyi anlamaya çalışacağım.

Saygılarımla, Vladimir.

 
Vasiliy Sokolov :

Kodunuzdaki bir sonraki sorun, uzun bir prosedür sayfasına dönüşmesidir. Tüm yeni başlayanlar bunu yapar. Ve bu, uzun yıllar onlarla birlikte kalan bir problemdir. Bu komut dosyası gibi temel bilgilerden başlayarak algoritmanızı parçalara ayırmayı öğrenin. Bunu yapmanın iki yolu vardır: işlevler ve sınıflar aracılığıyla. Sınıf kavramını ilk başta kavramak çok zor, bu yüzden fonksiyonlarla çalışmaya odaklanmanızı öneririm. Özelliklerin önemini düşünün:

  • MQL'de yazılan tüm kodlar (ve bunların tümü örneğin CodeBase'deki komut dosyaları, göstergeler ve Uzman Danışmanlardır) ya sistem işlevlerinin içinde ya da kullanıcı işlevlerinin içindedir.
  • Herhangi bir MQL kodu, düzinelerce yerleşik MQL işlevini çağırır. MetaTrader ve ticaret ortamı ile tüm etkileşim, bir veya başka bir sistem işlevinin çağrısı yoluyla gerçekleşir.
  • Harici parametrelere bağlı olmayan herhangi bir fonksiyon her zaman aynı sonucu verir. Böyle bir işlev, bir komut dosyasından/göstergeden/uzmandan diğerine kopyalanabilir ve doğru şekilde çalışacaktır. Rastgele bir prosedürel kod parçasını kopyalamak, aksine, büyük olasılıkla çalışmayacaktır.
  • Yararlı iş yapan herhangi bir özel işlevi yazabilirsiniz. Böylece MQL'nin standart işlevselliğini ihtiyacınız olan şekilde genişletecektir. Örneğin, şöyle düşünüyorsunuz: "MQL'nin böyle bir işlevi olsa harika olurdu..." - Peki o zaman neden kendiniz yazmıyorsunuz?
Vasily, bir kişi henüz dizilerde ustalaşmadı. Bu tür dersleri dinlemek için henüz çok erken.)
 
Реter Konow :
Vasily, bir kişi henüz dizilerde ustalaşmadı. Bu tür dersleri dinlemek için henüz çok erken.)

Peter, seninki de dahil tüm yapıcı tavsiyeler benim için önemli!

Saygılarımla, Vladimir.

Neden: