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

 
Artyom Trishkin :

dataCandles bir yapıdır. Mumları geçmişten yazdığımız bir dizi - dizi[]. Bu nedenle, indekslemesinin grafikteki mumların indekslenmesiyle çakışması için bir zaman serisi olarak yapılması gerekir. Yani, [] dizisinin sıfır hücresi, geçerli tarihe en yakın mumlara karşılık gelir.

Yani 1. mumları dizi[] dizisine kopyalayın, 2. onu bir zaman dizisi yapın, ardından ondan değerleri yapıya okuyun.

[] dizisi olmadan yapmak mümkün olurdu - verileri doğrudan grafikten yapıya yazın, ancak bunu beş ile uyumluluk için önerdim - yalnızca yüksek [i], düşük kullanarak doğrudan göstergede kopyalayabilirsiniz. [i] ve diğer veriler, ancak bir komut dosyasında veya bir Uzman Danışmanda, yine de önce istenen geçmiş bölümünü bir diziye kopyalamamız gerekiyor, hemen yaptım.

bool serisi=ArrayIsSeries(dizi);
Uyarı(seri);
ArraySetAsSeries (dizi, doğru);
bool serisi=ArrayIsSeries(dizi);

Uyarı(seri);

bunun gibi?

hala her iki uyarı da yanlış veriyor

 
Andrey Koldorkin :
bool serisi=ArrayIsSeries(dizi);
Uyarı(seri);
ArraySetAsSeries(dizi, doğru);
bool serisi=ArrayIsSeries(dizi);

Uyarı(seri);

bunun gibi?

hala her iki uyarı da yanlış veriyor

Dolayısıyla bu, "Bugs, Bugs, Questions" bölümünde rapor edilmesi gereken bir hatadır.

İşte bir test betiği, [] dizisinin sıfır ve son hücrelerinde kopyalanan mumların zamanını gösterir:

 //+------------------------------------------------------------------+
//|                                                     TestCopy.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link        "https://login.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
#property script_show_inputs

enum enumYN
  {
   enYes= 1 , // Да
   enNo= 0 ,   // Нет
  };

//--- input parameters
input int Search_Period= 10 ;   // Количество копируемых свечей
int searchPeriod=(Search_Period< 1 )? 1 :Search_Period;
input int Delta= 2 ;             // Количество пунктов допуска
int delta=(Delta< 0 )? 0 :Delta;
input enumYN AsSeries=enYes;   // Массив array как таймсерия
MqlRates array[];             // Массив структур для копирования Open, High, Low, Close, Time
  
