Funkcja - zamykanie zlecenia na koniec swiecy

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
PF
Bywalec
Bywalec
Posty: 14
Rejestracja: 11 kwie 2010, 14:47

Nieprzeczytany post autor: PF »

Asia pisze:wielkie dzięki
potestuję

...

PF

NIE ZAMYKA
Cześć

W wolnej chwili popatrzę dlaczego nie działa(sprawdzę i poprawię),
i podeślę poprawioną wersję .


Pozdrawiam.

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

Nieprzeczytany post autor: Tig3r »

Eh.. Nie mogę patrzeć jak się wątek wlecze..

Kod: Zaznacz cały

if(isNewBar() ) ZamknijOtwartePozycje(0);

a tu funkcje

Kod: Zaznacz cały

bool isNewBar() {
 static int prevTime;
 bool newBar=false;

 if(Time[0]!=prevTime) {
  newBar=true;
  prevTime=Time[0];
 }
 return(newBar);
}


int ZamknijOtwartePozycje(int kierunek)
{
   for (int i = OrdersTotal(); i > 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA)
         {
            if (OrderType() == OP_BUY && kierunek >= 0)
               { // zamkniej BUY
               OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Blue);
               }
            if (OrderType() == OP_SELL && kierunek <=0)
               { // zamkniej SELL
               OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Blue);
               }
         }
      }
   }
}

 
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
Asia
Gaduła
Gaduła
Posty: 319
Rejestracja: 09 gru 2009, 02:00

Nieprzeczytany post autor: Asia »

Tygrysie
prawie
wszystko działa tzn zamyka na poczatku kolejnej świecy

jest tylko problem z pierwszym zleceniem
pierwszego nie zamyka
dopiero działa od drugiego
Czytaj p o w o l i
Dzień dobry, nazywam się ... jestem anonimowym hazardzistą/ką, gram na Forexie
Obrazek

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

mozesz tez "przeleciec" :P otwarte zlecnia i sprawdzic :

Kod: Zaznacz cały

iBarShift(Symbol(),Period(),OrderOpenTime());
i jezeli ta wartosc bedzie wieksza od 0 to zamknac to zlecenie

pzdr A

Dodano po 23 minutach:

lub
uzyj zmiennej globalnej o nazwie np "

Kod: Zaznacz cały

datetime time;
i zaraz po zlozeniu zlecenia przypisz do tej zmiennej czas akyualnej swiecy

Kod: Zaznacz cały

OrderSend(.....);
time=Time[0];
i podzcas dzialania experta poprostu sprawdzaj :

Kod: Zaznacz cały

if (/*odwolanie funkcji sprawdzajaca czy jest otwarte zleceni*/ && time!=Time[0]) /// tutaj odwolanie do funkcji zamykajacej pozycje
pzdr Andrzej

Awatar użytkownika
Asia
Gaduła
Gaduła
Posty: 319
Rejestracja: 09 gru 2009, 02:00

Nieprzeczytany post autor: Asia »

dzieki Andrzeju
ale ja taka madra nie jestem
żeby to na szybki "wcielić"

programuje głównie na zasadzie prób i błedów

podmieniłam u Tygrysa 0 na -1
i działa
Czytaj p o w o l i
Dzień dobry, nazywam się ... jestem anonimowym hazardzistą/ką, gram na Forexie
Obrazek

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

Nieprzeczytany post autor: personov »

Zrobiłem tak :

Kod: Zaznacz cały

if(isNewBar())ZamknijBuy();
      if(isNewBar())ZamknijSell();

////////////////////////////////////////////////
bool isNewBar() { 
 static int prevTime; 
 bool newBar=false; 

 if(Time[0]!=prevTime) { 
  newBar=true; 
  prevTime=Time[0]; 
 } 
 return(newBar); 
}
void ZamknijBuy() 
{      
   int i; 
    
   for (i = 0; i < OrdersTotal(); i++) 
   { 
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
      { 
         if (OrderType() == OP_BUY) 
         { 
            OrderClose(OrderTicket(), OrderLots(), Bid,3, Aqua); 
         } 
      } 
   } 
} 

void ZamknijSell() 
{      
   int i; 
    
   for (i = 0; i < OrdersTotal(); i++) 
   { 
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
      { 
         if (OrderType() == OP_SELL) 
         { 
            OrderClose(OrderTicket(), OrderLots(), Ask,3, Magenta); 
         } 
      } 
   } 
}
Wszystko się kompiluje, ale nie zamyka wogóle. Zlecenia są otwierane, ale nie zamykają się. Jaka może być przyczyna ?
Bez funkcji isNewBar, kiedy był inny warunek zamknięcia to wszystko się zamykało normalnie.

Dodano po 18 godzinach 58 minutach:

Nie widzę odpowiedzi. Na pewno każdy sobie myśli : a ...na pewno gdzieś tam w kodzie całego EA jest coś poplątane.
Aby ułatwić sprawę - na szybko skleciłem jakiś prosty kod z prostym warunkiem otwarcia i dodałem dokładnie to co napisał Tig3r z warunkiem zamknięcia.
Kompiluje się, otwiera pozycję, ale nie zamyka.
Podaję tym razem cały kod. Proszę o pomoc.

