Optymalny zapis warunku

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
personov
Pasjonat
Pasjonat
Posty: 1525
Rejestracja: 09 sie 2009, 21:27

Nieprzeczytany post autor: personov »

Chciałbym zapisać w sensowny i skuteczny sposób następujacy warunek :
Jeśli zostaną spełnione pewne warunki wskaźnika to czeka na pojawienie sie nowej świecy i dopieo wtedy : zamyka BUY, otwiera SELL i zapisuje pewne wartości. Jeśli otwiera SELL to zamyka BUY i również zapisuje wartości.
To wszystko musi sie stać w momencie pojawienia się nowej świecy.
Używam do tego funkcji isNewBar().
Jako, że można jej użyć w kodzie tylko raz, zrobiłem to w ten sposób :

Kod: Zaznacz cały

double cenaB=0;
double cenaS=0;
double cenaclose=0;
int poziomB=0;
int poziomS=0;
int signal=0;

void start()
{ 
  if(...warunki sygnału dla buy...)signal=1;
  if(...warunki sygnału dla sell..)signal=2;
  
  if(isNewBar()){
  if(total(OP_BUY)==0 && signal==1 &&...dodatkowy warunek...)
  {ZamknijSell();OrderSend(...OP_BUY..);cenaB=Ask;cenaclose=0;cenaS=0;poziomS=0;}
  if(total(OP_SELL)==0 && signal==2 &&...dodatkowy warunek...)
  {ZamknijBuy();OrderSend(..OP_SELL...);cenaS=Bid;cenaclose=0;cenaB=0;poziomB=0;}
  }

}
////////////////////////////////////////////////////////////////
int total(int cmd)
{int sum=0;
 for(int i=0;i<=OrdersTotal();i++)
 {OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
 if(OrderSymbol()==Symbol()&&cmd==OrderType()&&MagicNumber==OrderMagicNumber()) sum++;
 }return(sum);} 
/////////////////////////////////////////////////////////////////
void ZamknijBuy() 
{ int i;
  for (i = 0; i < OrdersTotal(); i++)  
  {OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
  if (OrderSymbol() == Symbol()&& MagicNumber==OrderMagicNumber()) 
  {if (OrderType() == OP_BUY) 
  {OrderClose(OrderTicket(),OrderLots(),Bid,2,Black);}}}} 
/////////////////////////////////////////////////////////////////
void ZamknijSell() 
{ int i;  
  for (i = 0; i < OrdersTotal(); i++) 
  {OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
  if (OrderSymbol() == Symbol()&& MagicNumber==OrderMagicNumber()) 
  {if (OrderType() == OP_SELL) 
  {OrderClose(OrderTicket(),OrderLots(),Ask,2,Black);}}}}
///////////////////////////////////////////////////////////////////////// 
bool isNewBar() { 
 static int prevTime; 
 bool newBar=false; 
 if(Time[0]!=prevTime){ 
 newBar=true; 
 prevTime=Time[0];} 
 return(newBar);}
Niestety czasem zdarzy się, że nie wykona wszystkiego w klamrze. Np. po pojawieniu się nowej świecy zamknie transakcję, ale już nie otworzy następnej, otworzy ją dopiero na kolejnej świecy, czasem nie zapisuje którejś wartości...
A może jest lepszy sposób na zapisanie tego warunku ?
Macie na to jakiś SKUTECZNY pomysł ?

Dodano po 1 godzinach 25 minutach:

Problem jest jeszcze, że zamyka zlecenie, a aby otworzyć kolejne potrzeba nowego ticku. Jak już jest nowy tick to funkcja isNewBar jest już nieaktywna.
Solą życia jest kasa.

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

Nieprzeczytany post autor: Tig3r »

sprawdzaj wykonanie zlecenia w pętli while
przykład

Kod: Zaznacz cały

int i=-1;

while(i<0)
{
i=OrderClose(...);
Sleep(100);
}
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

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

Nieprzeczytany post autor: personov »

