Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 238

 

Kaynak kodunda makine tarafından oluşturulmuş bir kod parçası kullanacağımı hiç düşünmemiştim. Özellikle de performans için arşivlenecek bir yerde.


Aşağıda üretilen kod yer almaktadır.

switch (this.Flag)
{
case 0:
  return(false);
case 1:
  return(Tick.bid >= this.bid.Max);
case 2:
  return(Tick.ask <= this.ask.Min);
case 3:
  return((Tick.bid >= this.bid.Max) || (Tick.ask <= this.ask.Min));
case 4:
  return(Tick.bid <= this.bid.Min);
case 5:
  return((Tick.bid >= this.bid.Max) || (Tick.bid <= this.bid.Min));
case 6:
  return((Tick.ask <= this.ask.Min) || (Tick.bid <= this.bid.Min));
case 7:
  return((Tick.bid >= this.bid.Max) || (Tick.ask <= this.ask.Min) || (Tick.bid <= this.bid.Min));
case 8:
  return(Tick.ask >= this.ask.Max);
case 9:
  return((Tick.bid >= this.bid.Max) || (Tick.ask >= this.ask.Max));
case 10:
  return((Tick.ask <= this.ask.Min) || (Tick.ask >= this.ask.Max));
case 11:
  return((Tick.bid >= this.bid.Max) || (Tick.ask <= this.ask.Min) || (Tick.ask >= this.ask.Max));
case 12:
  return((Tick.bid <= this.bid.Min) || (Tick.ask >= this.ask.Max));
case 13:
  return((Tick.bid >= this.bid.Max) || (Tick.bid <= this.bid.Min) || (Tick.ask >= this.ask.Max));
case 14:
  return((Tick.ask <= this.ask.Min) || (Tick.bid <= this.bid.Min) || (Tick.ask >= this.ask.Max));
case 15:
  return((Tick.bid >= this.bid.Max) || (Tick.ask <= this.ask.Min) || (Tick.bid <= this.bid.Min) || (Tick.ask >= this.ask.Max));
}

Üretim için çok daha kısa bir komut dosyası yazıldı. Hipotezleri hızlı bir şekilde test etmek ve insan hatalarından kaçınmak için uygun olabilir.

 
fxsaber #:

Kaynak kodunda makine tarafından oluşturulmuş bir kod parçası kullanacağımı hiç düşünmemiştim. Özellikle de performans için arşivsel öneme sahip bir yerde.


Aşağıda oluşturulan kod yer almaktadır.

Üretim için çok daha kısa bir komut dosyası yazılmıştır. Bu, hipotezleri hızlı bir şekilde test etmek ve insan hatasını önlemek için yararlı olabilir.

Dikkatli olun, aynı ChatGPT hem sözdiziminde hem de mantıkta birçok hata yapar, bu yüzden her şeyi iki kez kontrol etmeniz gerekir.

Ancak gerçekten iyi bir vericidir, fikirlerinizi kodla ifade etmenize yardımcı olur.

 
fxsaber #:

Aşağıda oluşturulan kod yer almaktadır.

Üretim için çok daha kısa bir komut dosyası yazılmıştır. Bu, hipotezleri hızlı bir şekilde test etmek ve insan hatasını önlemek için yararlı olabilir.

Yeterli arka plan bilgisi yok: yeni kod eski koddan daha hızlı oldu mu olmadı mı?

Eğer değilse, neden eski anlaşılabilir kod yeni anlaşılmaz kodla değiştirildi?

Evet ise, MQL derleyicisi bunun için sohbetten çok daha fazla imkana sahipken neden performans açısından en uygun kodu bir kerede üretemedi?

 
Aleksey Vyazmikin #:

Dikkatli olun, aynı ChatGPT hem sözdiziminde hem de mantıkta birçok hata yapar, bu nedenle her şeyi iki kez kontrol etmeniz gerekir.

Ama gerçekten iyi bir satıcı, fikirleri kodla ifade etmeye yardımcı oluyor.

Komut dosyası oluşturuluyor.

