我的第一个MQL4 EA不生成任何订单。为什么?

时间:2017-02-27 18:46:37

标签: mql4

我试图建立第一个EA,代码如下,但它不会执行任何交易。

我知道这很简单,但从逻辑上讲,我认为应该买卖。

我试图只使用我理解的代码。

如果有人有任何反馈,我会很感激!

  //
  extern int sma_short    =    10;
  extern int sma_long     =    20;
  extern double fakeout   =     0.0005 ;
  extern double stoploss  =   150;
  extern double risk      =     1; 
  extern int slippage     =     5;
  extern int magicnumber  = 12345;
  extern bool SignalMail  =     false;
  extern bool UseTrailingStop = true;
  extern int TrailingStop =   150;

  double sma_short_t3; 
  double sma_short_t0; 
  double sma_long_t3; 
  double sma_long_t0;
  double sma_diff_t3;
  double sma_diff_t0;
  double lots;
  double stoplosslevel;

  int P = 1;
  int ticket, ticket2;
  int total = OrdersTotal();

  bool OpenLong   = false;
  bool OpenShort  = false;
  bool CloseLong  = false;
  bool CloseShort = false;
  bool isYenPair  = false;
  bool OpenOrder  = false;


  int OnInit()
  {
     if (  Digits == 5 || Digits == 3 || Digits == 1 ) P = 10; else P = 1; // To account for 5 digit brokers
     if (  Digits == 3 || Digits == 2 ) isYenPair = true; // Adjust for YenPair
     return( INIT_SUCCEEDED );
     }
  //+------------------------------------------------------------------+
  //| Expert deinitialization function                                 |
  //+------------------------------------------------------------------+
  void OnDeinit( const int reason )
  {
    }
  //+------------------------------------------------------------------+
  //| Expert tick function                                             |
  //+------------------------------------------------------------------+
  void Start()
  {
     sma_short_t3 = iMA( NULL, 0, sma_short, 0, MODE_SMA, PRICE_CLOSE, 3 );
     sma_short_t0 = iMA( NULL, 0, sma_short, 0, MODE_SMA, PRICE_CLOSE, 0 );
     sma_long_t3  = iMA( NULL, 0, sma_long,  0, MODE_SMA, PRICE_CLOSE, 3 );
     sma_long_t0  = iMA( NULL, 0, sma_long,  0, MODE_SMA, PRICE_CLOSE, 0 );

     sma_diff_t3  = sma_long_t3 - sma_short_t3;
     sma_diff_t0  = sma_long_t0 - sma_short_t0;

     if (  OpenOrder )
     {
           if (  CloseLong || CloseShort )
           {
                 OrderClose( OrderTicket(), OrderLots(), Bid, slippage, MediumSeaGreen );

                 OpenOrder  = False;
                 CloseLong  = False;
                 CloseShort = False;
                 }
           }
     if (  sma_diff_t3 < 0 && sma_diff_t0 > fakeout )
     {     
           OpenLong   = True ;
           CloseShort = True;
           }         
     if (  sma_diff_t3 > 0 && sma_diff_t0 < -fakeout )
     {     
           OpenShort  = True;  
           CloseLong  = True;  
           }

     lots = risk * 0.01 * AccountBalance() / ( MarketInfo( Symbol(), MODE_LOTSIZE ) * stoploss * P * Point ); // Sizing Algo based on account size
     if (  isYenPair == true ) lots = lots * 100; // Adjust for Yen Pairs
     lots = NormalizeDouble( lots, 2 );

     if (  OpenLong )
     {     
           stoplosslevel = Ask - stoploss * Point * P;
           OrderSend( Symbol(), OP_BUY, lots, Ask, slippage, stoplosslevel, 0, "Buy(#" + magicnumber + ")", magicnumber, 0, DodgerBlue );
           OpenOrder  = True;
           }
     if (  OpenShort )
     {     
           stoplosslevel = Bid + stoploss * Point * P;
           OrderSend( Symbol(), OP_SELL, lots, Ask, slippage, stoplosslevel, 0, "Buy(#" + magicnumber + ")", magicnumber, 0, DodgerBlue );
           OpenOrder = True ; 
           }
     }
  //+------------------------------------------------------------------+

2 个答案:

答案 0 :(得分:1)

为什么使用(MarketInfo(Symbol(),MODE_LOTSIZE)?这是什么意思?首先尝试double lots = 1.00;,如果问题仍然存在 - 请添加一行说明ea无法发送的原因。 ......如int ticket = OrderSend(***); if(ticket<0)Print("error=",GetLastError());或更复杂的告诉实际价格,批次,止损等等。

答案 1 :(得分:1)

MQL4中很少有人习惯于:

所有 PriceDOMAIN 数据必须 NormalizeDouble() 才能发送到MetaTrader 4服务器。

所有 EquityDOMAIN 数据必须遵循一组离散值,具有 MathMin( aMinLOT_SIZE + N * aMinLOT_STEP, aMaxLOT_SIZE ) 。 EquityDOMAIN数据的规范化是特定于代理和特定于工具的,因此不必总是2。

XTO OrderSend() OrderMOdify() OrderClose() ,应该遵循这样的事情:

if (   OpenLong )
 {     stoplosslevel = NormalizeDouble( Ask - stoploss * Point * P, _Digits );  // ALWAYS NormalizeDouble()
       int RetCODE   = OrderSend( _Symbol,
                                  OP_BUY,
                                  lots,
                                  Ask,
                                  slippage,
                                  stoplosslevel,
                                  0,
                                  "Buy(#" + magicnumber + ")",
                                  magicnumber,
                                  0,
                                  DodgerBlue
                                  );
        if (  RetCODE < 0 )
        {     Print( "EXC: Tried to go LONG, OrderSend() failed to get confirmed ( Errno: ", GetLastError(), " )" );
              }
        else
        {     OpenOrder  = True;
              ...
              }
        ...
        }