sterowanie zleceniem

O jezykach programowania w platformach i nie tylko.
djszaki
Bywalec
Bywalec
Posty: 15
Rejestracja: 17 sty 2017, 18:59

sterowanie zleceniem

Nieprzeczytany post autor: djszaki »

witam, chciałbym sterować danym zleceniem za pomocą MagicNumber, ustawiłem MagicNumber na 1, ale podczas wyświetlania MagicNumber wyświetla mi ciągle 0, co robię nie tak ?


#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict

extern double lot=0.01;
extern double sl=10;
extern double tp=10;
double pierwszeZlecenie;
double drugieZlecenie;
double cenaOtwarcia;
int CurrentMagic;

int OnInit()
{
RefreshRates();


return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{

}


void OnTick()
{

RefreshRates();

double BID = MarketInfo(Symbol(),MODE_BID);
double ASK = MarketInfo(Symbol(),MODE_ASK);


if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false)

{
OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"zle",1) ;


}
CurrentMagic = OrderMagicNumber();
cenaOtwarcia = OrderOpenPrice();
Comment("Aktualna cena BID ",BID, "\n", "Aktualna cena ASK ", ASK, "\n", "Magic number ", CurrentMagic , "\n");


}

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

Re: sterowanie zleceniem

Nieprzeczytany post autor: personov »

Formuła OrderSend() po numerze magic ma jeszcze wygasanie zlecenia i kolor strzałki. Dodaj po tej swojej jedynce 0 i np. Red.

Kod: Zaznacz cały

OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"zle",1,0,Red) ;
Solą życia jest kasa.

TesterForex
Stały bywalec
Stały bywalec
Posty: 43
Rejestracja: 22 gru 2016, 12:45

Re: sterowanie zleceniem

Nieprzeczytany post autor: TesterForex »

Tutaj problemem jest to, że pobierasz właściwości zlecenia przed jego zaznaczeniem (select)

Kod: Zaznacz cały

if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false)
Powyższy fragment kodu nie powoduje, że masz zaznaczone nowe zlecenie.

Po wystawieniu zlecenia musisz albo zapisać jego ticket i potem zaznaczyć po tickecie (ticket zwracany jest przez funkcję OrderSend) lub tak jak robiłeś w if'ie, czyli po indeksie.

Czyli:
1. Wystawiasz zlecenie
2. Zaznaczasz je

Kod: Zaznacz cały

OrderSelect(ticket,SELECT_BY_TICKET)
lub

Kod: Zaznacz cały

OrderSelect(0,SELECT_BY_POS)
3. Dopiero teraz masz dostęp do jego właściwości, czyli funkcji OrderMagicNumber() itp.
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch

djszaki
Bywalec
Bywalec
Posty: 15
Rejestracja: 17 sty 2017, 18:59

Re: sterowanie zleceniem

Nieprzeczytany post autor: djszaki »

witam, to chyba nie rozumiem,
zrobiłem coś takiego zgodnie z sugestią ale chyba nie do końca dorzbe

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict

extern double lot=0.01;
extern double sl=10;
extern double tp=10;
int ticket;
int numerPierwszegoZlecenia;

int OnInit()
{
RefreshRates();


return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{

}


void OnTick()
{
OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"komentarz",1); //tutaj zlecam kupno o magic number 1
OrderSelect(ticket,SELECT_BY_TICKET); //tutaj zaznaczam powyższe zlecenie i przypisuje magic number do 1 ?
numerPierwszegoZlecenia = OrderMagicNumber(); // tu taj przypisuje magic number do zmiennej ? ale jak bym miał drugie zlecenie to jak miałbym pobrać jego magic numer ?
Comment("Numer pierwszego zlecenia ", numerPierwszegoZlecenia); // tutaj chciałem wyświetlić numer magic 1 zlecenie

}

nie wiem czy dobrze rozumiem, ale jeśli mam dwa zlecenia o dwóch rożnych magic number to czy mogę później po numerach tych odnośić się do tych zleceń i np je zamykać zlecając zamknięcię na magic number ?

TesterForex
Stały bywalec
Stały bywalec
Posty: 43
Rejestracja: 22 gru 2016, 12:45

Re: sterowanie zleceniem

Nieprzeczytany post autor: TesterForex »

To może od początku, bo Ci się pomiesza. Na razie zostawmy też zaznaczanie po tickecie, bo widzę, że to też może być dla Ciebie mylące.

1. Wystawiasz sobie zlecenia tak jak to robisz teraz.
2. Zakładając, że masz kilka zleceń i chcesz coś zrobić tylko z tym/mi, które mają magic 1, robisz to tak (w najprostszej formie):

