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

 
Добрый день. Прошу помощи. Уже пару недель безуспешно пытаюсь заставить индикатор круглых уровней заставить (см.код) передавать их для использования в эксперте через iCustom. Прошу помочь поправить код.




#property indicator_chart_window

extern string H                     = " --- Mode_Settings ---";
extern bool   Show_00_50_Levels     = true;
extern bool   Show_20_80_Levels     = true;
extern color  Level_00_Color        = Lime;
extern color  Level_50_Color        = Gray;
extern color  Level_20_Color        = Red;
extern color  Level_80_Color        = Green;

double dXPoint = 1;
double Div = 0;
double i = 0;
double HighPrice = 0;
double LowPrice = 0;
int iDigits;
  
int start() 
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
  
  if(Show_00_50_Levels)
  {
   for (i = LowPrice; i <= HighPrice; i++) 
   {
      if (MathMod(i, 5) == 0.0) {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
            if(MathMod(i, 10) == 0.0)
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_00_Color);
            }
            else
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_50_Color);
            }
         }
      }
   }
   
  }
  
  if(Show_20_80_Levels)
  {
  
   for (i = LowPrice; i <= HighPrice; i++) 
   {
         
        if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="20") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT); 
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_20_Color);
            
            }
         }
        
         
         if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="80") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
           
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_80_Color);
            }
         }
         
   }
   
  }
  
   return (0);
}

int init() 
{
   iDigits = Digits;
   if(Digits==5 || Digits==3)dXPoint=10;
   if(Digits==3)  iDigits=2;
   if(Digits==5)  iDigits=4;
   
   Div = 0.1 / (Point*dXPoint);
   return (0);
}

int deinit()
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
   for (i = LowPrice; i <= HighPrice; i++) ObjectDelete("RoundPrice " + DoubleToStr(i, 0));
   return (0);
 
Aleksey Mavrin :
Programlamada pratikte sıfır olduğunuzu söylüyorsanız, neden bu kadar standart olmayan görevleri üstleniyorsunuz, belki basit olanlarla başlıyorsunuz? Peki, ya da temel bilgileri sıkılaştırın? Senin için burada yapmak daha kolay, evet.

Ben yazmadım: "Beni bir gösterge yap." yardım istendi. mql4'te tam olarak ustalaşmak için hedefe değmez. Sadece fikirleri test ediyorum. Excel zaten eziyet ile)

 
Oleg Bondarev :

"Kolektif çiftçi") uyardım

İşte böyle yaptı.

Şimdi bir tik grafiği çiziyor, ancak bazı satır sonları var.

4'te yapıyorum.

satır sonları, Label1Buffer[XXX] içinde değer olmadığı anlamına gelir

ve ikincisi, yukarıda bir kez daha yazdım - gösterge arabelleği ( Label1Buffer   ) terminal tarafından kontrol edilir, yeni bir çubuk belirirse, değerlerin tümü otomatik olarak değişecektir - kodu M1'de çalıştırın ve izleyin

Not: Bir çiftçi değil, kendi kendine öğrenmeye çalışan biri! ))))

 
Igor Makanu :

satır sonları, Label1Buffer[XXX] içinde değer olmadığı anlamına gelir

ve ikincisi, yukarıda bir kez daha yazdım - gösterge arabelleği ( Label1Buffer   ) terminal tarafından kontrol edilir, yeni bir çubuk belirirse, değerlerin tümü otomatik olarak değişecektir - kodu M1'de çalıştırın ve izleyin

Not: Bir çiftçi değil, kendi kendine öğrenmeye çalışan biri! ))))

Label1Buffer[ХХХ] - bu, 3-bileşik bir sayı anlamına mı geliyor?


 
Oleg Bondarev :

Label1Buffer[ХХХ] - bu, 3-bileşik bir sayı anlamına mı geliyor?


hayır hatırladığım ilk harfleri yazdım

eleman numarası olan rakamdır

kodunuza bakın, benim döngüme benzer şekilde kendi kodunuzu yazdınız, burada Label1Buffer gösterge arabelleğini bir öğeye kaydırıyorsunuz - her gösterge çağrısına dikkat edin (her onay)

ve Label1Buffer içeriğini kaydırdıktan sonra Label1Buffer[0] yeni bir değer atayın

Diğer elementler için değerler nelerdir? ilk başlangıçta "boş bir değere" (EMPTY_VALUE) sahip olacaklar, ardından bir kez kaydırıp yeni bir değer atayacaklar... ve ardından yeni bir çubuk göründüğünde terminalin kendisi TÜM Label1Buffer değerlerini kaydıracak


genel olarak bilginizde ufak bir kayma var ama barın kapanış fiyatını bir gösterge ile çizmeye çalışın işte kod

 #property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot line1
#property indicator_label1    "line1"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- input parameters
input int       Input1= 10 ;
//--- indicator buffers
double          line1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,line1Buffer);
   IndicatorDigits( Digits );
   
//---
   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,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if (prev_calculated== 0 ){
      limit=rates_total- 1 ;
   } else
      limit=rates_total-prev_calculated+ 1 ; // или limit=rates_total-prev_calculated ; чтобы не перерисовывать бар №1
//--- Основной цикл расчета
//Print("limit = ",limit);
   for (i=limit; i>= 0 ; i--){
      line1Buffer[i]=close[i];
    }
//---
   return (rates_total);

  }
//+------------------------------------------------------------------+
 
Seni anladım. Düşünmeliyim. Teşekkür ederim!
 

Excel'de veri nasıl yazılır? -MQL5

Excel dosya biçimi xlsx'tir ve FileOpen işlevi txt ve csv gibi dosyalar oluşturur ve bunlarla çalışır


OnTester'da test ettikten sonra, her bir işarette pozisyonun açıldığı anda farklı verilerin geçmişini içeren arabelleklerdeki verileri boşaltmam ve ardından tüm işlemlerin verilerini tek bir grafikte görüntülemem gerekiyor.
Anladığınız gibi, bir işlem için bile çok fazla veri olacak, tüm işlemlerden bahsetmiyorum bile - bu nedenle "manuel transfer" seçeneği uygun değil


Ne önerirsiniz?

 
Alexandr Sokolov :

Excel'de veri nasıl yazılır? -MQL5

Excel dosya biçimi xlsx'tir ve FileOpen işlevi txt ve csv gibi dosyalar oluşturur ve bunlarla çalışır


OnTester'da test ettikten sonra, her bir işarette pozisyonun açıldığı anda farklı verilerin geçmişini içeren tamponlardan verileri boşaltmam ve ardından tüm işlemlerin verilerini tek bir grafikte görüntülemem gerekiyor.
Anladığınız gibi, bir işlem için bile çok fazla veri olacak, tüm işlemlerden bahsetmiyorum bile - bu nedenle "manuel transfer" seçeneği uygun değil


Ne önerirsiniz?

Genel olarak, özün basit olduğu ortaya çıktı - MQL5'in yardımıyla doğrudan bir Excel dosyasına programlı olarak bir şey yazmak mümkün olmayacak, ancak Excel'in kendisinde "veri" içindeki bir metin dosyasından veri alabilirsiniz >> > "metinden" sekmesinden

 
Merhabalar, uzman testi bittikten sonra silinmeyen nesnelerle ilgili bir hata alıyorum, anladığım kadarıyla kesinlikle tüm nesneleri stack üzerinde yani yeni olmadan oluşturuyorum. Lütfen bu soruyu açıklayın.
 
Alexandr Sokolov :

Ne önerirsiniz?

.csv'ye yaz ve excel'de aç