EA

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
bucho1504
Stały bywalec
Stały bywalec
Posty: 55
Rejestracja: 01 sie 2008, 21:46

EA

Nieprzeczytany post autor: bucho1504 »

Mam prośbę do was nie wiem jak sobie z tym poradzić :-) chciałbym aby po wykonaniu się SL automatycznie wykonało by mi zlecenie przeciwstawne tzn
miałem otwartą pozycje BUY zamknęło mi na SL i otworzyło od razu SELL

int OpenLong1(double volume=0.1)
// the function opens a long position with lot size=volume
{
int slippage=0;
string comment="(Long1)";
color arrow_color=Red;
int magic=0;

if (GlobalVariableGet("globalBalans")>AccountBalance()) volume=lot*BigLotSize;
// if (GlobalVariableGet("globalBalans")>AccountBalance()) if (AutoLot) LotSize();

ticket=OrderSend(Symbol(),OP_BUY,volume,Ask,slippage,Ask-StopLoss_L*Point,
Ask+TakeProfit_L*Point,comment,magic,0,arrow_color);

z góry dzięki za wysiłek :-)
Ten nie popełnia błędów kto nic nie robi

daniel.wro
Stały bywalec
Stały bywalec
Posty: 25
Rejestracja: 27 wrz 2011, 21:44

Nieprzeczytany post autor: daniel.wro »

hej,

nie wiem szczerze co robi Twoj kod ktory wklejasz, ale to co potrzebujesz moze wygladac np. tak:

Kod: Zaznacz cały

int start() {

   if (lastBuyOrderSL() && !anyOpenOrder()) {
      doSell();
   }
   else if (lastSellOrderSL() && !anyOpenOrder()) {
      doBuy();
   }
   return(0);
}


bool lastBuyOrderSL() {

   OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY);
   if(OrderType() == OP_BUY && OrderClosePrice() <= OrderStopLoss()) {
      return(True);
   }
   return(False);
}

bool lastSellOrderSL() {

   OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY);
   if(OrderType() == OP_SELL && OrderClosePrice() >= OrderStopLoss()) {
      return(True);
   }
   return(False);
}

bool anyOpenOrder() {

   return(OrdersTotal()>0);
}


bool doBuy() {

   ...
}

bool doSell() {

   ...
}

doBuy() i doSell() wg. wlasnych preferencji sobie dopisz


pozdrawiam

Daniel

Awatar użytkownika
bucho1504
Stały bywalec
Stały bywalec
Posty: 55
Rejestracja: 01 sie 2008, 21:46

Nieprzeczytany post autor: bucho1504 »

jest to tylko funkcja otwierania pozycji :-)
serce mam inne :-) wygląda tak
int start()
{
if((TimeHour(TimeCurrent())>TradeTime_1)) cantrade=true;
// check if there are open orders ...

{
// ... if no open orders, go further
// check if it's time for trade
if((TimeHour(TimeCurrent())==TradeTime_1)&&(cantrade))
{
// ... if it is
if ((((Close[t1]+Low[t1])+1)<(High[t1]+Open[t1]))) //if it is
{
//condition is fulfilled, enter a short position:
// check if there is free money for opening a short position
if(AccountFreeMarginCheck(Symbol(),OP_SELL,lot)<=0 || GetLastError()==134)
{
Print("Not enough money");
return(0);
}
OpenShort(0.02);

cantrade=false; //prohibit repeated trade until the next bar
return(0);
}
Ten nie popełnia błędów kto nic nie robi

daniel.wro
Stały bywalec
Stały bywalec
Posty: 25
Rejestracja: 27 wrz 2011, 21:44

Nieprzeczytany post autor: daniel.wro »

no to ja nie pomoge wiecej.. niestety nie wiem co robi Twoje EA (moze wklej cale)..

albo chociaz napisz cos o tym -

if ((((Close[t1]+Low[t1])+1)<(High[t1]+Open[t1]))) ???


pozdrawiam

Daniel

Awatar użytkownika
bucho1504
Stały bywalec
Stały bywalec
Posty: 55
Rejestracja: 01 sie 2008, 21:46

Nieprzeczytany post autor: bucho1504 »

Oki coś pomyśle nad tym może się mi uda stworzyć:-)
a tak wygląda całość :-)



int TakeProfit_L = 50; // Take Profit in points
int StopLoss_L = 50; // Stop Loss in points
extern int TakeProfit_S = 50; // Take Profit in points
int StopLoss_S = 50; // Stop Loss in points
extern int TradeTime=1; // Time to enter the market
int t1=1;
int t2=2;
int delta_L=4;
int delta_S=4;
double lot = 0.01; // Lot size
int Orders=1; // maximal number of positions opened at a time }
int MaxOpenTime=5004;
int BigLotSize = 10; // By how much lot size is multiplicated in Big lot
bool AutoLot=true;

int ticket,total,cnt;
bool cantrade=true;
double closeprice;
double tmp;

int LotSize()
// The function opens a short position with lot size=volume
{
if (AccountBalance()>=100) lot=0.02;



}

int globPos()
// the function calculates big lot size
{
int v1=GlobalVariableGet("globalPosic");
GlobalVariableSet("globalPosic",v1+1);
return(0);
}

int OpenLong(double volume=0.1)
// the function opens a long position with lot size=volume
{
int slippage=0;
string comment="(Long)";
color arrow_color=Red;
int magic=0;

if (GlobalVariableGet("globalBalans")>AccountBalance()) volume=lot*BigLotSize;
// if (GlobalVariableGet("globalBalans")>AccountBalance()) if (AutoLot) LotSize();

ticket=OrderSend(Symbol(),OP_BUY,volume,Ask,slippage,Ask-StopLoss_L*Point,
Ask+TakeProfit_L*Point,comment,magic,0,arrow_color);

GlobalVariableSet("globalBalans",AccountBalance());
globPos();
// if (GlobalVariableGet("globalPosic")>25)
// {
GlobalVariableSet("globalPosic",0);
if (AutoLot) LotSize();
// }

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
return(0);
}
else
{
Print("OpenLong(),OrderSelect() - returned an error : ",GetLastError());
return(-1);
}
}
else
{
Print("Error opening Buy order : ",GetLastError());
return(-1);
}
}