Kod: Zaznacz cały

//W pętli zaznacz wszystkie zlecenia po kolei
//OrdersTotal() zwraca liczbę wszystkich otwartych zleceń, również oczekujących
for(int i=0; i<OrdersTotal(); i++){
 
 //Zaznacz zlecenie o indeksie i
 OrderSelect( i, SELECT_BY_POS );
 
 //W tym miejscu masz dostęp do zaznaczonego zlecenia
 
 //Jeżeli magic zlecenia nie równa się 1, to przejdź do kolejnego kroku w pętli
 if( OrderMagicNumber() != 1 ) continue;

 //W tym miejscu umieść kod, który ma się wykonywać dla zleceń o numerze magic równym 1
 
}
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch

djszaki
Bywalec
Bywalec
Posty: 15
Rejestracja: 17 sty 2017, 18:59

Re: sterowanie zleceniem

Nieprzeczytany post autor: djszaki »

no ok, ale zakładamy, że chcę zrobić coś takiego:
robię dwa zlecenia
OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"komentarz",1)
OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"komentarz",2)

czyli rozumiem, że mam dwa zlecenia o magic number 1 oraz 2 po ktorych to właśnie mogę rozróżniać te zlecenia.

i teraz załóżmy że chcę coś zrobić ze zleceniem 1
to robię tak ?
np. Close (OrderSelect( 1, SELECT_BY_POS ) ) jeżeli chciałbym zamknąć zlecenie o magic number 1 ?, nie wiem czy Close polecenie jest ok w tym języku, ale chodzi mi tu bardziej o zrobienie czegoś z danym zleceniem.

i dalej jeżeli chciałbym drugie zlecenie zamknąć to robię
Close (OrderSelect( 2, SELECT_BY_POS ) ) ?

-- Dodano: 22 maja 2017, 11:58 --

chyba rozumiem,
czyli robię tak
po zleceniu np.
OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"komentarz",1)
OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"komentarz",2)

wybieram zlecenie o magic number 1
OrderSelect( 1, SELECT_BY_POS );
i w tym miejscu piszę jakąć operację np . bool OrderClose( ) ? jak bym chciał np. zamknąć zlecenie ?

a jeżeli chciałbym wybrać drugie zlecenie i na nim coś robić to robię tak:
OrderSelect( 2, SELECT_BY_POS );
i tutaj np. coś zmodyfikować bool OrderModify( int 2, double price, double stoploss, double
takeprofit, datetime expiration, color arrow_color=CLR_NONE)

tak ?

TesterForex
Stały bywalec
Stały bywalec
Posty: 43
Rejestracja: 22 gru 2016, 12:45

Re: sterowanie zleceniem

Nieprzeczytany post autor: TesterForex »

Nie do końca. Magic to nie jest to samo co indeks zlecenia. Nie możesz "zazaczyć" zlecenia po magicu.
Musisz robić tak jak napisałem poprzednio, zaznaczasz wszystkie zlecenia po kolei (po indeksie, czyli SELECT_BY_POS).
Dopiero po zaznaczeniu danego zlecenia możesz sprawdzić jaki ma numer magic. Jak ma taki numer magic jak chcesz, to coś robisz z tym zleceniem, a jak nie to przechodzisz do kolejnego kroku w pętli.

Może to zaznaczanie jest dziwne i nie kapujesz ogólnej idei . Wyobraź sobie, że jest jakaś tabelka przechowująca informacje o zleceniu (magic, cena otwarcia, profit itp). Mieści się tam info tylko o jednym zleceniu. To info (zwykle numer ticketu) będzie potrzebne do zarządzania tym zleceniem.

1. Wywołujesz funkcję OrderSelect(0, SELECT_BY_POS)
2. Teraz tabelka wypełniona jest danymi zlecenia o indeksie 0 (o ile takie zlecenie istnieje oczywiście)
W tym miejscu, wywołując funkcje typu OrderMagicNumber(), OrderLots(), OrderProfit() będziesz otrzymywał wartości dla tego zlecenia.

3. Wywołujesz funkcję OrderSelect(1, SELECT_BY_POS)
4. Teraz masz dostęp do danych zlecenia o indeksie 1

Czyli odnosząc się do Twojego przykładu, chcesz zamknąć zlecenie/a z magiciem 1.
Tak wygląda funkcja Close w MQL:
https://docs.mql4.com/trading/orderclose

Kod: Zaznacz cały

