#define VERSION "1.0"
#property version VERSION
#property description "Pro7_EA"
#property strict
enum ActivateEA {
off=0, // Trading Off
on=1, // Trading On
};
ActivateEA Activate_EA = 0; // EA activate
extern string Additional = "---------- Original EA Settings ----------"; // Original EA Settings
extern double LotSize = 0.02; // Trade Lot size
extern int DelayNext = 3; // Number of minutes between trades
extern int Slippage = 5; // Max Slippage
extern int MaxSpread = 3; // Max Spread to only open trades below this value
extern int MagicNumber = 9991; // Magic number
extern string Comment = "Comment"; // Trade Comment
extern string PendsSell = "---------- Pending Sell and Sell Range Options ----------"; // Pending Sell and Sell Range Options
extern double PendSell = 0; // Pending sell price to enter
extern int NoSellAttempts = 5; // Number of attempts EA will sell at price
extern int TakeProfitSellPips = 0; // Take profit pips, 0 for no TP
extern int StopLossSellPips = 0; // Stop loss pips, 0 for no SL
extern int BreakEvenSellPips = 0; // Break even if profit pips above this, 0 for no BE
extern int DefaultRangeSellPips = 0; // Default pips for pending range
extern string CommentSell = "CommentSell"; // Trade Comment
extern string PendsBuy = "---------- Pending Buy and Buy Range Options ----------"; // Pending Buy and Buy Range Options
extern double PendBuy = 0; // Pending buy price to enter
extern int NoBuyAttempts = 5; // Number of attempts EA will buy at price
extern int TakeProfitBuyPips = 0; // Take profit pips, 0 for no TP
extern int StopLossBuyPips = 0; // Stop loss pips, 0 for no SL
extern int BreakEvenBuyPips = 0; // Break even if profit pips above this, 0 for no BE
extern int DefaultRangeBuyPips = 0; // Default pips for pending range
extern string CommentBuy = "CommentBuy"; // Trade Comment
extern string Colors = "---------- Color Options ----------"; // Color Options
extern color ColorLabels = White; // On screen Labels
extern color ColorPendBuy = Lime; // Pend Buy
extern color ColorPendSell = Red; // Pend Sell
extern color ColorStopLoss = Magenta; // Stop Loss
extern color ColorBreakEven = Yellow; // Break Even
extern color ColorTakeProfit = DeepSkyBlue; // Take Profit
extern color ColorRangeButton = White; // Range Button
extern color ColorRangeButtonActive = Green; // Range Button Active
int tradeDifference;
int tradeDigits = 0;
datetime tradeTime = 0;
datetime tradeSecond;
double SlippageTrade = 1.0; // 1.0 pips range of price detection below or above
bool RangeBuy = false;
bool RangeSell = false;
double RangePendBuy;
double RangePendSell;
bool BreakEvenBuy = false;
bool BreakEvenSell = false;
class Trades {
private:
public:
int tradeID; // client side trade id
int tradeType; // Long or short
double tradeLotSize; // Lot size
double tradePrice; // Price at trade open
string tradeComment; // Comment
bool tradeClosed; // Trade closed
Trades() { }
~Trades() { }
};
Trades* UserTrades[];
class CumulativeTrades {
private:
public:
double price;
int opened;
int type;
CumulativeTrades() { }
~CumulativeTrades() { }
};
CumulativeTrades* CumulativeBuy[];
CumulativeTrades* CumulativeSell[];
int init() {
// код доступен только после оплаты
}
void OnDeinit( const int reason ) {
for( int i = 0; i < ArraySize( UserTrades ); i++ ) {
delete UserTrades[i];
}
ArrayResize( UserTrades, 0 );
switch( reason ) {
case REASON_PROGRAM: // EA Removed from ExpertRemove()
case REASON_REMOVE: // EA Removed manually by user
case REASON_CHARTCLOSE: // Chart closed
case REASON_INITFAILED: break; // Failed to load EA
case REASON_RECOMPILE: // Mq4 Recompile
case REASON_CHARTCHANGE: // Chart / Timeframe change
case REASON_PARAMETERS: // EA input parameters changed
case REASON_ACCOUNT: // Changed Account
case REASON_TEMPLATE: // Template Changed
case REASON_CLOSE: // Terminal(MT4) Closed
if( ArraySize( CumulativeBuy ) > 0 ) {
string Implode = DoubleToStr( PendBuy ) + ";" + DoubleToStr( RangePendBuy ) + ";";
for (int i = 0; i < ArraySize( CumulativeBuy ); i++) {
Implode = StringConcatenate( Implode, IntegerToString( CumulativeBuy[i].opened ), ";" );
ObjectDelete( 0, "PendBuy" + IntegerToString( i ) );
delete CumulativeBuy[i];
}
ArrayResize( CumulativeBuy, 0 );
if( ObjectFind( 0, "CumulativeBuy" ) < 0 ) ObjectCreate( 0, "CumulativeBuy", OBJ_TEXT, 0, 0, 0 );
ObjectSetText( "CumulativeBuy", Implode );
}
if( ArraySize( CumulativeSell ) > 0 ) {
string Implode = DoubleToStr( PendSell ) + ";" + DoubleToStr( RangePendSell ) + ";";
for (int i = 0; i < ArraySize( CumulativeSell ); i++) {
Implode = StringConcatenate( Implode, IntegerToString( CumulativeSell[i].opened ), ";" );
ObjectDelete( 0, "PendSell" + IntegerToString( i ) );
delete CumulativeSell[i];
}
ArrayResize( CumulativeSell, 0 );
if( ObjectFind( 0, "CumulativeSell" ) < 0 ) ObjectCreate( 0, "CumulativeSell", OBJ_TEXT, 0, 0, 0 );
ObjectSetText( "CumulativeSell", Implode );
}
break;
}
if( ArraySize( CumulativeBuy ) > 0 ) {
for (int i = 0; i < ArraySize( CumulativeBuy ); i++) {
ObjectDelete( 0, "PendBuy" + IntegerToString( i ) );
delete CumulativeBuy[i];
}
ArrayResize( CumulativeBuy, 0 );
}
if( ArraySize( CumulativeSell ) > 0 ) {
for (int i = 0; i < ArraySize( CumulativeSell ); i++) {
ObjectDelete( 0, "PendSell" + IntegerToString( i ) );
delete CumulativeSell[i];
}
ArrayResize( CumulativeSell, 0 );
}
for( int i = 0; i < 7; i++ ) {
ObjectDelete( 0, "Jail_EA_" + IntegerToString( i ) );
}
ObjectDelete( 0, "EAActive" );
ObjectDelete( 0, "PendBuy" );
ObjectDelete( 0, "PendBuyT" );
ObjectDelete( 0, "RangeBuy" );
ObjectDelete( 0, "RangePendBuy" );
ObjectDelete( 0, "PendSell" );
ObjectDelete( 0, "PendSellT" );
ObjectDelete( 0, "RangeSell" );
ObjectDelete( 0, "RangePendSell" );
ObjectDelete( 0, "PendBuySL" );
ObjectDelete( 0, "PendBuySLT" );
ObjectDelete( 0, "PendBuyTP" );
ObjectDelete( 0, "PendBuyTPT" );
ObjectDelete( 0, "PendSellSL" );
ObjectDelete( 0, "PendSellSLT" );
ObjectDelete( 0, "PendSellTP" );
ObjectDelete( 0, "PendSellTPT" );
RangeBuy = RangeSell = false;
RangePendBuy = RangePendSell = 0;
}
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam ) {
if( id == CHARTEVENT_OBJECT_CLICK ) {
string clickedChartObject = sparam;
if( clickedChartObject == "EAActive" ) {
Activate_EA = (ActivateEA)(1 - Activate_EA);
if( Activate_EA == 0 ) {
ObjectSetString( 0, "EAActive", OBJPROP_TEXT, "OFF" );
ObjectSetInteger( 0, "EAActive", OBJPROP_BGCOLOR, ColorRangeButton );
} else {
ObjectSetString( 0, "EAActive", OBJPROP_TEXT, "ON" );
ObjectSetInteger( 0, "EAActive", OBJPROP_BGCOLOR, ColorRangeButtonActive );
tradeTime = 0; // Reset timer trade and allow instant trade
}
}
if( clickedChartObject == "RangeBuy" ) {
RangeBuy = 1 - RangeBuy;
if( RangeBuy == true ) {
RangePendBuy = PendBuy + DefaultRangeBuyPips * tradeDifference * Point;
CalculateRangeTrades( OP_BUY );
} else {
for( int i = 0; i < ArraySize( CumulativeBuy ); i++ ) {
ObjectDelete( 0, "PendBuy" + IntegerToString( i ) );
ObjectDelete( 0, "PendBuyT" + IntegerToString( i ) );
delete CumulativeBuy[i];
}
ArrayResize( CumulativeBuy, 0 );
RangePendBuy = 0;
}
}
if( clickedChartObject == "RangeSell" ) {
RangeSell = 1 - RangeSell;
if( RangeSell == true ) {
RangePendSell = PendSell - DefaultRangeSellPips * tradeDifference * Point;
CalculateRangeTrades( OP_SELL );
} else {
for( int i = 0; i < ArraySize( CumulativeSell ); i++ ) {
ObjectDelete( 0, "PendSell" + IntegerToString( i ) );
ObjectDelete( 0, "PendSellT" + IntegerToString( i ) );
delete CumulativeSell[i];
}
ArrayResize( CumulativeSell, 0 );
RangePendSell = 0;
}
}
}
}
void start() {
// код доступен только после оплаты
}
void CumulativeTradeOpen( int trend ) {
double Spread = MarketInfo( NULL, MODE_SPREAD );
if( ( Spread / tradeDifference ) > MaxSpread ) return;
if( trend == OP_BUY ) {
int _noBA = NoBuyAttempts - 1; if( _noBA < 1 ) _noBA = 1;
double _diff = MathAbs( PendBuy - RangePendBuy ) / _noBA / 2;
for( int i = 0; i < ArraySize( CumulativeBuy ); i++ ) {
if( CumulativeBuy[i].opened == 0 ) {
if( CumulativeBuy[i].type == OP_SELL ) {
if( Ask <= CumulativeBuy[i].price ) {
if( Ask <= ( CumulativeBuy[i].price - _diff ) ) {
CumulativeBuy[i].opened = 1;
return;
}
if( TicketType( OP_BUY ) < NoBuyAttempts ) {
tradeTime = TimeCurrent() + 1;
int res = OrderSend( Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0, CommentBuy, MagicNumber, 0, Blue );
if( res == -1 ) printf( "Error opening trade: %u", GetLastError() );
}
CumulativeBuy[i].opened = 1;
}
} else {
if( i == ArraySize( CumulativeBuy ) / 2 && TicketType( OP_BUY ) > 0 ) {
CumulativeBuy[i].opened = 1;
return;
}
if( Ask >= CumulativeBuy[i].price ) {
if( Ask >= ( CumulativeBuy[i].price + _diff ) ) {
CumulativeBuy[i].opened = 1;
return;
}
if( TicketType( OP_BUY ) < NoBuyAttempts ) {
tradeTime = TimeCurrent() + 1;
int res = OrderSend( Symbol(), OP_BUY, LotSize, Ask, Slippage, 0, 0, CommentBuy, MagicNumber, 0, Blue );
if( res == -1 ) printf( "Error opening trade: %u", GetLastError() );
}
CumulativeBuy[i].opened = 1;
}
}
return;
}
}
} else {
int _noSA = NoSellAttempts - 1; if( _noSA < 1 ) _noSA = 1;
double _diff = MathAbs( PendSell - RangePendSell ) / _noSA / 2;
for( int i = 0; i < ArraySize( CumulativeSell ); i++ ) {
if( CumulativeSell[i].opened == 0 && TicketType( OP_SELL ) < NoSellAttempts ) {
if( CumulativeSell[i].type == OP_BUY ) {
if( Bid >= CumulativeSell[i].price ) {
if( Bid >= ( CumulativeSell[i].price + _diff ) ) {
CumulativeSell[i].opened = 1;
return;
}
if( TicketType( OP_SELL ) < NoSellAttempts ) {
tradeTime = TimeCurrent() + 1;
int res = OrderSend( Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0, CommentSell, MagicNumber, 0, Red );
if( res == -1 ) printf( "Error opening trade: %u", GetLastError() );
}
CumulativeSell[i].opened = 1;
}
} else {
if( i == ArraySize( CumulativeSell ) / 2 && TicketType( OP_SELL ) > 0 ) {
CumulativeSell[i].opened = 1;
return;
}
if( Bid <= CumulativeSell[i].price ) {
if( Bid <= ( CumulativeSell[i].price - _diff ) ) {
CumulativeSell[i].opened = 1;
return;
}
if( TicketType( OP_SELL ) < NoSellAttempts ) {
tradeTime = TimeCurrent() + 1;
int res = OrderSend( Symbol(), OP_SELL, LotSize, Bid, Slippage, 0, 0, CommentSell, MagicNumber, 0, Red );
if( res == -1 ) printf( "Error opening trade: %u", GetLastError() );
}
CumulativeSell[i].opened = 1;
}
}
return;
}
}
}
}
void OnTimer() {
Visuals();
}
void ActiveTrades() {
if( tradeSecond == TimeCurrent() ) return;
tradeSecond = TimeCurrent();
for( int i = 0; i < OrdersTotal(); i++ ) {
if( OrderSelect( i, SELECT_BY_POS ) ) {
if( OrderSymbol() == Symbol() && MagicNumber == OrderMagicNumber() ) {
int _trade = TradeId( OrderTicket() );
if( _trade == -1 ) {
Trades* pTrade = new Trades;
pTrade.tradeID = OrderTicket();
pTrade.tradeType = OrderType();
pTrade.tradeComment = OrderComment();
pTrade.tradeLotSize = OrderLots();
pTrade.tradePrice = OrderOpenPrice();
int sz = ArraySize( UserTrades );
ArrayResize( UserTrades, sz + 1 );
UserTrades[sz] = pTrade;
if( OrderType() == OP_BUY )
if( BreakEvenBuyPips > 0 ) VerifyBreakEven( OrderOpenTime(), OrderType() );
else
if( BreakEvenSellPips > 0 ) VerifyBreakEven( OrderOpenTime(), OrderType() );
}
}
}
}
for( int i = 0; i < ArraySize( UserTrades ); i++ ) {
if( UserTrades[i].tradeClosed == false ) {
if( TicketId( UserTrades[i].tradeID ) == 0 ) {
UserTrades[i].tradeClosed = true;
return;
}
if( UserTrades[i].tradeType == OP_BUY ) {
if( BreakEvenBuyPips > 0 && BreakEvenBuy == false ) {
if( Bid > UserTrades[i].tradePrice + BreakEvenBuyPips * Point * tradeDifference ) {
BreakEvenBuy = true;
}
}
/*---- Close at break even, this has been detached to seperate function
if( BreakEvenBuy == true ) {
if( Bid <= UserTrades[i].tradePrice + SlippageTrade * Point * tradeDifference ) {
if( !OrderClose( UserTrades[i].tradeID, UserTrades[i].tradeLotSize, Bid, Slippage, Blue ) ) Print( "OrderClose error ", GetLastError() );
}
}*/
if( StopLossBuyPips > 0 && Bid < PendBuy - StopLossBuyPips * Point * tradeDifference ) {
if( !OrderClose( UserTrades[i].tradeID, UserTrades[i].tradeLotSize, Bid, Slippage, Blue ) ) Print( "OrderClose error ", GetLastError() );
}
if( RangeBuy == true ) {
if( TakeProfitBuyPips > 0 && RangePendBuy > 0 && Bid > RangePendBuy + TakeProfitBuyPips * Point * tradeDifference ) {
if( !OrderClose( UserTrades[i].tradeID, UserTrades[i].tradeLotSize, Bid, Slippage, Blue ) ) Print( "OrderClose error ", GetLastError() );
RangeBuy = false;
}
} else {
if( TakeProfitBuyPips > 0 && Bid > PendBuy + TakeProfitBuyPips * Point * tradeDifference ) {
if( !OrderClose( UserTrades[i].tradeID, UserTrades[i].tradeLotSize, Bid, Slippage, Blue ) ) Print( "OrderClose error ", GetLastError() );
RangeBuy = false;
}
}
}
if( UserTrades[i].tradeType == OP_SELL ) {
if( BreakEvenSellPips > 0 && BreakEvenSell == false ) {
if( Ask < UserTrades[i].tradePrice - BreakEvenSellPips * Point * tradeDifference ) {
BreakEvenSell = true;
}
}
/*---- Close at break even, this has been detached to seperate function
if( BreakEvenSell == true ) {
if( Ask >= UserTrades[i].tradePrice - SlippageTrade * Point * tradeDifference ) {
if( !OrderClose( UserTrades[i].tradeID, UserTrades[i].tradeLotSize, Ask, Slippage, Red ) ) Print( "OrderClose error ", GetLastError() );
}
}*/
if( StopLossSellPips > 0 && Ask > PendSell + StopLossSellPips * Point * tradeDifference ) {
if( !OrderClose( UserTrades[i].tradeID, UserTrades[i].tradeLotSize, Ask, Slippage, Red ) ) Print( "OrderClose error ", GetLastError() );
}
if( RangeSell == true ) {
if( TakeProfitSellPips > 0 && RangePendSell > 0 && Ask < RangePendSell - TakeProfitSellPips * Point * tradeDifference ) {
if( !OrderClose( UserTrades[i].tradeID, UserTrades[i].tradeLotSize, Ask, Slippage, Red ) ) Print( "OrderClose error ", GetLastError() );
RangeSell = false;
}
} else {
if( TakeProfitSellPips > 0 && Ask < PendSell - TakeProfitSellPips * Point * tradeDifference ) {
if( !OrderClose( UserTrades[i].tradeID, UserTrades[i].tradeLotSize, Ask, Slippage, Red ) ) Print( "OrderClose error ", GetLastError() );
RangeSell = false;
}
}
}
}
}
if( ArraySize( UserTrades ) > 0 ) TradesBreakEven();
if( BreakEvenBuy == true && TicketType( OP_BUY ) == 0 ) BreakEvenBuy = false;
if( BreakEvenSell == true && TicketType( OP_SELL ) == 0 ) BreakEvenSell = false;
DeleteArray();
}
void TradesBreakEven() {
if( BreakEvenBuy == true ) {
int count = 0;
double breakeven = 0;
for( int i = 0; i < OrdersTotal(); i++ ) {
if( OrderSelect( i, SELECT_BY_POS ) ) {
if( OrderSymbol() == Symbol() && MagicNumber == OrderMagicNumber() && OrderType() == OP_BUY ) {
breakeven += OrderOpenPrice();
count++;
}
}
}
if( count == 0 ) return; // Prevents divide by 0 error
breakeven /= count;
if( ObjectFind( "BreakEvenBuy" ) < 0 ) {
ObjectCreate( 0, "BreakEvenBuy", OBJ_TREND, 0, Time[3], breakeven + SlippageTrade * Point * tradeDifference, ( Time[0] + 3 * 60 * Period() ), breakeven + SlippageTrade * Point * tradeDifference );
ObjectSetInteger( 0, "BreakEvenBuy", OBJPROP_COLOR, ColorBreakEven );
ObjectSetInteger( 0, "BreakEvenBuy", OBJPROP_STYLE, STYLE_SOLID );
ObjectSetInteger( 0, "BreakEvenBuy", OBJPROP_WIDTH, 1 );
ObjectSetInteger( 0, "BreakEvenBuy", OBJPROP_RAY_RIGHT, 0 );
}
ObjectMove( "BreakEvenBuy", 0, Time[3], breakeven + SlippageTrade * Point * tradeDifference );
ObjectMove( "BreakEvenBuy", 1, ( Time[0] + 3 * 60 * Period() ), breakeven + SlippageTrade * Point * tradeDifference );
if( Bid < breakeven + SlippageTrade * Point * tradeDifference ) {
for( int i = 0; i < OrdersTotal(); i++ ) {
if( OrderSelect( i, SELECT_BY_POS ) ) {
if( OrderSymbol() == Symbol() && MagicNumber == OrderMagicNumber() && OrderType() == OP_BUY ) {
if( !OrderClose( OrderTicket(), OrderLots(), Bid, Slippage, Blue ) ) Print( "OrderClose error ", GetLastError() );
}
}
}
ObjectDelete( 0, "BreakEvenBuy" );
}
}
if( BreakEvenSell == true ) {
int count = 0;
double breakeven = 0;
for( int i = 0; i < OrdersTotal(); i++ ) {
if( OrderSelect( iПоказано первые 50% кода (символов: 31813)
Введите ваш email и нажмите кнопку, чтобы перейти к оплате.