6 przydatnych mini funkcji MQL

Gdy tak czasem przeglądam kod innych osób zastanawia mnie po co było pisać aż tyle w niektórych miejscach, skoro można zrobić to krócej i bardziej elegancko. Poniżej przedstawiam kilka małych, jednak jakże przydatnych funkcji, które pozwalają w wielu miejscach uczynić kod krótszym, bardziej eleganckim i także – bardziej czytelnym.

sltpValue

Funkcja ma na celu umożliwienie łatwego podawania lub nie podawania wielkości SL/TP w poleceniu OrderSend, bez konieczności sprawdzania czy ustawiono jakiś SL. Może najpierw podam funkcję, a następnie wyjaśnię na przykładzie jej działanie:

double sltpValue(double value, int sltp) {
 if(sltp>0) {
  return(value);
 }
 return(0);
}

A działa to w ten sposób:

extern int sl=30;
extern int tp=90;

int start() {
 [...]
 OrderSend(Symbol(),OP_BUY,lots,Ask,slippage,
           sltpValue(Bid-sl,sl),sltpValue(Ask+tp,tp),comment,magic);
 [...]
}

I teraz cały urok tej funkcji polega na tym, że możemy w testerze łatwo sprawdzić np. działanie strategii bez TP (podając tp=0), bez konieczności bawienia się w instrukcje warunkowe i dublowanie OrderSend.

normalize

Funkcja służy do normalizowana wartości do podanego przedziału. Podajemy wartość wejściową oraz granice przedziału (kolejność granic nie ma znaczenia), funkcja zwraca wartość oryginalną, gdy wartość wejściowa mieści się w przedziale lub jedną z granic podanego przedziału, gdy funkcja wykroczyła poza tę granicę.

double normalize(double value,double min,double max) {
 value=MathMin(value,MathMax(min,max));
 value=MathMax(value,MathMin(min,max));
 return(value);
}

between

Funkcja do szybkiego sprawdzania czy wartość podana w argumencie znajduje się w podanym przedziale (kolejność granic przedziału nie ma znaczenia).

bool between(double value,double min, double max) {
 if(value<MathMax(min,max) && value>MathMin(min,max)) {
  return(true);
 }
 return(false);
}

betweenoe

Funkcja podobna do poprzedniej, tyle że sprawedza „between or equal”, czyli w praktyce różni się znakami i sprawdza czy znajduje się w przedziale lub na jego granicy.

bool betweenoe(double value,double min, double max) {
 if(value<=MathMax(min,max) && value>=MathMin(min,max)) {
  return(true);
 }
 return(false);
}

instr

Nakładka na funkcję StringFind, która moim zdaniem do sparawdzania czy jeden string zawiera drugi jest nieintuicyjna i ma dziwną składnię (przyzwyczajenia z PHP – tam zawsze szukało się „igły w stogu siana”, a nie „w sianie igły” – kolejność parametrów).

O ile StringFind zwraca pozycję, co nie jest w większości przypadków istotne, instr zwraca prawdę lub fałsz w zależności czy string find znajduje się w stringu text.

bool instr(string find,string text) {
 if(StringFind(text,find)>=0) {
  return(true);
 }
 return(false);
}

orderDir

Często zachodzi potrzeba określenia nie tyle typu pozycji, co po prostu kierunku tj. czy jest to pozycja na sell czy też na buy.  Jako argument przekazujemy do funkcji wynik z OrderType() zlecenia, którego kierunek chcemy określić.

int orderDir(int oType) {
 if(oType==OP_BUY  || oType==OP_BUYLIMIT  || oType==OP_BUYSTOP) return(1);
 if(oType==OP_SELL || oType==OP_SELLLIMIT || oType==OP_SELLSTOP) return(-1);
}

Autor: Łukasz Tomaszkiewicz

Podziel się ze znajomymi:

Prześlij nam swoje uwagi

[contact-form-7 404 "Not Found"]
  • Facebook