gooral87 pisze:
Chciałbym aby automat otwierał pozycje o wielkości kursu innej pary zaokrąglonej do dwóch miejsc po przecinku. czyli:
kurs EURUSD = 1,3120
chcę aby otworzył pozycję USDJPY o wielkości 1,31lota.
czy coś co stworzyłem ma sens ?
extern double askEURUSD = (MarketInfo("EURUSD", MODE_ASK);
extern double lotyUSDJPY = NormalizeDouble(askEURUSD,2);
Póki co dostałem takie błędy.
'MarketInfo' - comma or semicolon expected
'NormalizeDouble' - initialization expected
'askEURUSD' - expression on global scope not allowed
'askEURUSD' - variable not defined
będę wdzięczny za uwagi
Problemy z tym co tu stworzyles sa nastepujace:
1. extern - uzywa sie tylko do inicjacji pewnych zmiennych w chwili uruchamiania danej strategii czy wskaznika. Robimy to na poczatku, przed wywolaniem jakiejkolwiek funkcji. Mozemy tej zmiennej nadac jakas wartosc, ale bezposrednio, np.
niestety, nie mozemy w tym miejscu przypisac zmiennej x wyniku jakiejs operacji, czy wyniku funkcji. Dlatego
Kod: Zaznacz cały
extern int x=MarketInfo(Symbol(), MODE_ASK);
czy tez nawet:
sa niepoprawne.
deklaracja funkcji
extern sluzy ulatwieniu komunikacji pomiedzy uzytkownikiem a skryptem - te zmienne mozemy sobie w pozniejszym czasie zmienic w chwili uruchamiania funkcji, podczas gdy zmienne deklarowane bez extern nie mozna zmieniac recznie po skompilowaniu kodu.
jako extern nie mozna tez inicjalizowac zadnej tablicy.
Trudno powiedziec co wlasciwie ma robic twoj kod, bo ... podales tylko 2 linijki.... a kompilator wyrzucil ci do nich 4 bledy....
bardzo istotne jest, zeby na poczatku swojej przygody z MQL-em zrozumiec podstawowa strukture EA czy tez wskaznika.... reszta to juz twoja wyobraznia ograniczona mozliwosciami tego jezyka.
Tak wiec, kazde EA sklada sie z kilku czesci:
czesci globalnej, w ktorej deklarujemy sobie rozne zmienne ktore beda widziane i beda mogly byc zmieniane z poziomu kazdej funkcji.
w tej czesci deklarujemy tez zmienne typu
extern.
funkcja
init() - jest funkcja wywolywana zaraz po uruchomieniu ALE TYLKO JEDEN RAZ.
funkcja
deinit() - jest wykonywana na koniec dzialania naszego programu. TEZ TYLKO JEDEN RAZ.
i najwazniejsza czesc kodu - funkcja start().
ta funkcja jest wywolywana ZA KAZDYM RAZEM, KIEDY PRZYCHODZI NOWY TICK.
Wg mnie to troche mylaca nazwa - lepiej wygladalaby nazwa main() - tak jak jest w niektorych innych jezykach programowania...
A tak wyszlo jak w windows, gdzie aby otworzyc glowne menu trzeba nacisnac przycisk Start. Nawet wtedy, kiedy chcemy zakonczyc prace....
No ale jest jak jest.... nie zmienimy tego... Tak wiec trzeba zapamietac, ze funkcja start() wykonuje sie nie tylko w czasie startu, ale za kazdym kiedy przychodzi nowy tick...
W tej czesci globalnej (poza ww. funkcjami i funkcjami ktore sobie sami stworzymy) nie mozna niestety nic obliczac - w sumie to tylko mozemy tam sobie zadeklarowac rozne zmienne i co najwyzej nadac im wartosci poczatkowe.
W funkcjach takich jak
init(), start() czy dowolnych innych ktore sobie sami stworzymy, tez mozemy deklarowac rozne zmienne ale UWAGA: beda one widziane tylko w ramach tej wlasnie funkcji, a w innych funkcjach juz nie.
i tak np.:
w nast. kodzie:
Kod: Zaznacz cały
extern int okres = 13; // zmienna ktora bedziemy mogli ustawic w czasie uruchomiania EA - jej wartosc bedzie widoczna w calym kodzie
double mnoznikCeny = 0.7; // zmienna ktora tez bedzie widoczna w kazdej funkcji tego kodu, ale w czasie uruchomiania nie bedziemy jej mogli zmienic
int init()
{
// tu rozne rzeczy ktore chcemy zeby sie wykonaly tylko raz na poczatku dzialania naszego EA
// mozemy tu wrzucic np. wstepne przetworzenie wartosci zmiennych, czy wprowadzenie wartosci tablic,
// init() robi sie tylko raz - bo po co maja sie te tablice inicjalizowac przy kazdym ticku.
}
int deinit()
{
// tu mozna wrzucic to wszystko, co chcemy aby sie wykonalo jak juz nasze EA skonczy prace....
// np. mozna usunac wszystkie obiekty jakie nasze EA wyrysowalo na ekranie....
}
int start()
{
string komunikat = " Hallo I am Jan B."; // zmienna typu string zostala zadeklarowana w funkcji glownej start() i jest widziana TYLKO wewnatrz tej funkcji
// poniewaz start() jest wywolywana z kazdym tick-iem to ta zmienna bedzie od nowa deklarowana za kazdym razem i zostanie jej przypisana wartosc okreslona w " ".
Comment(komunikat); // ta funkcja wyswietli nam ten bardzo interesujacy komunikat na ekranie...
// i nawet jesli teraz zmienimy wartosc naszej zmiennej na:
komunikat="dwumlask";
// to po kolejnym ticku zmienna ta zostanie ponownie zadeklarowana i przypisana jej zostanie wartosc: " Hallo I am Jan B."
}
Pytanie dla mlodszych adeptow sztuki programowania: kim byl Jan B. ? i co to jest dwumlask ?