// Генерация switch-кода.
string GetString( const int Num )
{
  static const string Condition[] = {"(Tick.bid >= this.bid.Max)", "(Tick.ask <= this.ask.Min)",
                                     "(Tick.bid <= this.bid.Min)", "(Tick.ask >= this.ask.Max)"};
  string Str = NULL;

  for (int i = 0; i < ArraySize(Condition); i++)
    if ((bool)(Num & (1 << i)))
      Str += ((Str == NULL) ? NULL : " || ") + Condition[i];

  return(Str);
}

void OnStart()
{
  for (int i = 0; i < 16; i++)
    Print("case " + (string)i + ":\n  return(" + GetString(i) + ");");
}
 
A100 #:

Yeterli arka plan bilgisi yok: yeni kod eski koddan daha hızlı hale geldi mi gelmedi mi?

Yeni kod daha hızlı.

Evet ise, MQL derleyicisi bunun için sohbetten çok daha fazla olasılığa sahipken neden performans açısından en uygun kodu bir kerede üretemedi?

Bu algoritmik optimizasyondur, derleyici optimizasyonu değil.

 
fxsaber #:

Yeni olan daha hızlı.

Bu algoritmik optimizasyondur, derleyici optimizasyonu değil.

Ne kadar daha hızlı? %1,5 mu yoksa 1,5 kat mı? Ve sanki daha hızlıymış gibi mi? Ya da doğru ölçümlere dayanarak mı?

Yani ona bir kod değil, bir algoritma mı verdiniz?

 
A100 #:

Ne kadar daha hızlı? Yüzde 1,5 oranında mı yoksa 1,5 kat mı? Ve hissederek mi yoksa belirli ölçümlerle mi?

Yani ona bir kod değil, bir algoritma mı verdiniz?

Sanal kaynak kodu bunu kullanır. Her tikte dört kontrol yapmanız gerekir.

return((Tick.bid >= this.bid.Max) || (Tick.ask <= this.ask.Min) || (Tick.bid <= this.bid.Min) || (Tick.ask >= this.ask.Max));


Ancak bazı durumlarda (switch 0-15) daha az kontrolle yapabilirsiniz: 0-4. Bu TS'ye bağlıdır.


Örneğin, TS pozisyonları yalnızca piyasa emirleriyle açıp kapatıyorsa ve SL/TP kullanmıyorsa, tek bir kontrol yapmanıza gerek yoktur.

Ancak tüm emir türleri aynı anda kullanılıyorsa, dört kontrolü de yapmanız gerekir: hızlanma olmayacaktır.


Bu nedenle belirli bir TS'yi ele almalı ve bunun için yapılan ölçümlerin sonuçlarına bakmalısınız. Farklı TS'ler farklı hızlanma sonuçlarına sahiptir.


Vakaları (vaka sayısı) daha fazla varyanta sınıflandırmak mümkündü. Açıkçası ben bunu yapamadım.

 

MQL5'te, StringReserve fonksiyonu vardır, bu fonksiyonu kullanarak teorik olarak dizgimiz için bellek yeniden tahsislerinin sayısını azaltabiliriz: bir kerede yeterince büyük bir tampon ayırırız ve sonra içinde çalışırız.

Ancak, uygulamada görüldüğü gibi, bu dizeye daha sonra bir değer atanması, arabelleğinin boyutunu değiştirir (yani, görünüşe göre, bellek yeniden tahsisi gerçekleşir).

Sonuç olarak, yerine

string str;
str.Reserve(8192);
str="test";

kullanmak mantıklıdır

string str;
str.Reserve(8192);
StringSetLength(str,0);  // или str.SetLen(0); - в документации есть, но у меня в 4073 не поддерживается
str+="test";
 
JRandomTrader #:

kullanmak mantıklıdır

Aynen öyle. Bu mekanizma dize tamamlamada harika çalışır. Örneğin, büyük HTML raporları oluştururken.

 

Bir sembolün veri içerip içermediğini nasıl öğrenebilirim, böylece içermiyorsa [Piyasa İzleme] penceresinde bırakmam?

Bir döngü içinde böyle bir kontrol kullanıyorum:

ulong first_server_date = (ulong)SeriesInfoInteger(symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE);

if(first_server_date == NULL) {
  SymbolSelect(symbol, false);
  continue;
}

Ancak bundan sonra, Uzman Danışman grafik üzerindeyken sembolleri [Piyasa İzleme] penceresinden tek tek veya hepsini birden manuel olarak kaldıramıyorum:


Neden: