Liczenie zleceń w arkuszu – wersja z referencjami

Temat liczenia zleceń w arkuszu już kiedyś poruszałem w artykule „Sprawdzanie ilości zleceń w arkuszu”, nie mniej jednak chciałbym to tego wrócić w kontekście referencji, którym poświęciłem ostatnio osobnego posta.

Kod z poprzedniego artykułu jest jak najbardziej poprawny i działa zgodnie z zamierzeniami. Jednakże w przypadku, gdy chcemy dokładnie określić liczebność każdego rodzaju zlecenia w arkuszu zleceń użycie kodu z poprzedniego artykułu sprawi, że nieco stracimy na wydajności.Problem ten możemy rozwiązać poprzez zastosowanie poniższej funkcji:

int countOrdersByRef(int oMagic, int& all, int& buy, int& sell,
                                           int& buystop, int& sellstop,
                                           int& buylimit, int& selllimit) {

   all=0;
   buy=0;
   sell=0;
   buystop=0;
   sellstop=0;
   buylimit=0;
   selllimit=0;

   for(int i=0;i<OrdersTotal();i++) {
    if(OrderSelect(i,SELECT_BY_POS)) {
     if(OrderMagicNumber()==oMagic) {
      if(OrderSymbol()==Symbol()) {
       all++;
       if(OrderType()==OP_BUY) buy++;
       if(OrderType()==OP_SELL) sell++;
       if(OrderType()==OP_BUYSTOP) buystop++;
       if(OrderType()==OP_SELLSTOP) sellstop++;
       if(OrderType()==OP_BUYLIMIT) buylimit++;
       if(OrderType()==OP_SELLLIMIT) selllimit++;
      }
     }
    }
   }

}

Używamy tego w ten sposób:

int cAll;
int cBuy;
int cSell;
int cBuyStop;
int cSellStop;
int cBuyLimit;
int cSellLimit;

countOrdersByRef(magic,cAll,cBuy,cSell,cBuyStop,cSellStop,cBuyLimit,cSellLimit);

// dalej odwołujemy się do zadeklarowanych zmiennych
if(cBuy>0.....) { .... }

Kilka wyjaśnień co do funkcji:

  • Wyzerowanie jest konieczne z tego względu na to, że przekazywane przez referencje zmienne mogą mieć niezerowe wartości, przez co ich inkrementacja może dawać nieporządane efekty, które sprawią, że otrzymamy wyniki inne niż rzeczywisty stan arkusza zleceń.
  • Można zapytać dlaczego używać funkcji, skoro można taką pętelkę wrzucić od razu do ciała funkcji start – owszem, można – tyle, że tak jest bardziej elegancko, a na pewno ułatwia to powtórne wykorzystywanie kodu w innych projektach – ot, kopiujemy całą funkcję, a nie bawimy się w wyszukiwanie jej fragmentów.

Autor: Łukasz Tomaszkiewicz

Podziel się ze znajomymi:

Prześlij nam swoje uwagi

Imię i nazwisko (wymagane)

Adres email (wymagane)

Treść wiadomości

  • Facebook