Funkcja int CopyOpen() kopiuje do tablicy ceny otwarcia (open) świec dla określonego instrumentu finansowego, określonego przedziału czasowego oraz dla określonej ilości świec. Więcej informacji można znaleźć w specyfikacji MQL4.
Należy podkreślić, że liczenie świec idzie od teraźniejszości do przeszłości, tj. bieżąca świeca ma indeks 0, wcześniejsza 1 itd. Jeśli trzeba skopiować znaną ilość danych, to najlepiej to zrobić do tablicy statycznej. Jeśli ilość danych nie jest znana, to należy kopiować do tablicy dynamicznej. Jeśli operacja kopiowania się powiedzie, funkcja zwróci ilość skopiowanych elementów, inaczej zwróci -1.
Istnieje 3 warianty funkcji:
Przykład skryptu, gdzie do dynamicznej tablicy openArray[] skopiowano ceny open 5 świeć o indeksach od 10 do 14, dla bieżącego instrumentu finansowego _Symbol i bieżącego przedziału czasowego PERIOD_CURRENT . W tym skrypcie, po operacji ustawienia odwrotnej indeksacji, pierwszy element tablicy openArray[] o indeksie 0 będzie zawierał cenę open świecy o indeksie 10, tj. świecy z której zacznie się kopiowanie. Ostatni piąty element tablicy openArray[] o indeksie 4 - cenę open świecy o indeksie 14.
#property strict
void OnStart()
{
//---
string symbolName = _Symbol; // bieżący instrument finansowy
ENUM_TIMEFRAMES timeFrame = PERIOD_CURRENT; // bieżący przedział czasowy
int startPos = 10; // indeks świecy początkowej
int count = 5; // ilość kopiowanych świec
double openArray[]; /* tablica dynamiczna, do której
zostaną skopiowane dane */
//--- skopiować ceny open i sprawdzić czy nie wystąpił błąd
if(CopyOpen(symbolName, timeFrame, startPos, count, openArray) < 0)
{
Print("Kopiowanie CopyOpen() nie powiodło się. Błąd = ",GetLastError());
return;
}
//--- ustawić w tablicy odwrotną indeksację
ArraySetAsSeries(openArray, true);
//--- ustawić rozmiar tablicy
ArrayResize(openArray, count);
//--- wyświetlić wynik
for(int i = 0; i < count; i++)
Print("Świeca z indeksem ",startPos+i," ma cenę open = ",openArray[i]);
}
Rys. 1. Przykład stosowania funkcji CopyOpen().
Jeśli trzeba znaleźć cenę open świecy na tym wykresie notowań, gdzie program MQL4 został uruchomiony, to zalecane jest stosowanie predefiniowanej tablicy Open[] .
Przykład skryptu, gdzie do statycznej tablicy openArray[] skopiowano cenę open jednej świecy o indeksie 0 dla EURUSD i przedziału czasowego H1.
#property strict
void OnStart()
{
//--- tablica statyczna z 1 elementem
double openArray[1];
//--- skopiować cenę open świecy o indeksie 0 i sprawdzić czy nie wystąpił błąd
if(CopyOpen("EURUSD", PERIOD_H1, 0, 1, openArray) < 0)
{
Print("Kopiowanie CopyOpen() nie powiodło się. Błąd = ",GetLastError());
return;
}
//--- wyświetlić wynik
Print("Cena open świecy EURUSD, PERIOD_H1, indeks 0 = ",openArray[0]);
}
Rys. 2. Przykład stosowania funkcji CopyOpen().
Przykład skryptu, gdzie do dynamicznej tablicy openArray[] skopiowano ceny open 3 świeć dla EURUSD i przedziału czasowego H4. Data pierwszej świecy to 2016.11.03 12:00 i jej cena open będzie znajdować się w openArray[0]. W openArray[1] cena open świecy 2016.11.03 08:00, a w ostatnim trzecim elemencie tablicy openArray[2] cena open świecy 2016.11.03 04:00.
#property strict
void OnStart()
{
//---
string symbolName = "EURUSD";
ENUM_TIMEFRAMES timeFrame = PERIOD_H4;
datetime startTime = D'2016.11.03 12:00';
int count = 3;
double openArray[];
//--- skopiować ceny open i sprawdzić czy nie wystąpił błąd
if(CopyOpen(symbolName, timeFrame, startTime, count, openArray) < 0)
{
Print("Kopiowanie CopyOpen() nie powiodło się. Błąd = ",GetLastError());
return;
}
//--- ustawić w tablicy odwrotną indeksację
ArraySetAsSeries(openArray, true);
//--- ustawić rozmiar tablicy
ArrayResize(openArray, count);
//--- wyświetlić wynik
for(int i = 0; i < count; i++)
Print("openArray[",i,"] = ",openArray[i]);
}
Rys. 3. Przykład stosowania funkcji CopyOpen().
Przykład skryptu, gdzie do dynamicznej tablicy openArray[] skopiowano ceny open świeć dla EURUSD i przedziału czasowego H4. Data pierwszej świecy 2016.11.03 12:00, a ostatniej 2016.11.03 00:00. W tym układzie funkcja skopiuje dane dla 4 świec.
#property strict
void OnStart()
{
//---
string symbolName = "EURUSD";
ENUM_TIMEFRAMES timeFrame = PERIOD_H4;
datetime startTime = D'2016.11.03 12:00';
datetime stopTime = D'2016.11.03 00:00';
double openArray[];
//--- skopiować ceny open i sprawdzić czy nie wystąpił błąd
if(CopyOpen(symbolName, timeFrame, startTime, stopTime, openArray) < 0)
{
Print("Kopiowanie CopyOpen() nie powiodło się. Błąd = ",GetLastError());
return;
}
//--- ustawić w tablicy odwrotną indeksację
ArraySetAsSeries(openArray, true);
//--- określić ilość elementów tablicy
int openArraySize = ArraySize(openArray);
//--- ustawić rozmiar tablicy
ArrayResize(openArray, openArraySize);
//--- wyświetlić wynik
for(int i = 0; i < openArraySize; i++)
Print("openArray[",i,"] = ",openArray[i]);
}
Rys. 4. Przykład stosowania funkcji CopyOpen().
W przypadku żądania danych na podstawie dat (wariant 2 lub 3), funkcja uwzględnia czas co do sekundy. Jeśli w przykładzie 4 do daty ostatniej świecy dopisać 1 sekundę, tj. data wyglądałaby jako 2016.11.03 00:00:01 to funkcja skopiuje dane nie dla 4, a dla 3 świec (rys 5).
Rys. 5. Przykład stosowania funkcji CopyOpen().