Co jest źle? Po tym czasie ma się otworzyć nowe zle...

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
borysewicz
Stały bywalec
Stały bywalec
Posty: 75
Rejestracja: 01 gru 2008, 21:17

Nieprzeczytany post autor: borysewicz »

Cześć

Może ktoś z was zobaczy gdzie jest błąd, bo ja już się poddaje :x

Po otwartej pozycji EA ma odczekać czas, jaki jest w zmiennej "czasOtwKolejTra " po tym czasie może otwierać kolejną transakcję o ile spełnią sie warunki wejścia. Tak jest przez kilka transakcji po tych kilku transakcjach nic się nie otwiera, dlaczego?

Kod: Zaznacz cały


extern int czasOtwKolejTra = 240; // czas jaki maodczekac od ostatniej tranzakcji

datetime time1,time2;
bool okgo;
  
double Sell1_3; 
double Sell1_2; 
double Sell1_1; 

bool isAvailableOrder()// 
{ 
   if (OrdersTotal() < 1) 
   { 
      return(true); 
   } 
   return(false); 
} 

int init() 
  { 
//---- 
    okgo=true;
//---- 
   return(0); 
  } 

int deinit() 
  { 
//---- 
    
//---- 
   return(0); 
  } 

int start() 
  { 
  
 Sell1_3=iRSI(NULL,PERIOD_M5,3,0,3); 
 Sell1_2=iRSI(NULL,PERIOD_M5,3,0,2); 
 Sell1_1=iRSI(NULL,PERIOD_M5,3,0,1); 

//-------------------------------------------------------odlicza czas od staniej pozycji---- 
     if (time1+czasOtwKolejTra*60==TimeCurrent()) time2=Time[0]; 
if (time2==Time[0])okgo=true;
//-------------------------------------------------------
if (okgo==true)
{
   if (isAvailableOrder()) 
   { 
//---- 
if ( 
Sell1_1 > Sell1_2 && 
Sell1_2 < Sell1_3 
) 
{ 
OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask - 30*Point,Ask+30*Point,"Faraon",728446,0,Green); 
okgo=false;
time1=TimeCurrent();//zapisuje czas  biezacej swieczki
} 
//---- 
if ( 
Sell1_1 < Sell1_2 && 
Sell1_2 > Sell1_3 
) 
{ 
OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid + 30*Point,Bid-30*Point,"Faraon",728446,0,Red); 
okgo=false;
time1=TimeCurrent();//zapisuje czas  biezacej swieczki
} 
   } 
   }
//---- 
   return(0); 
  } 
//+------------------------------------------------------------------+


Dodano po 4 godzinach 7 minutach:

Jak nie mam błędów to może znacie inne sposoby na opóźnienie otwarcia kolejnego zlecenia?
Nie ma nic bardziej niezwykłego od przewidzenia czegoś co nie jest takie oczywiste.

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

Nieprzeczytany post autor: Tig3r »

nie patrząc w kod, jeśli chcesz opóźnić otwarcie kolejnego zlecenia to:
1. zapamiętujesz czas ostatniego otwarcia i zezwalasz na kolejny jak minie odpowiedni czas
2. przy tradzie określasz ile świec ma czekać i co świece zmniejszasz tą liczbę, jak dojdzie do 0 to zezwalasz na trede - nie wcześniej
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
borysewicz
Stały bywalec
Stały bywalec
Posty: 75
Rejestracja: 01 gru 2008, 21:17

Nieprzeczytany post autor: borysewicz »

Tig3r pisze: 2. przy tradzie określasz ile świec ma czekać i co świece zmniejszasz tą liczbę, jak dojdzie do 0 to zezwalasz na trede - nie wcześniej
Tymi słowami ruszyłeś moje szare komórki do myślenia. Nie potrzebnie kombinowałem z czasem jak wystarczyło zrobić to na świecach :D

Co prawda prymitywne rozwiązanie ale za to proste i skuteczne.

Jak ktoś będzie potrzebował oto rozwiązanie:

Kod: Zaznacz cały


extern int czasOtwKolejTra = 48; // czas jaki maodczekac od ostatniej tranzakcji (liczba swiec)

double zapisPszyOtwarciu;//czasOtwKolejTra
  
double Sell1_3; 
double Sell1_2; 
double Sell1_1; 

bool isAvailableOrder()// 
{ 
   if (OrdersTotal() < 1) 
   { 
      return(true); 
   } 
   return(false); 
} 

//+------------------------------------------------------------------+ 
//| expert initialization function                                   | 
//+------------------------------------------------------------------+ 
int init() 
  { 
//---- 
    zapisPszyOtwarciu = 0;
//---- 
   return(0); 
  } 
//+------------------------------------------------------------------+ 
//| expert deinitialization function                                 | 
//+------------------------------------------------------------------+ 
int deinit() 
  { 
//---- 
    
//---- 
   return(0); 
  } 
//+------------------------------------------------------------------+ 
//| expert start function                                            | 
//+------------------------------------------------------------------+ 
int start() 
  { 
  
 if (NewBar()){
 if (zapisPszyOtwarciu >0){
 zapisPszyOtwarciu -= 1;
 }
 }

 Sell1_3=iRSI(NULL,PERIOD_M5,3,0,3); 
 Sell1_2=iRSI(NULL,PERIOD_M5,3,0,2); 
 Sell1_1=iRSI(NULL,PERIOD_M5,3,0,1); 


   if (isAvailableOrder()) 
   { 
if ( (zapisPszyOtwarciu == 0)&&
Sell1_1 > Sell1_2 && 
Sell1_2 < Sell1_3 
) 
{ 
OrderSend(Symbol(),OP_BUY,0.1,Ask,0,Ask - 30*Point,Ask+30*Point,"Faraon",728446,0,Green); 
zapisPszyOtwarciu += czasOtwKolejTra;
} 

//---- 
if ( (zapisPszyOtwarciu == 0)&&
Sell1_1 < Sell1_2 && 
Sell1_2 > Sell1_3 
) 
{ 
OrderSend(Symbol(),OP_SELL,0.1,Bid,0,Bid + 30*Point,Bid-30*Point,"Faraon",728446,0,Red); 
zapisPszyOtwarciu += czasOtwKolejTra;
} 
    
   }
   
   
   

//---- 
   return(0); 
  } 

bool NewBar()
{
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
}

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

Nieprzeczytany post autor: Tig3r »

to samo możesz zrobić z czasem.

zapamiętujesz czas ostatniego zlecenia

Kod: Zaznacz cały

datetime lastCzas=TimeCurrent();
następnie sprawdzasz czy już minął odpowiedni czas aby zawrzeć kolejny trade:

Kod: Zaznacz cały

if(lastCzas+X<=TimeCurrent()) {}
i wsio, X podany w sekundach

wolę podać komuś wędkę zamiast ryby
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

ODPOWIEDZ