EA测试是可以自动下单的,但是挂模拟盘需要手动加载才可以的。请大神们帮我看看是哪里出了问题。
想解决:可以自动挂单即可。有疑问的欢迎提问。
源码如下:
//+------------------------------------------------------------------+
//| CBS.mq4 |
//| Copyright 2015, Neko Prog |
//| https://www.mql5.com/en/users/megahentai |
//| |
//| THIS EA IS SHAREWARE |
//| WHICH MEANS THAT IT'S NOT A COMMERCIAL PRODUCT |
//| BUT STILL COPYRIGHTED |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Todo |
//| |
//| - sharp entry |
//| - trend surfing |
//| - trailing loss / breakeven |
//| |
//| |
//| |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| 2015-08-18 by Capella @ http://worldwide-invest.org/ |
//| Version v.Capella_001 |
//| - Fixed OrderDelete error bug |
//| - Fixed compiler warnings |
//| - Changed OrderMagic from global to external |
//| 2015-09-14 by Capella @ http://worldwide-invest.org/ |
//| Version v.Capella_2 |
//| - Changed StartTime, EndTime and CurrentTime from hours only |
//| to hour and minute |
//| - Overruled USA am/pm time format to international 24 hour time |
//| - Added Trailing StopLoss |
//| 2015-11-03 by Capella @ http://worldwide-invest.org/ |
//| - Corrected bug for printout of minutes on the screen, |
//| 1 minute is printed as 01 and not as 1. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Neko Prog"
#property link "https://www.mql5.com/en/users/megahentai"
#property version "1.0"
#property description "Candlestick Breakout Scalper. Trade on candlestick breakout. Still in development stage. \n\n"
#property description "I need these 3 trading strategies in order to complete this EA: \n"
#property description " 1. Sharp entry (upon entry, only small price reversal and hit TP) \n"
#property description " 2. Trend surfing (after entry, it will follow current trend or hit TP) \n"
#property description " 3. Trailing stop (while following current trend, it will also lock profit in case of reversal) \n\n\n\n"
#property description "Any suggestions or comments are welcomed."
#property strict
extern string LotsSettings = "==== Lots Settings ====";
extern double LotExponent = 5;
extern double MinLot = 0.01;
extern double MaxLot = 0.01;
extern bool UseRecoveryLot=true;
extern double MultiplierRecoveryLot=2.0;
extern string TradingSettings = "==== Trade Settings ====";
extern double PendingGap = 0;
extern double TakeProfit = 75;
extern double StopLoss = 50;
extern bool DelPrevPO = false;
extern bool TradeAllCandle = TRUE;
extern int MinCandleVolume = 100;
extern string TimeSettings = "==== Time Settings ====";
extern ENUM_TIMEFRAMES TimeFrame = PERIOD_D1;
extern bool EnableTime = TRUE;
extern int StartHour = 0;
extern int StartMinute = 0;
extern int EndHour = 23;
extern int EndMinute = 00;
extern string TrailSettings = "=== Trail Profit ==="; // Added by Capella
extern bool UseTrailProfit = TRUE; // Trail profit or not
extern double TrailStart = 35; // Points in profit to start trailing StopLoss
extern double TrailGap = 10; // Points distance between current price and new StopLoss
extern double TrailStep = 10; // Points for a new SL increase before modifying trailing (to avoid unnecessary OrderModify)
extern string OtherSettings = "==== Other Settings ====";
extern int OrderMagic = 44342; // Changed to extern by Capella
extern string Copyright = "==== \x00A9 2015 Neko Prog ====";
double StartTime, EndTime;
double lots,stoplevel,buystop,sellstop,buytp,selltp,buysl,sellsl;
double orderBuyTP,orderBuySL,orderSellTP,orderSellSL;
double CSPip,prevHigh,prevLow;
double CurrentTime;
int today;
string dispCurrentTime,dispStartTime,dispEndTime,dispToday;
datetime currtime,prevtime;
int PendingBuy=0;
int PendingSell=0;
int MarketBuy=0;
int MarketSell=0;
//+------------------------------------------------------------------+
//| Expert core function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Convert from sexagesimal to deciomal
StartTime = (double) StartHour + (double) StartMinute / 60;
EndTime = (double) EndHour + (double) EndMinute / 60;
stoplevel = MarketInfo(Symbol(),MODE_STOPLEVEL);
//Init code block
currtime=0;
prevtime=0;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
if (true) ObjectsDeleteAll(); // clear the chart graphical objects
Comment(""); // clear the chart comments
return(0);
}
void sendOrder(int orderPos,double orderLot,double orderPrice,double orderSL,double orderTP,color orderColor)
{
bool sent; // Added by Capella for the use of OrderSend command, see correction below!
// OrderSend(Symbol(),orderPos,orderLot,orderPrice,3,orderSL,orderTP,"CBS_nEk0",OrderMagic,0,orderColor); // Commented out by Capella
sent = OrderSend(Symbol(),orderPos,orderLot,orderPrice,3,orderSL,orderTP,"CBS_nEk0",OrderMagic,0,orderColor); // Added by Capella
}
void DelAllStop()
{
bool deleted; // Added by Capella for the use of OrderDelete command. See correction below!
int tip;
for (int i=0; iMaxLot) lots = MaxLot;
//---
if(UseRecoveryLot==true)
{
if(MultiplierRecoveryLot=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if((OrderSymbol()==Symbol())&&(OrderMagicNumber()==OrderMagic))
{
if(OrderProfit()+OrderCommission()+OrderSwap()12) dispCurrentTime=StringConcatenate(DoubleToString(CurrentTime-12)," PM");
if (CurrentTime12) dispStartTime=StringConcatenate(IntegerToString(StartTime-12)," PM");
if (StartTime12) dispEndTime=StringConcatenate(IntegerToString(EndTime-12)," PM");
if (EndTime 0 )
{
int tip;
for (int i=0; i0 && Bid>=orderBuyTP) // OrderClose(OrderTicket(),OrderLots(),Bid,3,clrBlue); //TP
closed = OrderClose(OrderTicket(),OrderLots(),Bid,3,clrBlue); //TP
if (StopLoss>0 && Bid0 && Ask0 && Ask>=orderSellSL) // OrderClose(OrderTicket(),OrderLots(),Ask,3,clrBlue); //SL - Commented out by Capella
closed = OrderClose(OrderTicket(),OrderLots(),Ask,3,clrBlue); //SL - Added by Capella
}
}
}
}
// Check stale order, delete untriggered Stop Order
if ((PendingBuy+PendingSell==1)&&(MarketBuy+MarketSell==1)) DelAllStop();
// Check if missing one of both Stop Order
if ((PendingBuy+PendingSell==1)&&(MarketBuy+MarketSell==0)) theBrainz();
// Send order per candle
if (newTime()==true)
{
// Delete all untriggered Pending Orders
if (DelPrevPO==true) DelAllStop();
// Start trade if no order
if (PendingBuy+PendingSell= StartTime && CurrentTime =MinCandleVolume) theBrainz();
}
}
if (EnableTime==false)
{
if (TradeAllCandle==true) theBrainz();
if (TradeAllCandle==false && CSPip>=MinCandleVolume) theBrainz();
}
}
}
}
else { Alert("Trade run on ",EnumToString(TimeFrame)," timeframe only."); }
return(0);
}
//+------------------------------------------------------------------+
// Trail specific order; check to see if StopLoss cand and should be changed
void CheckTrail( int par_ticket )
{
double trstart = TrailStart * Point;
double gap = TrailGap * Point;
double step = TrailStep * Point;
double spread = Ask - Bid;
double openprice = 0;
double oldSL = 0;
double newSL = 0;
bool wasmodified = FALSE;
// If we can select the order that should be trailing
if ( OrderSelect( par_ticket, SELECT_BY_TICKET, MODE_TRADES ) == TRUE )
{
openprice = OrderOpenPrice();
oldSL = OrderStopLoss();
// Spread is higher than Trailing value, so set Trailing value to spread
if ( spread > trstart )
trstart = spread;
// If the order does not have any SL yet
if ( oldSL == 0 )
{
// If we have matching order type and symbol
if ( OrderType() == OP_BUY )
{
// Calculate new SL
newSL = ND ( MathMin(openprice + trstart,Bid-stoplevel*Point) );
// If the current close price is larger than opening price + TrailingStart
if ( Bid > newSL )
{
// Modify the order with a new SL
wasmodified = OrderModify( par_ticket, openprice, newSL, 0, 0, Blue );
// If the order could not be modified with a new SL then print out an error message
if ( wasmodified == FALSE )
Print ( "Attempt to trail SL for profitable order# ", par_ticket, " failed! Last error = ", GetLastError(),", OrderType = ", OrderType(),", Bid = ", Bid,", Open price = ", openprice,", OldSL = ", oldSL,", TrailSL = ", newSL );
}
}
// If we have matching order type
if ( OrderType() == OP_SELL )
{
// Calculate new SL
newSL = ND ( MathMax(openprice - trstart,Ask+stoplevel*Point) );
// If the current close price is less than the opening price - TrailingStart - TrailingStep
if ( Ask 0 )
{
// Print out message that says that the order is now trailing in profit
Print ( "The order ", string ( par_ticket ), " is trailing SL in profit!" );
}
*/
}
// The order already has a SL, and a check to see if it can be changed
else
{
// If we have matching order type
if ( OrderType() == OP_BUY )
{
// Calculate new SL as current closing price - gap
newSL = ND ( MathMin(Bid - gap,Bid-stoplevel*Point) );
// If the distance between the new SL and the old SL is more than the trailing step
if ( ( newSL - oldSL ) > step )
{
// Modify the profit order with a new SL that is current close price less trailing,
wasmodified = OrderModify( par_ticket, openprice, newSL, 0, 0, Blue );
// In case the order couiild not be modified then print out error message
if ( wasmodified == FALSE )
Print ("Modify error. newSl = ", newSL,", oldSl = ", oldSL,", Bid = ", Bid);
}
}
// If we have matching order type and symbol
if ( OrderType() == OP_SELL )
{
// Calculate a new SL
newSL = ND ( MathMax(Ask + gap,Ask+stoplevel*Point) );
// If the distance between the new SL and the old SL is more than the trailing step
if ( ( oldSL - newSL ) > gap )
{
// Modify the profit order with a new SL that is current close price plus trailing
wasmodified = OrderModify( par_ticket, openprice, newSL, 0, 0, Blue );
// In case the order could not be modified then print out error message
if ( wasmodified == FALSE )
Print ("Modify error. newSl = ", newSL,", oldSl = ", oldSL,", Ask = ", Ask );
}
}
}
}
}
// Normalize decimals to number of decimals for this currency pair as defined by the broker. Added by Capella
double ND( double par_value )
{
return ( NormalizeDouble ( par_value, Digits ) );
}
|