Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 989

 
Aleksey Vyazmikin :

Bu mesajın nedenini nasıl bulabilirim?

profil oluşturucu

 
Artyom Trishkin :

Sıfır için dönüş değerini nasıl kontrol edeceğinizi bilmiyor musunuz? Ve OnCalculate()'den sıfır dönüşle nasıl çıkacağınızı bilmiyor musunuz? Hiç bir site aramasında bilgi aramayı denediniz mi?

  1. Fonksiyondan gerekli değeri almak
  2. sıfır olup olmadığını kontrol edin
    1. Sıfır ise, 0 döndürün;
    2. Sıfır değilse, o zaman n3'e
  3. Alınan değerle çalışma
Reytingi 13 bini geçen birine bu kaynakta mantığın temellerini anlatacağım hiç aklıma gelmezdi...

Bu bir gösterge değildir.

Her aramada kontrol yapılmasının gerekli olup olmadığını veya OnTick'in başında bir tane yeterli olup olmadığını özellikle açıkladım ...

İadeler benim için kabul edilebilir değil... ve test cihazında bekleme süresini döngüye almak imkansız, ancak gerçek hayatta çalışması gerekiyor (ya da değil mi?).

Puanım programlama için değil, programcı değilim ve bu zor işi sadece sizin gibi insanlar sayesinde öğreniyorum, bilgili insanlardan gelen geri bildirimler benim için çok önemli.

Anlayışınız için teşekkürler.

 
Artyom Trishkin :

profil oluşturucu

Ve günde bir kez mi yoksa daha az sıklıkta mı oluyor?

 
Merhaba. Nedense, tutamaç yalnızca tüm periyotlar için ayarlandığında iletir, ancak belirli bir tanesine koyuyorum ve hiçbir şey yok. Sorunun ne olduğu belirsiz. Global değişkenlerden değil doğrudan tanıtıcıya girmeye çalıştım, sonuç aynı. Sorun nedir??? Değerin bir döneme ait olması gerekir.
 //+------------------------------------------------------------------+
//|                                                        77777.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    0
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
//----
input string xBars= "2018.11.19 00:00" ;             //Дата начала отсчета
input bool DataBars= false ;                         //Считать по дате (true)
input int InpMAShift= 1 ;                           //Сдвиг бара расчета 
input ENUM_TIMEFRAMES Timeframes= PERIOD_D1 ;       //Таймфрейм скользящей
input ENUM_MA_METHOD   Method= MODE_EMA ;             //Метод  расчета скользящей
input ENUM_APPLIED_PRICE AppliedPrice= PRICE_CLOSE ; //Расчет цены скользящей
input ENUM_LINE_STYLE MAStyle= STYLE_DASH ;         //Стиль всех скользящих линий
input int InpMAPeriod1= 5 ;                         //Скользящая 1 периода

//----
int handle_ma,shift;
double BufferPrice[];
//---
int period;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   period=(InpMAPeriod1< 1 ? 1 : InpMAPeriod1);
//---
   SetIndexBuffer ( 2 ,BufferPrice, INDICATOR_CALCULATIONS );
   ArraySetAsSeries (BufferPrice, true );
//--- create MA's handles
   ResetLastError ();