for( int i=0; i<OrdersTotal(); i++ ){

 OrderSelect(i, SELECT_BY_POS);
 //"tabelka" wypełnia się danymi zlecenia o indeksie i

 if( OrderMagicNumber() != 1 ) continue;
 
 //Tu wykorzystuje się dane z "tabelki"
 OrderClose(OrderTicket(), OrderLots(), Ask, 50);

} 
====
To co dopisałeś w edycji posta już jest prawie ok. Została tylko kwestia tego, że magic to nie to samo co indeks, ale to opisałem w odpowiedzi.
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch

djszaki
Bywalec
Bywalec
Posty: 15
Rejestracja: 17 sty 2017, 18:59

Re: sterowanie zleceniem

Nieprzeczytany post autor: djszaki »

to jeszcze jedno, napisałeś, że:
1. wystawiam zlecenie
OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"komentarz",1)

2. później zaznaczam po :
OrderSelect(ticket,SELECT_BY_TICKET)

lub

OrderSelect(0,SELECT_BY_POS)


3. to indeks tego zlecenia to 0 ? skąd mam wiedzieć jaki numer tego indeksu ma dane zlecenie ?
kurcze nie czaje :)

4. jak dam dwa takie zlecenia:
OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"komentarz",1)
OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"komentarz",1)

to numer indeksu robi się automatycznie dla pierwszego 0 a dla drugiego 1 ?


5. konkretnie na przykładzie mam jedno zlecenie

OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"komentarz",1)
to żeby wejść to tego zlecenia to muszę podać
OrderSelect(0, SELECT_BY_POS);
i tu dopiero sobie pobierać wartości z tabeli zgadza się ?

a jeżeli miałbym kolejne zlecenia to indeks każdego zlecenia jest dodawany automatycznie ?

TesterForex
Stały bywalec
Stały bywalec
Posty: 43
Rejestracja: 22 gru 2016, 12:45

Re: sterowanie zleceniem

Nieprzeczytany post autor: TesterForex »

Odnośnie ticketu
Ticket nadawany jest zleceniu po wysłaniu go na serwer MT4, jest to unikalny numer każdego zlecenia.
Funkcja OrderSend() zwraca numer ticketu.

Czyli, jeśli zrobisz coś takiego:
new_ticket = OrderSend(...)
To zmienna new_ticket przechowuje numer ticket zlecenia, które właśnie wysłałeś.
Dopiero jak znasz konkretny numer ticket, to możesz zaznaczać zlecenia po tickecie.
Z tego względu napisałem, że na razie możemy to pominąć, bo pewnie w ogóle Ci się to nie przyda w najbliższym czasie.

Odnośnie indeksu
Wraz ze złożeniem nowego zlecenia platforma MetaTrader będzie przechowywała je pod kolejnym wolnym indeksem. Indeksy aktualizują się też po skasowaniu jakiegoś zlecenia.

Czyli jest dokładnie tak jak napisałeś, indeksy robią się automatycznie.
Masz jedno zlecenie - znajduje się ono pod indeksem 0.
Robisz kolejne - to nowe ma indeks 1.
Kasujesz pierwsze - drugie zlecenie wskakuje na indeks 0

Dlatego właśnie, jak chcesz coś zrobić z konkretnym zleceniem, to trzeba zaznaczać wszystkie i je po kolei sprawdzać. No chyba, że znasz ticket danego zlecenia.

Odnośnie punktu 5
Zgadza się, czyli chyba już rozumiesz co i jak.
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch

djszaki
Bywalec
Bywalec
Posty: 15
Rejestracja: 17 sty 2017, 18:59

Re: sterowanie zleceniem

Nieprzeczytany post autor: djszaki »

oki to już wszystko jasne, tak mi się wydaję :), przetestuje i obaczę

-- Dodano: 22 maja 2017, 15:54 --

no i kolejny problem, chcę otworzyć dwa zlecenia, sprawdzam ifem czy zlecenie o index 1 i index 2 isteniej, jeżeli nie to mają być zlecone

if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false && OrderSelect(1,SELECT_BY_POS,MODE_TRADES)==false)
{
OrderSend(Symbol(),OP_SELL, lot, Bid, 50, Ask+sl, Bid-tp,"zle",1) ;
OrderSelect(0,SELECT_BY_POS);
numerZlecenia = OrderMagicNumber();
cenaOtwarcia = OrderOpenPrice();

OrderSend(Symbol(),OP_BUY, lot, Ask, 50, Bid-sl, Bid+tp,"dobrze",2) ;
OrderSelect(2,SELECT_BY_POS);
numerDrugiegoZlecenia = OrderMagicNumber();
cenaOtwarciaDrugiegoZlecenia = OrderOpenPrice();

}

no i wykonuję się tylko 1 zlecenie pierwsze na sell, a drugie nie:(, magicNumber dla pierwszego zlecenia wyświetla się prawidłowo :)

ODPOWIEDZ