Liczenie otwartych pozycji tylko w danym dniu

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Liczenie otwartych pozycji tylko w danym dniu

Nieprzeczytany post autor: kris007 »

Witam, znalazłem taki fajny kawałek kodu made in Tig3r,
chciałbym go wykorzystać aby mi liczył pozycje oczekujące (i do tej chwili to żaden problem) ale tylko w danym dniu,
przykładowo jeśli mi otworzy w sumie 4 pozycje oczekujące będzie stop, jednak gdy dzień się zmieni, będzie następny,
chciałbym aby tych pozycji które wiszą z poprzedniego dnia i wcześniej nie brał pod uwagę a liczył od nowa,
na bieżąco z nowego aktualnego dnia, tak pomyślałem że może za pomocą DayOfYear() jakoś to zapisać aby rozróżniał dni,
tylko nie bardzo wiem jak, nie znalazłem też w necie żadnego przykładu czegoś takiego,
może ktoś z Was ma jakiś pomysł jak ugryźć ten temat?

Pozdrawiam

Kod: Zaznacz cały

int IleOtwartychPozycji(int kierunek) 
 { 
    int Sell, Buy; 
     
    for (int i = 0; i < OrdersTotal(); i++) 
    { 
       if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
       { 
          if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA) 
          { 
             if (OrderType() == OP_BUYLIMIT) Buy++; 
             if (OrderType() == OP_SELLLIMIT) Sell++; 
          } 
       } 
    } 
     
    switch(kierunek) 
    { 
    case -1: return(Sell); 
    case 0: return(Buy+Sell); 
    case 1: return(Buy); 
    } 
 }

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

Dodaj do warunkow

Kod: Zaznacz cały

TimeDay(OrderOpenTime())==Day()
pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Nieprzeczytany post autor: kris007 »

dobra zrobiłem tak:

Kod: Zaznacz cały

int IleOtwartychPozycji(int kierunek) 
 { 
    int Sell, Buy; 
    
    for (int i = 0; i < OrdersTotal(); i++) 
    { 
       if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
       { 
          if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA) 
          { 
             if (OrderType() == OP_BUYLIMIT) Buy++;  
             {
             if (TimeDay(OrderOpenTime())==Day())
             Buy=2;
             }                 
             if (OrderType() == OP_SELLLIMIT) Sell++; 
             {
             if (TimeDay(OrderOpenTime())==Day())
             Sell=2;
             } 
          } 
       } 
    } 
     
    switch(kierunek)          
    { 
    case -1: return(Sell);     
    case  0: return(Buy+Sell); 
    case  1: return(Buy);      
    } 
 }
wygląda na to że działa :).

Wielkie dzięki Andrzej.

Pozdrawiam

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

No nie wiem , nie wyzerowałeś zmiennych lokalnych i z tymi warunkami jest chyba coś dziwnego ,zakładasz że masz zawsze otwarte 2 oczekujące ?

Kod: Zaznacz cały

   //?????????????
           if (TimeDay(OrderOpenTime())==Day()) 
             Buy=2; 
             } 
chyba coś takiego powinno być:

Kod: Zaznacz cały

int IleOtwartychPozycji(int kierunek) 
{ 
     int Sell = 0;
     int Buy = 0;
     
     for (int i = 0; i < OrdersTotal(); i++) 
     { 
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
        { 
           if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA) 
           { 
               if (TimeDay(OrderOpenTime())==Day()) 
               {
                  if (OrderType() == OP_BUYLIMIT)
                  { 
                         Buy++;

                  } else if(OrderType() == OP_SELLLIMIT)
                          {
                                Sell++;
                          } 
               }//Day

           } //Symbol
        } 
     }//for
               //..............................
               //..............................
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Nieprzeczytany post autor: kris007 »

dulf pisze:No nie wiem , nie wyzerowałeś zmiennych lokalnych i z tymi warunkami jest chyba coś dziwnego ,zakładasz że masz zawsze otwarte 2 oczekujące ?
Nie wiem, nie znam się aż tak, na razie działa.
Zakładam że mogą być otwarte max 4 pozycje oczekujące w danym dniu (oczywiście tu dochodzą jeszcze inne warunki), 2 na buy... i 2 na sell...
Jeśli coś jest jeszcze źle to bardzo proszę o podpowiedź.

Pozdrawiam.

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

No masz podpowiedz , nie widzę całego kodu .Masz przypisanie na sztywno do zmiennej Buy i Sell = 2 w swoim kodzie.Czyli faktycznie nie zliczasz pozycji tylko zawsze otrzymasz że masz 2 otwarte ,bez względu czy będą 1,4 czy 10 jeśli chodzi o dzień bieżący ,a to miało chyba zliczać ilość faktycznie zleconych oczekujących .
Ta konstrukcja jest nielogiczna , masz pomieszane warunki , klamry :

Kod: Zaznacz cały

             if (OrderType() == OP_BUYLIMIT) Buy++;  
              { 
              if (TimeDay(OrderOpenTime())==Day()) 
              Buy=2; 
              } 
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Nieprzeczytany post autor: kris007 »

dulf pisze:Ta konstrukcja jest nielogiczna , masz pomieszane warunki , klamry :
hmm, faktycznie coś jest nie tak, teraz zrobiłem jeszcze jeden test i przy jednym oczekującym potrafi doliczyć jeszcze cztery, czyli przekracza narzucony limit 4.

Dobra widzę że się w tym lepiej orientujesz, możesz mi w takim razie powiedzieć jak zapisać ten kod?

Zrobić może tak ? :

Kod: Zaznacz cały


if (IleOtwartychPozycji(-1) < 2)
{
Ticket = OrderSend(Symbol(), OP_SELLLIMIT......
}


if (IleOtwartychPozycji(1) < 2)
{
Ticket = OrderSend(Symbol(), OP_BUYLIMIT......
}
plus kod który wstawiłeś w pierwszym swoim poście i będzie dobrze?

Dodano po 29 minutach:

Zrobiłem tak jak napisałem, chyba jest lepiej, czy na pewno to wyjdzie w praniu :)

Również wielkie dzięki dulf.

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

Takie zabezpieczenie możesz zrobić ,wstaw tą funkcję zamiast swojej :

Kod: Zaznacz cały

int IleOtwartychPozycji(int kierunek) 
  { 
     int Sell = 0; 
      int Buy = 0; 
       
      for (int i = 0; i < OrdersTotal(); i++) 
      { 
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
         { 
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA) 
            { 
                if (TimeDay(OrderOpenTime())==Day()) 
                { 
                   if (OrderType() == OP_BUYLIMIT) 
                   { 
                          Buy++; 

                   } else if(OrderType() == OP_SELLLIMIT) 
                           { 
                                 Sell++; 
                           } 
                }//Day 

            } //Symbol 
         } 
      }//for
       
     switch(kierunek)          
     { 
     case -1: return(Sell);      
     case  0: return(Buy+Sell); 
     case  1: return(Buy);      
     } 
  }
Zlicza Limity z dnia bieżącego .
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
kris007
Pasjonat
Pasjonat
Posty: 551
Rejestracja: 23 sty 2008, 22:50

Nieprzeczytany post autor: kris007 »

dulf pisze:wstaw tą funkcję zamiast swojej
tak właśnie zrobiłem, czyli chyba będzie dobrze, uff :)

Dziękuje i Pozdrawiam

ODPOWIEDZ