MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 624

 
Galim_V :

Bu şekilde değiştirilecek

kodda çok hata var

 if ( OrderModify ( OrderTicket (), OrderOpenPrice (),StopLoss_SELL, 0 , 0 ,Green))

fiyatları normalleştirmeniz gerekiyor, o zaman işe yarayacak, ardından "yanlış fiyatlar" vermek için bir sunucu hatası olacak, StopLoss_SELL'i daha yüksek normalleştirmek istenir

ve büyük olasılıkla zararı durdurmanın sıfıra eşit olup olmadığını kontrol etmeniz gerekir ve eşitlik için gerçek sayıları karşılaştırmak istenmez, > veya < için gerçek sayıları karşılaştırmaya çalışmanız gerekir.

 
Jessy111 :

Göstergedeki hatayı düzeltmeye yardımcı olur, günün en yüksek ve en düşük noktalarını saatin son mumundayken çekmez.

Burada bir gösterge çizdim, kodunuzdaki stringlerle çalışmayı sevmedim, daha kolay yazardım, işte bir örnek. Sunucu zaman farkını da hesaba katacak bir göreviniz olsa da,

 #property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com/ru/users/igorm"
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots    2
//--- plot line1
#property indicator_label1    "HighDay"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

#property indicator_label2    "LowDay"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrBlue
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1

