Tylko jedna operacja podczas trwania świecy
Tylko jedna operacja podczas trwania świecy
Witam, wszystkich
szukam i kombinuje i
nie mogę sobie poradzić w EA z zabezpieczeniem, aby po spełnionym warunku gdy otwarta zostaje pozycja sytuacja się już nie powtórzyła podczas trwania tej samej godziny(świecy)
teraz mój robot otwiera pozycję i jeśli TP wystąpi za chwilę a warunki które trzeba było spełnić nadal się zgadzają otworzy kolejną, a chciałbym aby robot po spełnieniu warunków zadziałał tylko raz na danej świeczce
poradźcie co tu można wprowadzić jakaś pętla, może jest jakaś funkcja lub licznik ?
szukam i kombinuje i
nie mogę sobie poradzić w EA z zabezpieczeniem, aby po spełnionym warunku gdy otwarta zostaje pozycja sytuacja się już nie powtórzyła podczas trwania tej samej godziny(świecy)
teraz mój robot otwiera pozycję i jeśli TP wystąpi za chwilę a warunki które trzeba było spełnić nadal się zgadzają otworzy kolejną, a chciałbym aby robot po spełnieniu warunków zadziałał tylko raz na danej świeczce
poradźcie co tu można wprowadzić jakaś pętla, może jest jakaś funkcja lub licznik ?
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Tylko jedna operacja podczas trwania świecy
Witam
stwórz funkcje która sprawdza ostatnie zlecenie na historii i zwróć wartość iBarShift w oparciu o czas otwarcia pozycji OrderOpenTime jeżeli będzie 0 oznaczać to będzie że na danej świecy była już otwarta pozycja . Jako defaultową wartość funkcji daj -1.
stwórz funkcje która sprawdza ostatnie zlecenie na historii i zwróć wartość iBarShift w oparciu o czas otwarcia pozycji OrderOpenTime jeżeli będzie 0 oznaczać to będzie że na danej świecy była już otwarta pozycja . Jako defaultową wartość funkcji daj -1.
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Re: Tylko jedna operacja podczas trwania świecy
Ja mam coś takiego.
Kod: Zaznacz cały
//////////////////////////////////////////////////////////////////< >
bool bNewBar () //< >
{ //< >
// //< >
datetime static iTime_0 = 0; //< >
// //< >
if ( iTime_0 < iTime ( NULL , 0 , 0 ) ) //< >
{ iTime_0 = iTime ( NULL , 0 , 0 ) ; return ( TRUE ) ; }//< >
else { return ( FALSE ) ; } //< >
// //< >
} //< >
//////////////////////////////////////////////////////////////////< >
radical material simplification
Re: Tylko jedna operacja podczas trwania świecy
kombinowałem raczej z
Time[0]
i ewentualnie jakimś IF gdyby time !=0
ale marne skutki, wydaje mi się że powinno być coś prostszego od sięgania do historii, bo po prostu nie umiem twojego pomysłu zakodować
-- Dodano: pn 24-08-2015, 16:38 --
dzięki robs to już coś na kształt info które do tej pory znalazłem w sieci, tylko mam pytanie
bo wywala mi błąd że mogę to mieć tylko w sekcji global
a niestety nie widzi moich zmiennych
czy powinienem to wstawić do start()
Time[0]
i ewentualnie jakimś IF gdyby time !=0
ale marne skutki, wydaje mi się że powinno być coś prostszego od sięgania do historii, bo po prostu nie umiem twojego pomysłu zakodować
-- Dodano: pn 24-08-2015, 16:38 --
dzięki robs to już coś na kształt info które do tej pory znalazłem w sieci, tylko mam pytanie
bo wywala mi błąd że mogę to mieć tylko w sekcji global
a niestety nie widzi moich zmiennych
czy powinienem to wstawić do start()
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
Re: Tylko jedna operacja podczas trwania świecy
sięganie do historii nie jest takie trudne
oczywiście można skorzystać z funkcji IsNewBar ale pewniejsze z mojego punktu widzenia jest sprawdzenie historii ;-)
Kod: Zaznacz cały
int orders_history_bar(int order_type)
{
for(int i = OrdersHistoryTotal() - 1; i >= 0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) == false) continue;
if (magic_number == OrderMagicNumber() && OrderType() == order_type && Symbol() == OrderSymbol()) return iBarShift(Symbol(),Period(),OrderOpenTime());
}
return -1;
}
voi start()
{
.....
if (Twoje warunki dla buy && orders_history_bar(OP_BUY) != 0) otworz zlecenie buy
if (Twoje warunki dla sell && orders_history_bar(OP_SELL) != 0) otworz zlecenie sell
.....
}
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
Re: Tylko jedna operacja podczas trwania świecy
dziękuje dam znać jutro jak posżło, dziś już kończe
może nie jest trudne , jednak dziś siedzę cały czas nad plikiem PDF z kursem i dla nie programującego to jednak kosmos
nie ma szans żebym napisał coś takiego jak mi podesłałeś
jutro spróbuje to połączyć ze swoim kodem
może nie jest trudne , jednak dziś siedzę cały czas nad plikiem PDF z kursem i dla nie programującego to jednak kosmos
nie ma szans żebym napisał coś takiego jak mi podesłałeś
jutro spróbuje to połączyć ze swoim kodem
Re: Tylko jedna operacja podczas trwania świecy
więc po kilku dniach testów wszystko działa zdecydowałem się na rozwiązanie przez zmienną
kiedy dochodzi do otwarcia pozycji
ustawiam zmienną BLOKADA="TAK"
w warunkach otwarcia pozycji musi być spełniony warunek BLOKADA=="BRAK"
do wyzerowania zmiennej BLOKADA użyłem funkcji
isNewBar()
..... BLOKADA="NIE"
i efekt został osiągnięty
dzięki
kiedy dochodzi do otwarcia pozycji
ustawiam zmienną BLOKADA="TAK"
w warunkach otwarcia pozycji musi być spełniony warunek BLOKADA=="BRAK"
do wyzerowania zmiennej BLOKADA użyłem funkcji
isNewBar()
..... BLOKADA="NIE"
i efekt został osiągnięty
dzięki
Re: Tylko jedna operacja podczas trwania świecy
lub można tak
Kod: Zaznacz cały
int start()
{
if(IsNewBar())
{
if (countOrdersNumber(144)==0)
}
return(0);
}
bool countOrdersNumber(int magic_number)
{
bool found = false;
for (int i = OrdersTotal()-1 ; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if ((OrderMagicNumber() == magic_number) && (OrderSymbol() == Symbol()))
{
found = true;
break;
}
}
return(found);
}
Ten nie popełnia błędów kto nic nie robi
Re: Tylko jedna operacja podczas trwania świecy
Cześć, troszkę odświeżę (lepsze to nić otwieranie nowego tematu).
Mam ten sam problem - też chce zrobić blokadę wykonywania więcej jak jednej transakcji na świecy - załóżmy godzinowej (kupowanie/sprzedawnie idzie po ticku).
Nie zależy mi na typie transakcji więc order_type likwiduje - nurtuje mnie co daje na końcu: " != 0" w podanym kodzie??
czy może ten wykrzyknik jest potrzebny??
Mam ten sam problem - też chce zrobić blokadę wykonywania więcej jak jednej transakcji na świecy - załóżmy godzinowej (kupowanie/sprzedawnie idzie po ticku).
Nie zależy mi na typie transakcji więc order_type likwiduje - nurtuje mnie co daje na końcu: " != 0" w podanym kodzie??
i teraz przy piątku już nie potestuje w realu więc... czy kod powinien wyglądać tak:Pierz Andrzej pisze:sięganie do historii nie jest takie trudne
oczywiście można skorzystać z funkcji IsNewBar ale pewniejsze z mojego punktu widzenia jest sprawdzenie historii ;-)Kod: Zaznacz cały
int orders_history_bar(int order_type) { for(int i = OrdersHistoryTotal() - 1; i >= 0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) == false) continue; if (magic_number == OrderMagicNumber() && OrderType() == order_type && Symbol() == OrderSymbol()) return iBarShift(Symbol(),Period(),OrderOpenTime()); } return -1; } voi start() { ..... if (Twoje warunki dla buy && orders_history_bar(OP_BUY) != 0) otworz zlecenie buy if (Twoje warunki dla sell && orders_history_bar(OP_SELL) != 0) otworz zlecenie sell ..... }
Kod: Zaznacz cały
int orders_history_bar
{
for(int i = OrdersHistoryTotal() - 1; i >= 0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) == false) continue;
if (magic_number == OrderMagicNumber() && Symbol() == OrderSymbol()) return iBarShift(Symbol(),Period(),OrderOpenTime());
}
return -1;
}
voi start()
{
.....
if ( ((kup1 && kup2) || (kup3 && kup4) ) && orders_history_bar= 0) otworz zlecenie buy
.....
}
Kod: Zaznacz cały
voi start()
{
.....
if ( ((kup1 && kup2) || (kup3 && kup4) ) && orders_history_bar != 0) otworz zlecenie buy
.....
}
Re: Tylko jedna operacja podczas trwania świecy
Może zrób coś na zasadzie countera... Wstaw teraz do testera ten kod i zobacz w konsoli że co 15 minut będzie wyśwwietlało która jest minuta według tej instrukcji if (a(15)) { w onTick. Jak dasz 5 minut to będzie co 5 minut wyświetlało. Żeby wyświetlać co godzine trzeba wpisać 60, co 4 godziny 240 itd . Według tego będziesz miał w tej instrukcji jakąś zaplanowaną akcje co te x minut. W jforex jest to już zrobione jako standard i wystarczy wpisać coś takiego period.equlas(period.FIFTEEN_MIN)) i będzie co 15 minut wykonywało tą instrukcje. W testerze daj period M1 (1 minuta).
-- Dodano: 29 wrz 2018, 03:45 --
Zapomniałem o skalowaniu według otwartego timeframe. Bo jeśli na M1 to wszystko dzielisz przez 1, jeśli M5 to przez 5 itd. Więc to będzie wyglądało mniej więcej tak... funkcja scale() może zwracać dzielnik według otwartego TF, jeśli dasz w testerze M5 lub będziesz to miał na wykresie M5 na bieżąco wtedy będziesz mógł zmieniać TF na inne a scale() będzie zwracało dzielnik w zależności na jakim interwale jesteś i podstawiało do period = period / scale();
Może z tym pokombinuj...
-- Dodano: 29 wrz 2018, 09:09 --
Jednak to wyżej to jest średni pomysł, lepiej chyba zrobić to tak... sprawdzić resztę z dzielenia Minute() % period np 15. Tutaj ustawiłem dla przykładu że według losowej liczby będzie otwierało buy lub sell, jeśli random jest mniejsze lub większe od 100. I otowrzy tylko 1 pozycje ponieważ w funkcji jest if (OrdersTotal() > 0) return; które przerywa funkcje jeśli jest już otwarta jakaś pozycja. I najpierw zamyka zlecenie potem otwiera kolejne. Tutaj akurat ustawiłem co godzinę, czyli 60 minut na wejściu if (h(60))
-- Dodano: 29 wrz 2018, 09:11 --
tak samo testowane na M1 w testerze, wiec pewnie wymaga dodania scale() tak jak w przykładzie wyżej. Ale to już...
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| periodTestbeta1_29092018.mq4 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if (a(15)) {
Print( Minute() );
}
}
//+------------------------------------------------------------------+
int counter = 0;
bool start = false;
bool a(int period) {
int n = 0;
bool test = false;
if (counter < period + 1) {
counter ++;
}
if (counter == period + 1) {
counter = 1;
}
n = counter - 1;
if (n + period == period) {
//test = true; // pierwszy test musi zwracac false, potrzebne jest sprawdzenie tego jako bool start
if (start == true) {
test = true;
}
if (start == false) {
start = true;
}
} else {
test = false;
}
//Print( (n + period) + " " + (period) );
return test;
}
Zapomniałem o skalowaniu według otwartego timeframe. Bo jeśli na M1 to wszystko dzielisz przez 1, jeśli M5 to przez 5 itd. Więc to będzie wyglądało mniej więcej tak... funkcja scale() może zwracać dzielnik według otwartego TF, jeśli dasz w testerze M5 lub będziesz to miał na wykresie M5 na bieżąco wtedy będziesz mógł zmieniać TF na inne a scale() będzie zwracało dzielnik w zależności na jakim interwale jesteś i podstawiało do period = period / scale();
Kod: Zaznacz cały
bool start = false;
bool b(int period) {
int n = 0;
bool test = false;
period = period / scale();
if (counter < period + 1) {
counter ++;
}
if (counter == period + 1) {
counter = 1;
}
n = counter - 1;
if (n + period == period) {
//test = true; // pierwszy test musi zwracac false, potrzebne jest sprawdzenie tego jako bool start
if (start == true) {
test = true;
}
if (start == false) {
start = true;
}
} else {
test = false;
}
//Print( (n + period) + " " + (period) );
return test;
}
int scale() {
int n = 0;
if (Period() == PERIOD_M1) {
n = 1;
} else if (Period() == PERIOD_M5) {
n = 5;
} else if (Period() == PERIOD_M15) {
n = 15;
}
//. itd
return n;
}
-- Dodano: 29 wrz 2018, 09:09 --
Jednak to wyżej to jest średni pomysł, lepiej chyba zrobić to tak... sprawdzić resztę z dzielenia Minute() % period np 15. Tutaj ustawiłem dla przykładu że według losowej liczby będzie otwierało buy lub sell, jeśli random jest mniejsze lub większe od 100. I otowrzy tylko 1 pozycje ponieważ w funkcji jest if (OrdersTotal() > 0) return; które przerywa funkcje jeśli jest już otwarta jakaś pozycja. I najpierw zamyka zlecenie potem otwiera kolejne. Tutaj akurat ustawiłem co godzinę, czyli 60 minut na wejściu if (h(60))
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| periodTestbeta1_29092018.mq4 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
extern int MagicNumber = 100;
extern int Slippage = 3;
extern double LotSize = 0.1;
int _counter = 0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
if (h(60)) {
int random = MathRand() / 100;
if (random < 100) {
manuallyCloseOrder();
sendBuyOrder();
} else {
manuallyCloseOrder();
sendSellOrder();
}
//Print( random );
}
}
//+------------------------------------------------------------------+
bool h(int period) {
int n = 0;
bool d = false;
if ((Minute() % period) == 0) {
//Print( Minute() + " <<< " );
d = true;
} else {
//Print( Minute() );
d = false;
}
return d;
}
void sendBuyOrder() {
if (OrdersTotal() > 0) return;
OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0,"Buy[" + _counter +"]", MagicNumber, 0, clrGreen);
_counter++;
}
void sendSellOrder() {
if (OrdersTotal() > 0) return;
OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0,"Sell[" + _counter +"]", MagicNumber, 0, clrRed);
_counter++;
}
void manuallyCloseOrder() {
for(int i=OrdersTotal(); i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS)==true) {
if (OrderType() == 0) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, clrNONE);
} else if (OrderType() == 1) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, clrNONE);
}
}
}
}
tak samo testowane na M1 w testerze, wiec pewnie wymaga dodania scale() tak jak w przykładzie wyżej. Ale to już...