Kod: Zaznacz cały

#include <stdlib.mqh>
extern int    MagicNumber  = 99998;
extern int    TakeProfit   = 1000;
extern int    StopLoss     = 1000;
extern double lot          = 1;
///////////////////////////////////////////////////////////////////////////////////////////////////
void init()
{
   
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void deinit()
{

}
///////////////////////////////////////////////////////////////////////////////////////////////////
void start()
{
      if (total(OP_BUY )==0 && total(OP_SELL)==0 && Close[1]-Open[1]>0)send(OP_BUY);
      if (total(OP_SELL)==0 && total(OP_BUY )==0 && Close[1]-Open[1]<0)send(OP_SELL);
      if(isNewBar() ) ZamknijOtwartePozycje(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 send(int cmd)
{
   //if (total(cmd)>0) return;
   double Point_ = Point;
   if (Digits==3 || Digits==5) Point_=Point*10;
   double tp;
   double sl;
   double pr;
   color cl;
   if (cmd==OP_BUY)
   {
      pr = Ask;
      tp = Ask + TakeProfit*Point_;
      sl = Ask - StopLoss*Point_;
      cl = Blue;
   }  
   if (cmd==OP_SELL)
   {
      pr = Bid;
      tp = Bid - TakeProfit*Point_;
      sl = Bid + StopLoss*Point_;
      cl = Red;
   }  
   int ticket = OrderSend(Symbol(),cmd,lot,pr,0,sl,tp,"",MagicNumber,0,cl);
   if (ticket<=0) Print(ErrorDescription(GetLastError()));
}

/////////////////////////////////////////////////////////////////////////
bool isNewBar() { 
 static int prevTime; 
 bool newBar=false; 

 if(Time[0]!=prevTime) { 
  newBar=true; 
  prevTime=Time[0]; 
 } 
 return(newBar); 
} 


int ZamknijOtwartePozycje(int kierunek) 
{ 
   for (int i = OrdersTotal(); i > 0; i--) 
   { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
      { 
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) 
         { 
            if (OrderType() == OP_BUY && kierunek >= 0) 
               { // zamkniej BUY 
               OrderClose(OrderTicket(),OrderLots(),Bid,0,Blue); 
               } 
            if (OrderType() == OP_SELL && kierunek <=0) 
               { // zamkniej SELL 
               OrderClose(OrderTicket(),OrderLots(),Ask,0,Blue); 
               } 
         } 
      } 
   } 
}
Solą życia jest kasa.

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

Nieprzeczytany post autor: Tig3r »

Nie możęsz tak robić:

Kod: Zaznacz cały

if(isNewBar())ZamknijBuy(); 
if(isNewBar())ZamknijSell();
funkcje isNewBar może być wywołana tylko raz aby działała prawidłowo

możesz np tak:

Kod: Zaznacz cały

bool nowaSwieca=isNewBar();
if(nowaSwieca)
{
ZamknijSell();
ZamknijBuy();
}

w funkcjach zamykających zamiast:

Kod: Zaznacz cały

for (i = 0; i < OrdersTotal(); i++) 
używaj

Kod: Zaznacz cały

for (i = OrdersTotal(); i>=0 ; i--) 
gdyż jeśli usuniesz zlecenie to się przestawią ich numery i będzie błędnie wskazywało, jak dasz od końca to będzie ok
======================================================
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 »

W kodzie drugim wpisałem dokładnie tak jak piszesz i dalej nie zamyka. Z resztą w drugim kodzie skopiowałem dokładnie to co napisałeś w wcześniejszych postach.
Solą życia jest kasa.

Awatar użytkownika
xpep
Pasjonat
Pasjonat
Posty: 844
Rejestracja: 02 gru 2007, 11:50

Nieprzeczytany post autor: xpep »

Tig3r pisze:Kod:
for (i = OrdersTotal(); i>=0 ; i--)

gdyż jeśli usuniesz zlecenie to się przestawią ich numery i będzie błędnie wskazywało, jak dasz od końca to będzie ok
powinno byc

Kod: Zaznacz cały

OrdersTotal()-1
bo liczone sa od 0 ale to raczej nie jest powod dlaczego nie dziala

sprobuj tak

Kod: Zaznacz cały

if(isNewBar())
{ZamknijBuy(); 
ZamknijSell();
}

tak sobie mysle ze problem lezy pewnie w tym ze zamykasz po zlej cenie a nie ze funkcje ktore podal tiger sa zle, zobacz dziennik czy sa jakies bledy, funkcje sa ok

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

Nieprzeczytany post autor: personov »

xpep pisze:sprobuj tak Kod:
if(isNewBar())
{ZamknijBuy();
ZamknijSell();
}
Nadal nie zamyka. Z resztą ten drugi kod w moim poście to gotowiec - tylko wkleić i możesz sam spróbować. Zobaczysz, że nie zamyka. Tak po samym kodzie może niektórych rzeczy nie widać, ale napisałem ten kod abyście mogli sobie zobaczyć jak działa w praktyce.
Solą życia jest kasa.

ODPOWIEDZ