int OpenShort(double volume=0.1)
// The function opens a short position with lot size=volume
{
int slippage=0;
string comment="SHORT";
color arrow_color=Red;
int magic=0;

if (GlobalVariableGet("globalBalans")>AccountBalance()) volume=lot*BigLotSize;

ticket=OrderSend(Symbol(),OP_SELL,volume,Bid,slippage,Bid+StopLoss_S*Point,
Bid-TakeProfit_S*Point,comment,magic,0,arrow_color);
GlobalVariableSet("globalBalans",AccountBalance());
globPos();
// if (GlobalVariableGet("globalPosic")>25)
// {
GlobalVariableSet("globalPosic",0);
if (AutoLot) LotSize();
// }

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
return(0);
}
else
{
Print("OpenShort(),OrderSelect() - returned an error : ",GetLastError());
return(-1);
}
}
else
{
Print("Error opening Sell order : ",GetLastError());
return(-1);
}
}

int init()
{
// control of a variable before using
if (AutoLot) LotSize();
if(!GlobalVariableCheck("globalBalans"))
GlobalVariableSet("globalBalans",AccountBalance());
if(!GlobalVariableCheck("globalPosic"))
GlobalVariableSet("globalPosic",0);
return(0);
}

int deinit()
{
return(0);
}

int start()
{
if((TimeHour(TimeCurrent())>TradeTime)) cantrade=true;
// check if there are open orders ...
total=OrdersTotal();
if(total<Orders)
{
// ... if no open orders, go further
// check if it's time for trade
if((TimeHour(TimeCurrent())==TradeTime)&&(cantrade))
{
// ... if it is
if (((High[t1]-Low[t1])>((High[t2]-Low[t2])*delta_S))) //if it is
if (Close[t1]<Close[t2])

{
//condition is fulfilled, enter a short position:
// check if there is free money for opening a short position
if(AccountFreeMarginCheck(Symbol(),OP_SELL,lot)<=0 || GetLastError()==134)
{
Print("Not enough money");
return(0);
}
OpenShort(lot);

cantrade=false; //prohibit repeated trade until the next bar
return(0);
}
if (((High[t1]-Low[t1])>((High[t2]-Low[t2])*delta_L))) //if the price increased by delta
if (Close[t1]>Close[t2])

{
// condition is fulfilled, enter a long position
// check if there is free money
if(AccountFreeMarginCheck(Symbol(),OP_BUY,lot)<=0 || GetLastError()==134)
{
Print("Not enough money");
return(0);
}
OpenLong(lot);

cantrade=false;
return(0);
}
}
}



// block of a trade validity time checking, if MaxOpenTime=0, do not check.
if(MaxOpenTime>0)
{
for(cnt=0;cnt<total;cnt++)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
tmp = (TimeCurrent()-OrderOpenTime())/3600.0;
if (((NormalizeDouble(tmp,8)-MaxOpenTime)>=0))
{
RefreshRates();
if (OrderType()==OP_BUY)
closeprice=Bid;
else
closeprice=Ask;
if (OrderClose(OrderTicket(),OrderLots(),closeprice,10,Green))
{
Print("Forced closing of the trade - ą",OrderTicket());
OrderPrint();
}
else
Print("OrderClose() in block of a trade validity time checking returned an error - ",GetLastError());
}
}
else
Print("OrderSelect() in block of a trade validity time checking returned an error - ",GetLastError());
}
}
return(0);
}

