Please help - otwieranie pojedyńczego zlecenia do TP lub SL

O jezykach programowania w platformach i nie tylko.
nunxt
Bywalec
Bywalec
Posty: 18
Rejestracja: 15 cze 2010, 01:22

Please help - otwieranie pojedyńczego zlecenia do TP lub SL

Nieprzeczytany post autor: nunxt »

Witam,
Niedawno zacząłem uczyć się programowania robotów. Mam problem z napisaniem funkcji dla robota nad którym pracuję. Chce aby robot kupował powiedzmy 1 lota w momencie gdy cena przebije najwyższą wartość z ostatnich 20 świeczek o 2 pipsy - coś ala Donchian channel. W momencie gdy przedostatnia świeczka jest nowym maximum nie ma nowej transakcji, a wyjście ustala TP lub SL. Wydaje mi się że większość kodu mam ok. ale problem w tym że robot otwiera wiele transakcji jednocześnie. Chciałbym żeby otworzył pojedyńczą transakcję przy wyznaczonych warunkach po czym poczekał aż zrealizuje się TP lub SL i dopiero przy nastepnych sprzyjajacych okolicznościach otworzył kolejną. Zawsze tylko jedna transakcja ma być otwarta. Lub może funkcja typy : można otworzyć tylko jedną transakcję na pojedyńczej świeczce. Z góry dziękuję za pomoc




// Buy order
if(Ask > HighestShift && High[1] <= High[0] && BuyTicket == 0)

{
OrderSelect(SellTicket,SELECT_BY_TICKET);

double OpenPrice = High[HighestShift] + (2 * UsePoint);

// Calculate stop loss and take profit
if(StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * UsePoint);
if(TakeProfit > 0) double BuyTakeProfit = OpenPrice + (TakeProfit * UsePoint);

// Open buy order
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,
BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);

SellTicket = 0;
}

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Zanim wywołasz funkcję w której dokonujesz transakcji sprawdzaj czy już masz otwartą jakaś pozycje.

eddek
Gaduła
Gaduła
Posty: 119
Rejestracja: 05 mar 2009, 08:42

Nieprzeczytany post autor: eddek »

Kod: Zaznacz cały

if(OrdersTotal()==0){
//otwieranie pozycji
}
OrdersTotal zlicza także zlecenia oczekujące.

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

eddek To nie jest dobre rozwiązanie - chyba że tylko to jedno EA gra na koncie.

Wystarczy przejechać po wszystkich aktywnych zleceniach i zliczyć te które mają MAGIC danego EA. Jeśli jest 0 to trade.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

eddek
Gaduła
Gaduła
Posty: 119
Rejestracja: 05 mar 2009, 08:42

Nieprzeczytany post autor: eddek »

To wiem, ale nie będę tak ułatwiać. Niech sam do tego dojdzie. :-)

nunxt
Bywalec
Bywalec
Posty: 18
Rejestracja: 15 cze 2010, 01:22

Nieprzeczytany post autor: nunxt »

Dzięki za pomoc, póki co tylko 1 EA będzie grał na koncie więc dodam kawałek kodu od eddka, ale Tig3r jeśli możesz napisać mi funkcję która sprawdza wszystkie aktywne zlecenia poprzez MagicNumber byłbym wdzięczny. :D

Dodano po 51 minutach:

Wprowadziłem zmiany o których mowił eddek, ale wygląda na to że z jakiegoś powodu EA otwiera tylko buy order, ani jednego sell short !? załączam kod do wglądu:

if(OrdersTotal() == 0)
{
// Buy order
if(Ask > HighestShift && High[1] <= High[0] && BuyTicket == 0)

{
// OrderSelect(SellTicket,SELECT_BY_TICKET);

double OpenPrice = High[HighestShift] + (2 * UsePoint);

// Calculate stop loss and take profit
if(StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * UsePoint);
if(TakeProfit > 0) double BuyTakeProfit = OpenPrice + (TakeProfit * UsePoint);

// Open buy order
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,
BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);

SellTicket = 0;
}
}

if(OrdersTotal() == 0)
{
// Sell order
if(Bid < LowestShift && Low[1] >= Low[0] && SellTicket == 0)

{
// OrderSelect(BuyTicket,SELECT_BY_TICKET);

OpenPrice = Low[LowestShift] - (2 * UsePoint);

if(StopLoss > 0) double SellStopLoss = OpenPrice + (StopLoss * UsePoint);
if(TakeProfit > 0) double SellTakeProfit = OpenPrice - (TakeProfit * UsePoint);

SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,OpenPrice,UseSlippage,
SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);

BuyTicket = 0;
}
}

return(0);
}

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

nunxt pisze:Tig3r jeśli możesz napisać mi funkcję która sprawdza wszystkie aktywne zlecenia poprzez MagicNumber byłbym wdzięczny. Very Happy
Mógłbym ale tego nie zrobię. Wszystkie klocki potrzebne masz, mogę służyć radą i dać wędkę ale nie rybę.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

nunxt
Bywalec
Bywalec
Posty: 18
Rejestracja: 15 cze 2010, 01:22

Nieprzeczytany post autor: nunxt »

fair enough.
a patrzc na drugi problem, dlaczego po wprowadzeniu kodu eddka EA nie chce otwierać shortów - sell orderów. mam same buy orders :cry:

rrozak
Stały bywalec
Stały bywalec
Posty: 76
Rejestracja: 19 mar 2010, 16:43

Nieprzeczytany post autor: rrozak »

Zajrzyj sobie do przykładowych EA, które otrzymałeś razem z instalacją MT4 (przynajmniej instalki od XTB to zawierają). To całkiem dobry punkt wyjścia do realizacji własnych pomysłów.

nunxt
Bywalec
Bywalec
Posty: 18
Rejestracja: 15 cze 2010, 01:22

Nieprzeczytany post autor: nunxt »

mam taki kawałek kodu ktory ma pozwalac na tylko jedna transakcje na danej swieczce, problem w tym ze nie wiem w ktorym momencie mojego EA powinienem go wstawic. czy moze mi ktos pomoc?

datetime Time0 = 0;

void start()
{
if (Time0 != Time[0])
{
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice1,UseSlippage,
BuyStopLoss,BuyTakeProfit,"Buy Order",Magi......
Time[0] = Time[0];
}
}

ODPOWIEDZ