static int LastDay=- 1 ,daystart;
static double dhigh,dlow;
//--- indicator buffers
double          H[],L[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,H);
   SetIndexBuffer ( 1 ,L);
   IndicatorDigits ( _Digits );
   LastDay=- 1 ;
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   int i,j,limit;
   if (prev_calculated== 0 )
     {
      limit=rates_total- 1 ;
      LastDay=- 1 ;
      daystart=limit;
      dhigh = high[limit];
      dlow  = low[limit];
// расчет истории      
       for (i=limit; i>= 0 && ! IsStopped (); i--)
        {
         if (LastDay!= TimeDay (time[i]))
           {
            LastDay= TimeDay (time[i]);
            j=daystart;
            daystart=i;
             while (j>daystart)
              {
               H[j]=dhigh;
               L[j]=dlow;
               j--;
              }
            dhigh = high[i];
            dlow  = low[i];
           }
         dhigh= fmax (dhigh,high[i]);
         dlow =   fmin (dlow,low[i]);
        }
// рисуем текущий день при первом запуске
      i=daystart;
       while (i>= 0 )
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
   else
     {
// рисуем текущий день на каждом тике
      i= 0 ;
      dhigh = high[ 0 ];
      dlow  = low[ 0 ];
       while ( TimeDay (time[ 0 ])== TimeDay (time[i]))
        {
         dhigh= fmax (dhigh,high[i]);
         dlow =   fmin (dlow,low[i]);
         i++;
        }
       while (i>= 0 )
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
//---
   return (rates_total);
  }
//+------------------------------------------------------------------+

benim örneğim de örnek değil hızlı yazdım bence tarihin sonundan başlangıca kadar saymamak gerekliydi ama sıfır çubuğundan tarihe doğru ise kod daha kısa olurdu ve geçerli gün daha hızlı hesaplanabilir - döngü daha küçük olurdu,

ama kontrol ettiğim test cihazında sorunsuz çalışıyor gibi görünüyor, öyle olsun, zaten geç oldu, uyumak istiyorum... Kötü bir örnek verdim (((

 
Igor Makanu :

kodda çok hata var

fiyatları normalleştirmeniz gerekiyor, o zaman işe yarayacak, ardından "yanlış fiyatlar" vermek için bir sunucu hatası olacak, StopLoss_SELL'i daha yüksek normalleştirmek istenir

ve büyük olasılıkla zararı durdurmanın sıfıra eşit olup olmadığını kontrol etmeniz gerekir ve eşitlik için gerçek sayıları karşılaştırmak istenmez, > veya < için gerçek sayıları karşılaştırmaya çalışmanız gerekir.

Pekala. Kodda piyasa emirlerini neden değiştirmediğini az önce gösterdim: piyasadan gelen bir durdurma talebi 0 döndürür.

 
Igor Makanu :

Burada bir gösterge çizdim, kodunuzdaki stringlerle çalışmayı sevmedim, daha kolay yazardım, işte bir örnek. Sunucu zaman farkını da hesaba katacak bir göreviniz olsa da,

benim örneğim de örnek değil hızlı yazdım bence tarihin sonundan başlangıca kadar saymamak gerekliydi ama sıfır çubuğundan tarihe doğru ise kod daha kısa olurdu ve geçerli gün daha hızlı hesaplanabilir - döngü daha küçük olurdu,

ama kontrol ettiğim test cihazında sorunsuz çalışıyor gibi görünüyor, öyle olsun, zaten geç oldu, uyumak istiyorum... Kötü bir örnek verdim (((

İndikatördeki kodum değildi, internette buldum, indikatör nasıl yazılır bilmiyorum. :)

Neden kötü bir örnek yaptılar, göstergenizi gerçekten beğendim, test cihazında çalışıyor ve gerçek grafiklerde her şeyi doğru gösteriyor.

Hızlı yardımınız için çok teşekkürler!

Kanalın çizdiği çizgileri kaldırmanızı rica edebilir miyim? Ekranda kırmızı oklarla işaretledim.

Ve hiç zorlaştırmıyorsa, lütfen o günkü çizgi oluşumunu devre dışı bırakma / etkinleştirme işlevini ekleyin. Ekranda mavi oklarla işaretledim. https://prnt.sc/kuuj3e

Şimdiden teşekkürler!

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
 

Merhaba canım!

Bana OnInit() prosedürünü nasıl uygulayacağımı söyle;

EA değişkenlerini değiştirdikten sonra!?

Uzman Danışmanı bir çizelgeye yerleştirirken OnInit() vardır; ve değişkenleri değiştirirken orada değil!?

EA değişkenlerini değiştirme olayı nasıl izole edilir!?

Lütfen bunun nasıl yapılacağına dair daha fazla kodla yardım edin!?

 
Игорь :

Merhaba canım!

Bana OnInit() prosedürünü nasıl uygulayacağımı söyle;

EA değişkenlerini değiştirdikten sonra!?

Uzman Danışmanı bir çizelgeye yerleştirirken OnInit() vardır; ve değişkenleri değiştirirken orada değil!?

EA değişkenlerini değiştirme olayı nasıl izole edilir!?

Lütfen bunun nasıl yapılacağına dair daha fazla kodla yardım edin!?

 #property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

input int var1 = 1 ;
//+------------------------------------------------------------------+
int OnInit ()
  {
       Print ( "Вызов OnInit(), var1=" ,var1);
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {

  }
//+------------------------------------------------------------------+

bu kodu deneyin, EA günlüğündeki mesajı okuyun (TF'yi değiştirin, bir değişken girin, EA'yı kapatmadan terminali yeniden başlatın...)

ve ikinci seçenek, global görünürlük düzeyinde statik değiştiricili bir değişkeni tanımlamaktır.

 #property strict

input int var1= 1 ;
static bool FirstRun= true ;
//+------------------------------------------------------------------+
int OnInit ()
  {
   Print ( "Вызов OnInit(), var1=" ,var1);
// раскоментируйте FirstRun=true; если нужно контролировать вызов OnInit()
//   FirstRun=true;     
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   if (FirstRun)
     {
       Print ( "Это первый запуск эксперта" );
      FirstRun= false ;
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu :

bu kodu deneyin, EA günlüğündeki mesajı okuyun (TF'yi değiştirin, bir değişken girin, EA'yı kapatmadan terminali yeniden başlatın...)

ve ikinci seçenek, global görünürlük düzeyinde statik değiştiricili bir değişkeni tanımlamaktır.

Statik değiştirici ile küresel düzeyde ????? Bu biraz sapkınlık.

 
Alexey Viktorov :

Statik değiştirici ile küresel düzeyde ????? Bu biraz sapkınlık.

Eh, küresel düzeyde ve statik olmadan çalışacağının farkındayım, ancak deneyime göre, MT4 yapıları daha önce sık sık güncellendiğinde, "yaz" cevabını dinlemektense C++ klasiklerine göre yazmak daha iyidir. kod doğru" geliştiricilerle iletişim kurarken



Not: Bir MQL programının yürütülmesi sırasında bir değişkenin "değerini kaybetmemeyi" garanti etmeniz gerekiyorsa, neden statik değiştiriciyi global düzeyde yazmaya başladığımı hatırladım, daha önce (5 yıl önce) # yoktu. özellik katı ön derleyici yönergesi ve dosyaları eklerken (#include veya library - zaten hatırlamıyorum) bir keresinde “değişkenimi kaybettim” çünkü değişken adları her zamanki gibi dahil edilen dosyayla çakıştı - MQL'yi azarladım, sonra yanlışlıkla bu yanlış anlaşılmayı buldum, ancak statik değiştiriciyi yazarsanız, derleyici derlerken bir hata verdi

Şimdi MT4 derleyicisi oldukça kullanışlı ve güvenilir ve #property katı yönergesi ile bu tür önlemler gerekli olmayabilir, ancak bir değişkenin "değerini kaybetmek" istemediğimde statik alışkanlıktan yazıyorum

ZYZY: Bu değiştirici MQL programının yürütme hızını etkilemez ve bir süre sonra kodumu açıp statik görmem benim için uygun, bu değişkende "kaybetmemek" için önemli olan değerin olduğundan emin olacağım. program yürütme sırasında

 
Igor Makanu :

Eh, küresel düzeyde ve statik olmadan çalışacağının farkındayım, ancak deneyime göre, MT4 yapıları daha önce sık sık güncellendiğinde, "yaz" cevabını dinlemektense C++ klasiklerine göre yazmak daha iyidir. kod doğru" geliştiricilerle iletişim kurarken



Not: Bir MQL programının yürütülmesi sırasında bir değişkenin "değerini kaybetmemeyi" garanti etmeniz gerekiyorsa, neden statik değiştiriciyi global düzeyde yazmaya başladığımı hatırladım, daha önce (5 yıl önce) # yoktu. özellik katı ön derleyici yönergesi ve dosyaları eklerken (#include veya library - zaten hatırlamıyorum) bir keresinde “değişkenimi kaybettim” çünkü değişken adları her zamanki gibi dahil edilen dosyayla çakıştı - MQL'yi azarladım, sonra yanlışlıkla bu yanlış anlaşılmayı buldum, ancak statik değiştiriciyi yazarsanız, derleyici derlerken bir hata verdi

Şimdi MT4 derleyicisi oldukça kullanışlı ve güvenilir ve #property katı yönergesi ile bu tür önlemler gerekli olmayabilir, ancak bir değişkenin "değerini kaybetmek" istemediğimde statik alışkanlıktan yazıyorum

ZYZY: Bu değiştirici MQL programının yürütme hızını etkilemez ve bir süre sonra kodumu açıp statik görmem benim için uygun, bu değişkende "kaybetmemek" için önemli olan değerin olduğundan emin olacağım. program yürütme sırasında

Değişken adları, eklenen dosyadaki adlarla eşleşirse, derleyici bir uyarı verir. Benim için bir uyarı bir hataya eşittir ve ben de onlara aynı şekilde tepki veriyorum. Ve statik değiştiricili küresel düzeydeki değişkenler tereyağına eşittir.

Ama ... böyle yazmayı seviyorsan, kimse sana bunu yasaklayamaz.

 
Alexey Viktorov :

Ama ... böyle yazmayı seviyorsan, kimse sana bunu yasaklayamaz.

bu konudaki benzersizliğim hakkında şüpheler içeri girdi... ee, yalnız değilim, MQL5 klasöründe arama yaparak, MT5 teslimatından çeşitli kaynaklarda küresel düzeyde statik değiştiricili bu tür duyurular var

Kaynak kodundaki "RASTGELE KARAR ORMANINDA TAKVİYE ÖĞRENME" makalesinde bile global düzeyde bir duyuru buldum: static datetime last_time=0;

yani öyle bir şekilde yazdım ki, altını çizmeyi gerekli görüyorum ve yapacağım ama global düzeydeki değişkenlerin %100'ünü statik olarak tanımlamıyorum.

Kasayı Allah korumuş, dedi rahibe...))))