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;
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;
}
}
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);
}
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)