EA - Zamykanie wszystkich pozycji przy określonym zysku

O jezykach programowania w platformach i nie tylko.
forexsowicz91
Pasjonat
Pasjonat
Posty: 504
Rejestracja: 25 lis 2011, 17:55

EA - Zamykanie wszystkich pozycji przy określonym zysku

Nieprzeczytany post autor: forexsowicz91 »

Potrzebuję pomocy przy EA, które nie chce mi działać.

EA ma zamykać wszystkie pozycje otwarte i oczekujące na danym instrumencie przy określonym zysku lub stracie.

To jest mój kod co naskrobałem: 3 parametry

Kod: Zaznacz cały

//--- input parameters
input double   Profit=100;
input double   Loss=-100;
input int      Slippage=10;
A tu kod działania EA

Kod: Zaznacz cały

void CloseAllTrades()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
 {
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
    bool result = false;
 
   if (AccountProfit()>=Profit || AccountProfit()<=Loss) {
        if ( OrderType() == OP_BUY)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage );
        if ( OrderType() == OP_SELL)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage );
        if ( OrderType()== OP_BUYSTOP)  result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_SELLSTOP)  result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_BUYLIMIT)  result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_SELLLIMIT)  result = OrderDelete( OrderTicket() );
 }
  return; 
   }
   }
EA nic nie robi gdy wynik na rachunku osiągnie dany zysk lub stratę.

Próbowałem wygenerować też takie EA na FxPro Quant i oto kod z tego generatora:

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//+                           Code generated using FxPro Quant 2.1.4 |
//+------------------------------------------------------------------+
#property strict

#define __STRATEGY_MAGIC 1001000000
#define __SLEEP_AFTER_EXECUTION_FAIL 400

//Input variables
input double _Number_Input = 100;			// Profit [PLN]
input double _Number_Input_1 = -100;			// Loss [PLN]

//Global declaration

int init() {

   return(0);
}

int start() {

   
   //Local declaration
   bool _Close_All_Trades = false;
   bool _Delete_Pending_Orders = false;
   if( ((AccountProfit() <= _Number_Input_1) || (AccountProfit() >= _Number_Input)) ) _Close_All_Trades = Close_All_Trades(0);
   if( ((AccountProfit() <= _Number_Input_1) || (AccountProfit() >= _Number_Input)) ) {
      _Delete_Pending_Orders = __isPending( 0, Symbol() );
      if( _Delete_Pending_Orders ) {
         int ticket = OrderTicket();
         _Delete_Pending_Orders = OrderDelete(ticket);
      }
   }

   return(0);
}



bool __selectOrderByMagic(int magic, string symbol)
{
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == __STRATEGY_MAGIC + magic && OrderSymbol() == symbol)
         return(true);
   }
   return(false);
}



bool __isPending(int magic, string symbol)
{
   if(!__selectOrderByMagic(magic, symbol))
      return(false);
   return(OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()== OP_SELLLIMIT || OrderType()== OP_SELLSTOP);
}



int __Ticket(int magic, string symbol)
{   
   if(!__selectOrderByMagic(magic, symbol))
      return(0);
   return(OrderTicket());
}



bool Close_All_Trades(int MagicIndex)
{
   int total = OrdersTotal();
   int type;
   bool result = true;
   for(int i=total-1;i>=0;i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS)) continue;
      if(OrderMagicNumber() != __STRATEGY_MAGIC + MagicIndex || OrderSymbol() != Symbol()) continue;
      type = OrderType();
      if(type == OP_BUY) 
	  {
		  if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ))
		  {
			 result = false;
			 Sleep(__SLEEP_AFTER_EXECUTION_FAIL);  
		   }			
      }else if(type == OP_SELL)
	  {
		  if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ))
		  {
			 result = false;
			 Sleep(__SLEEP_AFTER_EXECUTION_FAIL);
		  }
      }
   } 
   return(result);
}
W załączniku screen z FxPro Quant, jak i pliki mql4. dla ww kodów.

Próbowałem też EA z sieci typu SwissArmy, ale nie działa tak jak powinno, bo przy danym zysku/stracie zamyka tylko niektóre z pozycji (dotyczy to zarówno otwartych jak i oczekujących)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Pablo90
Pasjonat
Pasjonat
Posty: 1215
Rejestracja: 10 cze 2007, 15:36

Re: EA

Nieprzeczytany post autor: Pablo90 »

Napisz czy coś wypisuje się w logach (zakładki Dziennik i Strategie).

forexsowicz91
Pasjonat
Pasjonat
Posty: 504
Rejestracja: 25 lis 2011, 17:55