Dodano po 23 godzinach 5 minutach:

dzięki :-) udało się coś z tego stworzyć częściowo tylko muszę jeszcze dopracować żeby otwierał od razu a nie przy następnej świecy :-)
Ten nie popełnia błędów kto nic nie robi

Awatar użytkownika
bucho1504
Stały bywalec
Stały bywalec
Posty: 55
Rejestracja: 01 sie 2008, 21:46

Nieprzeczytany post autor: bucho1504 »

:D Witam
Od jakiegoś czasu testuję i próbuję udoskonalić swoje EA ale coś mi nie wychodzi na testach :( chcę poprawić zlecenia przeciwstawne nie zawsze mi wskakuje :( jeżeli jest otwarta pozycja o tym samym symbolu to mi nie wskakuje.
Co poprawić w swoim EA żeby za każdym razem wskakiwało przeciwstawne po wykonaniu SL ????

Dzięki z góry :)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ten nie popełnia błędów kto nic nie robi

Awatar użytkownika
bucho1504
Stały bywalec
Stały bywalec
Posty: 55
Rejestracja: 01 sie 2008, 21:46

EA

Nieprzeczytany post autor: bucho1504 »

Witam
Ciężko było znaleźć coś na forum żeby poprawić swoje EA , ale dzięki mądrymi radami kolegi programisty uporządkowałem zmienne globalne i znormalizowałem
zlecenia ,SL i TP :-) dzięki temu dostałem pożądany efekt :-)

Pozdrawiam
Wesołych Świąt :-)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ten nie popełnia błędów kto nic nie robi

luki791

Nieprzeczytany post autor: luki791 »

Nie wiem czy dobrze rozumiem działanie tego EA, mógłby ktoś go dobrze opisać?
Jeżeli otwiera ono pozycje przeciwstawną w MOMENCIE zamknięcia SL to można je tak skonfigurować:

Otwieramy pozycję Buy: TP 30p, SL 10p
Załóżmy, że idzie nie tak jak chcieliśmy czyli łapie SL. (w tym momencie mamy stratę 10pips +1pips spread, razem 11).
W tym samym momencie (cena nie może się zmienić) EA otwiera Shorta, TP 12pips(10+1+1) a SL 8pips.
Ponownie idzie nie tak jak chcemy czy nie chcemy:) (mamy już 20pipek w tył)
EA otwiera trzecią pozycję (long) TP 21pips SL 6pips.
No i udaje nam się osiągnąć te 21 TP, w tym momencie jesteśmy na 0.
Ponieśliśmy jedynie koszty spread 3 pips a nie 10 tak jak SL w pierwszej pozycji (bez walki:)). Ponieśliśmy tylko 30% strat, wiadomo to będzie rosło w miarę nowych pozycji.
W najgorszym przypadku możemy stracić tyle ile SL na początku (przy dziesięciu pozycjach).

I tak dalej i tak dalej, można podregulować.... Ale ciekawi mnie sama idea?

Awatar użytkownika
bucho1504
Stały bywalec
Stały bywalec
Posty: 55
Rejestracja: 01 sie 2008, 21:46

EA

Nieprzeczytany post autor: bucho1504 »

Witam
Mam pomysł na ulepszenie strategi ale mi coś nie wychodzi :-(
Potrzebuję żeby mi modyfikowało zlecenie dokładnie TP np z 60 pipsów na 120 :-)
Próbowałem już wielokrotnie ale wciąż nie działa poprawnie :-(

{
if((OrderMagicNumber()== magic78) && (OrderType() ==OP_SELL)&&
OrderTakeProfit ()&&
((50*Point<(NormalizeDouble(Close[t3],Digits)-NormalizeDouble(Open[t3],Digits))))

{
OrderModify(OrderTicket(), NormalizeDouble(OrderTakeProfit(),Digits),
NormalizeDouble(OrderOpenPrice(),Digits)+60*Point,
OrderExpiration() ,Gold);

}

}

Dzięki z góry za pomoc :-)
Ten nie popełnia błędów kto nic nie robi

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

Nieprzeczytany post autor: Pierz Andrzej »

bucho1504 uzywaj F1 w edytorze bardzo pomaga ;)

Kod: Zaznacz cały

bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE) 
zgubiles

Kod: Zaznacz cały

OrderOpenPrice()
i przestawiles miejscami Tp i Sl ;)


no i ten warunek if co ma to robic ?? :

Kod: Zaznacz cały

&& 
 OrderTakeProfit ()&&
i wpisujac kody to postu uzywaj przycisku Code .....
czyli wciskasz Code -> wklejasz swoj kod -> ponownie wciskasz przycisk Code ;)

z poważaniem
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

ODPOWIEDZ