//----------------------------------------------------------------+
//                     ПРОБЛЕМА ТУТ 
//
//----------------------------------------------------------------+
   handle_ma= iMA ( NULL , PERIOD_D1 ,period, 0 , MODE_SMA , PRICE_CLOSE );         //ПРОБЛЕМА ТУТ 
 //  handle_ma=iMA(NULL, PERIOD_CURRENT ,period,0,MODE_SMA,PRICE_CLOSE);      / / БЕЗ ПРОБЛЕМЫ
   if (handle_ma== INVALID_HANDLE )
     {
       Print ( "The iMA (" ,( string )period, ") object was not created: Error " , GetLastError ());
       return INIT_FAILED ;
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ObjectDelete ( 0 , "Proba" );
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка количества доступных баров
   if (rates_total< 4 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     {
      limit=rates_total- 1 ;
       ArrayInitialize (BufferPrice, 0 );
     }
//--- Подготовка данных
   int count=(limit> 1 ? rates_total : 2 ),copied= 0 ;
   copied= CopyBuffer (handle_ma, 0 , 0 ,count,BufferPrice);
   if (copied!=count) return 0 ;
//----   
if (DataBars== false )
    shift=InpMAShift;
 else
    shift=iBarShift(NULL,PERIOD_CURRENT,StringToTime(xBars)); 
    
 double ma1=BufferPrice[shift];
 datetime tm= iTime ( NULL ,Timeframes,shift);
 
 Comment ( NormalizeDouble (BufferPrice[shift], _Digits ), "    " ,shift);
 
 
   HLine( "Proba" , "" ,tm,ma1,MAStyle, 1 ,Red);

//--- return value of prev_calculated for next call

   return (rates_total);
  }
//+------------------------------------------------------------------+
void HLine( string name,
           string text,
           datetime tm,
           double price,
           int stl,
           int wid,
           color clr)
  {
   if ( ObjectFind ( 0 ,name)!= 0 )
     {
       ObjectCreate ( 0 ,name, OBJ_HLINE , 0 ,tm,price);
       ObjectSetInteger ( 0 ,name, OBJPROP_TIME , tm);
       ObjectSetString ( 0 ,name, OBJPROP_TEXT ,text); 
       ObjectSetString ( 0 ,name, OBJPROP_FONT , "Times New Roman" ); 
       ObjectSetInteger ( 0 ,name, OBJPROP_FONTSIZE , 10 ); 
       ObjectSetInteger ( 0 ,name, OBJPROP_STYLE , stl);
       ObjectSetInteger ( 0 ,name, OBJPROP_WIDTH , wid);
       ObjectSetInteger ( 0 ,name, OBJPROP_COLOR , clr);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
       ObjectSetInteger ( 0 ,name, OBJPROP_HIDDEN , true ); 
     }
  }

 
kopeyka2 :
Merhaba. Nedense, tutamaç yalnızca tüm periyotlar için ayarlandığında iletir, ancak belirli bir tanesine koyuyorum ve hiçbir şey yok. Sorunun ne olduğu belirsiz. Global değişkenlerden değil doğrudan tanıtıcıya girmeye çalıştım, sonuç aynı. Sorun nedir???
       ResetLastError ();
   if ( CopyBuffer (handle_ma, 0 , 0 ,count,BufferPrice)< 0 )
     {
       PrintFormat ( "Failed to copy data from the handle_ma indicator, error code %d" , GetLastError ());
       return ( 0.0 );
     }
//   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);

Hatayı inceleyin, Artyom her şeyi 10 kez kontrol etmeniz gerektiğini doğru söylüyor ...

 2019.01 . 25 20 : 12 : 26.169 Test777 (Si Splice,M1)  Failed to copy data from the handle_ma indicator, error code 4806

ERR_INVALID_ARRAY

4006

Yanlış türde, yanlış boyutta bir dizi veya bozuk bir dinamik dizi nesnesi


ERR_INDICATOR_DATA_NOT_FOUND

4806

İstenen veri bulunamadı


 
kopeyka2 :
Merhaba. Nedense, tutamaç yalnızca tüm periyotlar için ayarlandığında iletir, ancak belirli bir tanesine koyuyorum ve hiçbir şey yok. Sorunun ne olduğu belli değil. Global değişkenlerden değil doğrudan tanıtıcıya girmeye çalıştım, sonuç aynı. Sorun nedir??? Değerin bir döneme ait olması gerekir.

Scriptor'daki göstergelerden CodeBase'den örnekler alıyor musunuz? Doğru? Ardından, adında MTF görünen, ancak MCP'siz örnekler için kodlarına (çok yakın zamanda yayınlanmış) bakın.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Diğer bir deyişle, mevcut sembol hakkında, ancak grafik döneminden farklı bir zaman diliminden veri almak istiyorsanız, çoklu zaman dilimi göstergesi örneğine ihtiyacınız vardır. Henüz MCP'ye tırmanmaya değmez - standart sınıfları kullanarak OOP'de. Kafan karıştı.

Örneğin, bu hesaplama:

 //--- Подготовка данных
   int count=(limit> 1 ? rates_total : 2 ),copied= 0 ;
   copied= CopyBuffer (handle_ma, 0 , 0 ,count,BufferPrice);
   if (copied!=count) return 0 ;

sadece mevcut dönem ve sembol üzerinde çalışan MA içindir. Farklı bir dönemde çalışmak için hesaplama farklı olacaktır. Bak - her şey yakın ve sana yön önerdim.

 
Artyom Trishkin :

Scriptor'daki göstergelerden CodeBase'den örnekler alıyor musunuz? Doğru? Ardından, adında MTF görünen, ancak MCP'siz örnekler için kodlarına (çok yakın zamanda yayınlanmış) bakın.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Diğer bir deyişle, mevcut sembol hakkında, ancak grafik döneminden farklı bir zaman diliminden veri almak istiyorsanız, o zaman bir çoklu zaman dilimi göstergesi örneğine ihtiyacınız vardır. Henüz MCP'ye tırmanmaya değmez - standart sınıfları kullanarak OOP'de. Kafan karıştı.

Örneğin, bu hesaplama:

sadece mevcut dönem ve sembol üzerinde çalışan MA içindir. Farklı bir dönemde çalışmak için hesaplama farklı olacaktır. Bak - her şey yakın ve sana yön önerdim.

Teşekkürler...
 
Aleksey Vyazmikin :

Hatayı inceleyin, Artyom her şeyi 10 kez kontrol etmeniz gerektiğini doğru söylüyor ...

ERR_INVALID_ARRAY

4006

Yanlış türde, yanlış boyutta bir dizi veya bozuk bir dinamik dizi nesnesi

teşekkürler
 
kopeyka2 :
teşekkürler

Lütfen, yanlış hatayı kopyaladım, böyle olmalı

ERR_INDICATOR_DATA_NOT_FOUND

4806

İstenen veri bulunamadı

Sonuç olarak, farklı zaman dilimlerinde çubuk sayısının farklı olduğu ve bunun dikkate alınması gerektiğidir.

 
Aleksey Vyazmikin :

Lütfen, yanlış hatayı kopyaladım, böyle olmalı

ERR_INDICATOR_DATA_NOT_FOUND

4806

İstenen veri bulunamadı

Sonuç olarak, farklı zaman dilimlerinde çubuk sayısının farklı olduğu ve bunun dikkate alınması gerektiğidir.

Bunu kontrol ettim. Ancak PROBLEM, tutamacı sabit bir periyot için ayarlayarak,

Diğer zaman dilimlerindeki CopyBuffer değeri AKTARILMAZ. Ayarlanan işleme periyodunda değer, daha küçük zaman dilimlerinde 0.0 (sıfır) idi. Tampon arayışı içinde taşındı ... sıfır. Neden CopyBuffer'a geçirilmiyor?