struct DataCandle             // Структура для хранения всех совпадений
  {
   int number_matched;           // Количество совпадений
   MqlRates reference_candle;     // Данные эталонной свечи
   MqlRates matched_candles[];   // Массив свечей, совпадающих с эталонной по нужному критерию 
  };
  DataCandle dataCandle[];     // Массив структур данных свечей и их совпадений
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   int copy_bars=( int ) fmin (Search_Period, Bars ( Symbol (), Period ()));   // количество копируемых свечей
   int copied= CopyRates ( Symbol (), PERIOD_CURRENT , 1 ,copy_bars,array);   // копируем данные
   if (copied> 0 ) {                                                     // если скопировали
       ArraySetAsSeries (array,AsSeries);                               // задаём массив как таймсерию или нет
       ArrayResize (dataCandle,copied);                                 // задаём размер структуры равным числу скопированных данных
       ZeroMemory (dataCandle);                                         // Обнуляем данные в структуре
       //--- основной цикл по "эталонным" свечам в массиве array. Их параметры будем искать в доп. цикле
       for ( int i= 0 ; i<copy_bars- 1 ; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"
         dataCandle[i].reference_candle.high=array[i].high;           // ищем этот high
         dataCandle[i].reference_candle.low=array[i].low;             // запомнили low для сравнения
         dataCandle[i].reference_candle.time=array[i].time;           // запомнили time для вывода в журнал
         //--- поиск совпадений с эталонной свечой, индексируемой индексом основного цикла i
         int size= 0 ;                                                 // размер массива совпадающих свечей
         ArrayResize (dataCandle[i].matched_candles,size);             // Размер массива совпадений в ноль
         dataCandle[i].number_matched=size;                           // Инициализируем количество совпадений нулём
         //--- теперь ищем совпадения по high свечей в цикле j с high эталонной свечи с индексом i
         for ( int j= 0 ; j<copy_bars; j++) {                             // в цикле от i+1 до copy_bars
             if (j==i) continue ;                                       // пропустим свечу "саму себя"
             //--- если совпадают high эталонной свечи (i) и свечи с индексом j (с допуском на величину Point)
             if ( NormalizeDouble (delta* Point ()- fabs (array[i].high-array[j].high), Digits ())>= 0 ) {
               size++;                                               
               ArrayResize (dataCandle[i].matched_candles,size);             // увеличим размер массива совпадающих свечей
               dataCandle[i].number_matched=size;                           // запишем количество совпадений
               dataCandle[i].matched_candles[size- 1 ].high=array[j].high;   // запишем в массив high совпадающей свечи
               dataCandle[i].matched_candles[size- 1 ].low=array[j].low;     // запишем в массив low совпадающей свечи
               dataCandle[i].matched_candles[size- 1 ].time=array[j].time;   // запишем в массив время совпадающей свечи
               //Print("Время свечи ",i," :",TimeToString(dataCandle[i].reference_candle.time=array[i].time),", high=",DoubleToString(dataCandle[i].reference_candle.high=array[i].high,Digits()),". Совпадение со свечой ",TimeToString(dataCandle[i].matched_candles[size-1].time=array[j].time),", её high ",DoubleToString(dataCandle[i].matched_candles[size-1].high=array[j].high,Digits()),". Совпадений: ",(string)dataCandle[i].number_matched);
               }
            }
         }
      }

   //--- Посмотрим чего понаписали в массивы
   Alert ( "Array is series: " , ArrayIsSeries (array),
         "\ntime array[0]: " , TimeToString (array[ 0 ].time, TIME_DATE | TIME_MINUTES ),
         "\ntime array[" , string (searchPeriod- 1 ), "]: " , TimeToString (array[ ArraySize (array)- 1 ].time, TIME_DATE | TIME_MINUTES ));
   for ( int i= 0 ; i< ArraySize (dataCandle)- 1 ; i++) {
       string refs_txt= "" ;
       string matched_txt= "" ;
      refs_txt= "Свеча " + IntegerToString (i, 2 , '0' )+ ": время " + TimeToString (dataCandle[i].reference_candle.time)+ ", high: " + DoubleToString (dataCandle[i].reference_candle.high, Digits ())+ " имеет совпадений: " +( string )dataCandle[i].number_matched+ " шт. " ;
       if (dataCandle[i].number_matched> 0 ) {
         for ( int j= 0 ; j< ArraySize (dataCandle[i].matched_candles); j++) {
            matched_txt= "Совпадение " + IntegerToString (j+ 1 )+ ": " + TimeToString (dataCandle[i].matched_candles[j].time)+ ", high: " + DoubleToString (dataCandle[i].matched_candles[j].high, Digits ());
            }
         }
       Print (refs_txt,matched_txt);
      }
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin :

Dolayısıyla bu, "Bugs, Bugs, Questions" bölümünde rapor edilmesi gereken bir hatadır.

İşte bir test betiği, [] dizisinin sıfır ve son hücrelerinde kopyalanan mumların zamanını gösterir:

Bunu verir:

Dizi dizidir: yanlış

zaman dizisi[0]: 2016.05.12 21:00

zaman dizisi[9]: 2016.05.12 12:00

 
Andrey Koldorkin :

Bunu verir:

Dizi dizidir: yanlış

zaman dizisi[0]: 2016.05.12 21:00

zaman dizisi[9]: 2016.05.12 12:00

Ne verdiğini kontrol ettim - her zaman yanlıştır, ancak zaman doğrudur: dizi dizisini betiği başlatırken "Evet" zaman serisi olarak seçerseniz, o zaman:

Array is series: false
time array[ 0 ]: 2016.05 . 12 21 : 00
time array[ 9 ]: 2016.05 . 12 12 : 00

"Hayır"ı seçerseniz:

Array is series: false
time array[ 0 ]: 2016.05 . 12 12 : 00
time array[ 9 ]: 2016.05 . 12 21 : 00

diziye yazılan mumların zamanı yerleri değiştirdi, bu da ArraySetAsSeries() işlevinin doğru çalıştığı anlamına geliyor, ancak ArrayIsSeries() çalışmıyor, her zaman false döndürür, ki zaten yukarıda bahsedilen hata dizisine aboneliğimi iptal ettim.

 
Andrey Koldorkin :

