Wszystkie pytania dozwolone początkujących programistów

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

J@roFx pisze:a jak policzyć tylko zlecenia oczekujące
order total zlicza wszystkie oczekujące i otwarte tak?
Tak, a policzyć można np tak:

Kod: Zaznacz cały

int IleOtwartychPozycjiOczekujacych(int kierunek)
{
   int Sell=0, Buy=0;
   
   for (int i = 0; i < OrdersTotal(); i++)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA)
         {
            if (OrderType() == OP_BUYSTOP || OrderType() == OP_BUYLIMIT) Buy++;
            if (OrderType() == OP_SELLSTOP || OrderType() == OP_SELLLIMIT) Sell++;
         }
      }
switch(kierunek)
   {
   case -1: return(Sell);
   case 0: return(Sell+Buy);
   case 1: return(Buy);
   }
   }
}
To jest funkcja i ją wywołujesz z odpowiednim parametrem:

Kod: Zaznacz cały

IleOtwartychPozycjiOczekujacych(0);// - wszystkie oczekujące
IleOtwartychPozycjiOczekujacych(1);// - oczekujące BUY
IleOtwartychPozycjiOczekujacych(-1);// - oczekujące SELL
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

J@roFx
Bywalec
Bywalec
Posty: 6
Rejestracja: 29 wrz 2011, 10:12

Nieprzeczytany post autor: J@roFx »

Tig3r, sory za te głupie pytania, dopiero dziś zaczełem bawić się mql.
Wyszło coś takiego i nie mogę znaleźć błędu:


int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
extern double TakeProfit = 20;
extern double Lots = 0.01;
int start()
{
//zdefiniowane
int total, firstupperup, firstupperdown,firstlowerup, firstlowerdown, ticket,
Buy, Sell, kierunek, IleOtwartychPozycjiOczekujacych;
//koniec zdefiniowanych


total=OrdersTotal();
if(total<1)
if (true)

{
if(AccountFreeMargin()<(1000*Lots))

{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}



if(total==0)
{
firstupperup=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+20*Point,0,0,Ask+20*Point+TakeProfit*Point,"buy start",0001,0,Green);
firstupperdown=OrderSend(Symbol(),OP_SELLLIMIT,Lots,Bid+20*Point,0,0,Bid+20*Point-TakeProfit*Point,"SELL start",0001,0,Green);

firstlowerup=OrderSend(Symbol(),OP_BUYLIMIT,Lots,Ask-20*Point,0,0,Ask-20*Point+TakeProfit*Point,"buy start",0001,0,Green);
firstlowerdown=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-20*Point,0,0,Bid-20*Point-TakeProfit*Point,"SELL start",0001,0,Green);



{
int IleOtwartychPozycjiOczekujacych(int kierunek)
{
int Sell=0, Buy=0;

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











return(0);




}}

Dodano po 18 godzinach 55 minutach:

Po wielu błędach udało mi się usunąć błędy, ale EA nie działa poprawnie tzn. nie zamyka zleceń oczekujących po wejściu pierwszych. Może zamiast OrderDelete powinienem użyć jakiejś innej funkcji?

extern double TP = 20;
extern double Lot = 0.01;

//----
int IleOtwartychPozycji(int kierunek)
{
int Sell=0, Buy=0;

for (int i = 0; i < OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == 0001)
{
if (OrderType() == OP_BUYSTOP || OrderType() == OP_BUYLIMIT) Buy++;
if (OrderType() == OP_SELLSTOP || OrderType() == OP_SELLLIMIT) Sell++;
}
}
}

switch(kierunek)
{
case -1: return(Sell);
case 0: return(Buy+Sell);
case 1: return(Buy);
}
}
//----
int start() // Wejscie/funkcja start
{

int total, firstupperup, firstupperdown,firstlowerup, firstlowerdown;
//koniec zdefiniowanych
{

total=OrdersTotal();
if(total<1)
if (true)

{
if(AccountFreeMargin()<(1000*Lot))

{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if(total==0)
{
firstupperup=OrderSend(Symbol(),OP_BUYSTOP,Lot,Ask+20*Point,0,0,Ask+20*Point+TP*Point,"buy start",0001,0,Green);
firstupperdown=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Bid+20*Point,0,0,Bid+20*Point-TP*Point,"SELL start",0001,0,Green);

firstlowerup=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Ask-20*Point,0,0,Ask-20*Point+TP*Point,"buy start",0001,0,Green);
firstlowerdown=OrderSend(Symbol(),OP_SELLSTOP,Lot,Bid-20*Point,0,0,Bid-20*Point-TP*Point,"SELL start",0001,0,Green);

RefreshRates();

if( IleOtwartychPozycji(0)<3)
OrderDelete(firstupperup&&firstupperdown&&firstlowerup&&firstlowerdown);

return(0);
}}}}


Aha, i jeszcze jedno, dało by się przerobić tą funkcję tak aby obliczało oddzielnie ile jest buylimit, buystop, selllimit i sellstop?
wielkie dzięki za odpowiedź...

Awatar użytkownika
mikolaj2
Gaduła
Gaduła
Posty: 231
Rejestracja: 04 maja 2011, 14:37

Nieprzeczytany post autor: mikolaj2 »

Poniżej zamieszczam kod Trailing Stopa o który wcześniej prosiłem z nadzieją, że przyda się osobom rozpoczynającym przygodę z MQL-em

Kod: Zaznacz cały