Re: EA

Nieprzeczytany post autor: forexsowicz91 »

Napisz czy coś wypisuje się w logach (zakładki Dziennik i Strategie).
tu i tu pisze, że załadowało pomyślnie.

Awatar użytkownika
Pablo90
Pasjonat
Pasjonat
Posty: 1215
Rejestracja: 10 cze 2007, 15:36

Re: EA

Nieprzeczytany post autor: Pablo90 »

Teraz zauważyłem, że nie masz funkcji OnTick() w Twoim EA. Nie możesz zmieniać nazwy tej funkcji. Twoja funkcja nie jest więc automatycznie wywoływana i dlatego EA nic nie robi. Dopisz funkcję OnTick() i w niej wywołaj Twoją funkcję CloseAllTrades().

forexsowicz91
Pasjonat
Pasjonat
Posty: 504
Rejestracja: 25 lis 2011, 17:55

Re: EA

Nieprzeczytany post autor: forexsowicz91 »

dodałem i znowu nic. Pewnie źle to zrobiłem. Jak ma być ta funkcja dodana do mojego kodu?

Awatar użytkownika
Pablo90
Pasjonat
Pasjonat
Posty: 1215
Rejestracja: 10 cze 2007, 15:36

Re: EA

Nieprzeczytany post autor: Pablo90 »

Po prostu utwórz nowe EA i w funkcję OnTick wklej zawartość funkcji CloseAllOrders()

forexsowicz91
Pasjonat
Pasjonat
Posty: 504
Rejestracja: 25 lis 2011, 17:55

Re: EA

Nieprzeczytany post autor: forexsowicz91 »

Zrobiłem tak jak piszesz i obecnie EA robi cokolwiek, ale nie tak jak powinno. EA po osiągnięciu Profit albo Loss zamyka tylko pozycję o największym wolumenie, a reszta pozostaje. Oczekujące też nie są zamykane.

Tak obecnie wygląda kod funkcji:

Kod: Zaznacz cały

void OnTick()
{

  for(int i=OrdersTotal()-1;i>=0;i--)
 {
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
    bool result = false;
 
   if (AccountProfit()>=Profit || AccountProfit()<=Loss) {
        if ( OrderType() == OP_BUY)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage );
        if ( OrderType() == OP_SELL)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage );
        if ( OrderType()== OP_BUYSTOP)  result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_SELLSTOP)  result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_BUYLIMIT)  result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_SELLLIMIT)  result = OrderDelete( OrderTicket() );
 }
   }
   return;
     }

Awatar użytkownika
Pablo90
Pasjonat
Pasjonat
Posty: 1215
Rejestracja: 10 cze 2007, 15:36

Re: EA

Nieprzeczytany post autor: Pablo90 »

Spróbuj tak:

Kod: Zaznacz cały

if (AccountProfit()>=Profit || AccountProfit()<=Loss) {
    for(int i=OrdersTotal()-1;i>=0;i--) {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        bool result = false; 
        if ( OrderType() == OP_BUY)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID),      Slippage );
        if ( OrderType() == OP_SELL)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage );
        if ( OrderType()== OP_BUYSTOP)  result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_SELLSTOP)  result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_BUYLIMIT)  result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_SELLLIMIT)  result = OrderDelete( OrderTicket() );
        }
    }
}

forexsowicz91
Pasjonat
Pasjonat
Posty: 504
Rejestracja: 25 lis 2011, 17:55

Re: EA

Nieprzeczytany post autor: forexsowicz91 »

ufff, po wstępnych testach działa wszytko poprawnie. Dzięki wielkie Pablo90.

Jeszcze takie pytanie, bo przy kompilacji pojawia się zawsze jedno ostrzeżenie "return value of 'Order/Select' should be checked". Co to oznacza dla działania EA?

Awatar użytkownika
Pablo90
Pasjonat
Pasjonat
Posty: 1215
Rejestracja: 10 cze 2007, 15:36

Re: EA - Zamykanie wszystkich pozycji przy określonym zysku

Nieprzeczytany post autor: Pablo90 »

To tylko ostrzeżenie, dobrze jest przyporządkować jakąś wartość funkcji OrderSelect() po to, żeby sprawdzić, czy funkcja zakończyła się powodzeniem (czy zlecenie mogło zostać zaznaczone). Tak samo jak zrobiłeś z funkcją OrderClose(). Ale jak tego nie zrobisz to nic strasznego się nie stanie, po prostu nie będziesz wiedział jak funkcja zakończy się niepowodzeniem (chyba, że zajrzysz do logów).

ODPOWIEDZ