A sam warunek sformułowany przeze mnie jest dobry ?
Wydaje mi się, że jeśli zostaną spełnone warunki if() to cała klamra {}powinna zostać wykonana. A teraz czeka na kolejny tick.
Solą życia jest kasa.

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Wystaw dodatkowe zmienne globalne w których bedziesz zapsywał czy sygnał zaistniał.

Później zależnie od ich stanu sprawdzaj ponownie wskaźnik lub czekaj na otwarcie kolejnej świecy.

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

Nieprzeczytany post autor: personov »

Już teraz tak jest. Zapisywana jest zmienna signal.
Jeśli czegos nie wykona to zrobi to na kolejnej świecy. Tylko właśnie mi chodzi o to, żeby wszystko wykonało się na rozpoczęciu jednej świecy, jeśli nie to na kolejnym ticku. Ale na jeszcze kolejnej świecy to już jest trochę późno.
Solą życia jest kasa.

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

personov pisze:Już teraz tak jest. Zapisywana jest zmienna signal.
Jeśli czegos nie wykona to zrobi to na kolejnej świecy. Tylko właśnie mi chodzi o to, żeby wszystko wykonało się na rozpoczęciu jednej świecy, jeśli nie to na kolejnym ticku. Ale na jeszcze kolejnej świecy to już jest trochę późno.
Jezeli dobrze zrozumialem, to musisz zmodyfikowac funkcje isNewBar(), albo kolejnosc ifow

u Ciebie w kodzie po pierwszym sprawdzeniu ifa (wywolaniu isNewBar() ) wszytko sie sprwadza i dziala jak nalezy. Ale wiecej razy juz Ci ifa nie spradzi bo isNewBar() == false ; tzn. waruenk signal==2 i signal==1 powinienes wyciagnac na sama gore tzn. if( signal ==1){
if(isNewBar() && reszta warunkow
}

Pozdrawiam

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

Nieprzeczytany post autor: personov »

Dziękuję wam wszystkim za pomoc. Poszedlm drogą, którą wskazał Esco.
Dodałem dodatkową zmieną globalną, która załącza się w momencie kiedy jest sygnał i jednocześnie jet nowa świeca. Od tej pory watość tej zmiennej pozwala na wykonanie wszystkiego w klamrze, bez względu na to czy jest jeszcze moment nowej świecy.
Solą życia jest kasa.

259
Maniak
Maniak
Posty: 3968
Rejestracja: 15 cze 2011, 23:20

Nieprzeczytany post autor: 259 »

Zadziałało? Z tego co widzę to tak ;-)
Daj znać jak natrafisz na coś podobnego - w sensie czysto technicznego problemu stojącego w poprzek natchnienia - nie ma powodu aby te ulotne chwile gdy muzy szepczą do ucha (i nie tylko :-D ) rozbijały się o coś tak prozaicznego... chyba bluźnię czy jak?
Jakże często ludzie mają już gotową opinię zanim zdążą pojąć istotę rzeczy.
A gdy już ta istota w pełni do nich dotrze, jakże często muszą zmagać się z konsekwencjami swojej opinii ;-)

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

Nieprzeczytany post autor: CoVal »

259 pisze:Zadziałało? Z tego co widzę to tak ;-)
Daj znać jak natrafisz na coś podobnego - w sensie czysto technicznego problemu stojącego w poprzek natchnienia - nie ma powodu aby te ulotne chwile gdy muzy szepczą do ucha (i nie tylko :-D ) rozbijały się o coś tak prozaicznego... chyba bluźnię czy jak?
wow, nie wiedzialem, ze jest tyle poezji w programowaniu :) :564:

pzdr,

CoVal

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

Nieprzeczytany post autor: personov »

259 pisze:Zadziałało? Z tego co widzę to tak ;-)
Daj znać jak natrafisz na coś podobnego - w sensie czysto technicznego problemu stojącego w poprzek natchnienia - nie ma powodu aby te ulotne chwile gdy muzy szepczą do ucha (i nie tylko :-D ) rozbijały się o coś tak prozaicznego... chyba bluźnię czy jak?
Dzięki ALX za propozycję - jak coś to będę uderzał do Ciebie ;)
Solą życia jest kasa.

ODPOWIEDZ