void TStop()
{     
   
      OrderSelect(SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
      {
         if (OrderType() == OP_BUY) {
         if (OrderStopLoss() < Bid-Point*TS) OrderModify(OrderTicket(),0,Ask-Point*TS,OrderTakeProfit(),0,Red); }

         if (OrderType() == OP_SELL) {
         if (OrderStopLoss() > Bid+Point*TS) OrderModify(OrderTicket(),0,Ask+Point*TS,OrderTakeProfit(),0,Red); }

      }
   
}

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

mikolaj2 pisze:Poniżej zamieszczam kod Trailing Stopa o który wcześniej prosiłem z nadzieją, że przyda się osobom rozpoczynającym przygodę z MQL-em

Kod: Zaznacz cały

void TStop()
{     
   
      OrderSelect(SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
      {
         if (OrderType() == OP_BUY) {
         if (OrderStopLoss() < Bid-Point*TS) OrderModify(OrderTicket(),0,Ask-Point*TS,OrderTakeProfit(),0,Red); }

         if (OrderType() == OP_SELL) {
         if (OrderStopLoss() > Bid+Point*TS) OrderModify(OrderTicket(),0,Ask+Point*TS,OrderTakeProfit(),0,Red); }

      }
   
}
no kolego... niezle jak na poczatek....
ale jaki sens ma zamieszczanie funkcji ktora... nie ma mozliwosci funkcjonowac ?

juz w pierwszej linii kodu wewnatrz funkcji masz blad - brakuje ci podstawowego argumentu w wywolaniu OrderSelect() : index

powinno byc
bool OrderSelect(int index, int select, int pool=MODE_TRADES)

czyli np. w twojej funkcji napisalbym:

Kod: Zaznacz cały

void TStop(int x)
        {     
         OrderSelect(x, SELECT_BY_POS,  MODE_TRADES);
          ................
       }
dalej - no oczywiscie to autor decyduje w jakiej odleglosci ma byc ustawiony TS, wiec byc moze umieszczanie go w symetrycznej odleglosci w gore jak rowniez i w dol od wartosci Bid jest w tym przypadku celowe - ja jednak umieszczalbym je w odleglosci od Bid lub Ask - w zaleznosci od tego czy jest w gore czy w dol.... bo w ten sposob jak ty to zrobiles, to roznica TP w gore i w dol wynosi chyba 2*spread....

mysle, ze po prostu przekopiowales ta druga linie i zmieniles tylko znaki....
a o zamienienu Bid i Ask zapomniales :)
podobnie jak i o zmianie koloru ....

nie odbierz tego jako czepianie sie - ale skoro juz cos zamieszczasz, to postaraj sie troche wiecej.

Awatar użytkownika
mikolaj2
Gaduła
Gaduła
Posty: 231
Rejestracja: 04 maja 2011, 14:37

Nieprzeczytany post autor: mikolaj2 »

Dziękuję za wskazanie błędów - funkcja o dziwo działa (pomimo braku wspomnianego argumentu)... Kod wrzuciłem z myślą o początkujących użytkownikach, którzy poszukują rozwiązania problemu z TS... Następnym razem obiecują się poprawić :-)

Awatar użytkownika
CoVal
Gaduła
Gaduła
Posty: 320
Rejestracja: 06 paź 2005, 22:45

Nieprzeczytany post autor: CoVal »

mysle, ze funkcja ci dziala, ale trailuje tylko jedna pozycje:

parametry tak wpisane beda dzialaly, poniewaz funkcja OrderSelect() wymaga tylko 2 parametrow a trzeci jest domyslny.
Ty - wpisales tylko drugi i trzeci :) w tym wypadku OrderSelect() bierze sobie parametr: SELECT_BY_POS jako 'index', a opcjonalny; MODE_TRADES jako 'select'.
Funkcja dziala, bo tak na prawde wpisales:

Kod: Zaznacz cały

OrderSelect(0,0);
Pozdrawiam i zycze sukcesow !!!

maciejka
Bywalec
Bywalec
Posty: 18
Rejestracja: 28 kwie 2011, 21:00

Nieprzeczytany post autor: maciejka »

Witam,

chciałbym prosić o poradę.
Mam proste EA

Co wpisać w kod, aby na platformie w komentarzu wyświetlała się nazwa tego EA?

(Mam kilka takich samych EA z różnymi magic numbers ale nie moge dojść w historii który i kiedy wykonał transakcję.)

Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Nieprzeczytany post autor: personov »

W OrderSend() czwarte pole od końca. dajemy w cudzysłów.
Przykład :

Kod: Zaznacz cały

OrderSend(Symbol(),OP_BUY,lot,Ask,2,Ask-SL,Ask+TP,"tutaj komentarz",magic,0,Blue);
Solą życia jest kasa.

maciejka
Bywalec
Bywalec
Posty: 18
Rejestracja: 28 kwie 2011, 21:00

Nieprzeczytany post autor: maciejka »

personov pisze:W OrderSend() czwarte pole od końca. dajemy w cudzysłów.
Przykład :

Kod: Zaznacz cały

OrderSend(Symbol(),OP_BUY,lot,Ask,2,Ask-SL,Ask+TP,"tutaj komentarz",magic,0,Blue);
wielkie dzięki !!!

daniel.wro
Stały bywalec
Stały bywalec
Posty: 25
Rejestracja: 27 wrz 2011, 21:44

Nieprzeczytany post autor: daniel.wro »

Hej,

szybkie pytanko -

chce sprawdzic czy ostatnio zamknieta pozycja :

OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY);

zostala zamknieta poprzez Take/Profit, czy tez po innemu..

do glowy przychodzi mi tylko takie cos (celowo pisze w "") -

"OrderOpenPrice() + OrderProfit() = OrderTakeProfit()"

czy jakos inaczej?


pozdrawiam

Daniel

ODPOWIEDZ