Ah, bu programlama. Ormana ne kadar uzaksa...

Anlayın, dizinin yönünü bilmenize gerek yok. Algoritma tekrarları arıyor. Bu nedenle, çubukların hangi sırayla işleneceği önemli değildir.
 
Vasiliy Sokolov :
Anlayın, dizinin yönünü bilmenize gerek yok. Algoritma tekrarları arıyor. Bu nedenle, çubukların hangi sırayla işleneceği önemli değildir.
ihtiyaç. Sonuçta, hangi mumların tesadüf oluşturduğunu bulmam ve mevcut fiyata en yakın olandan Düşük fiyatı almam gerekiyor.
 
Andrey Koldorkin :
ihtiyaç. Sonuçta, hangi mumların tesadüf oluşturduğunu bulmam ve mevcut fiyata en yakın olandan Düşük fiyatı almam gerekiyor.

Bunu yapmak için, yapının bir mum süresi vardır, bu sayede ihtiyacınız olan herhangi bir zamana en yakın mumu bulabilirsiniz.

Ve mum numaralarını göstermenize gerek yok - çubukların gerçek sayılarıyla eşleşmezler. Sonuçta diziyi dolduruyoruz ve dizideki indeksler sadece dizideki mum sayısına aittir, grafikte değil.

 
Artyom Trishkin :

Ne verdiğini kontrol ettim - her zaman yanlıştır, ancak zaman doğrudur: dizi dizisini betiği başlatırken "Evet" zaman serisi olarak seçerseniz, o zaman:

"Hayır"ı seçerseniz:

diziye yazılan mumların zamanı yerleri değiştirdi, bu da ArraySetAsSeries() işlevinin doğru çalıştığı anlamına geliyor, ancak ArrayIsSeries() çalışmıyor, her zaman false döndürür, ki zaten yukarıda bahsedilen hata dizisine aboneliğimi iptal ettim.

Kodu biraz değiştirdim:

ArraySetAsSeries (dizi,doğru); //buraya doğru koy

ve ardından kendi kendini test etmek için mum sayılarını yazmak için eklendi:

Alert("Dizi dizidir: ",ArrayIsSeries(dizi),

"\nCandle "+IntegerToString(0,2,'0')+" zaman dizisi[0]: ",TimeToString(dizi[0].time,TIME_DATE|TIME_MINUTES),

"\nCandle "+IntegerToString(searchperiod-1,2,'0')+" time array[",string(searchperiod-1),"]: ",TimeToString(array[ArraySize(array)-1].time, TIME_DATE|TIME_MINUTES));

Aşağıdakileri verir:

Dizi dizidir: yanlış

Mum 00 zaman dizisi[0]: 2016.05.12 22:00

Mum 09 zaman dizisi[9]: 2016.05.12 13:00

 
Artyom Trishkin :
Bunu yapmak için, yapının bir mum süresi vardır, bu sayede ihtiyacınız olan herhangi bir zamana en yakın mumu bulabilirsiniz.
önemli değil. yönün bir satır kod tarafından değiştirildiği ortaya çıktı. süreci zorlaştırmaz. Ama ben sadece neler olduğunu anlamaya çalışırken, en azından kafamdaki mumlar ve araba aynı sırada olacak))
 
Andrey Koldorkin :

Kodu biraz değiştirdim:

ArraySetAsSeries(dizi,doğru); //buraya doğru koy

ve ardından kendi kendini test etmek için mum sayılarını yazmak için eklendi:

Alert("Dizi dizidir: ",ArrayIsSeries(dizi),

"\nCandle "+IntegerToString(0,2,'0')+" zaman dizisi[0]: ",TimeToString(dizi[0].time,TIME_DATE|TIME_MINUTES),

"\nCandle "+IntegerToString(searchperiod-1,2,'0')+" time array[",string(searchperiod-1),"]: ",TimeToString(array[ArraySize(array)-1].time, TIME_DATE|TIME_MINUTES));

Aşağıdakileri verir:

Dizi dizidir: yanlış

Mum 00 zaman dizisi[0]: 2016.05.12 22:00

Mum 09 zaman dizisi[9]: 2016.05.12 13:00

mql4 kullanıyor musunuz? Cevabınız evet ise, yapıya kaydedilen zamana göre mum sayısını bulun. iBarShift() size yardımcı olmak için.