如何让这个MQL4 EA正确执行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让这个MQL4 EA正确执行?相关的知识,希望对你有一定的参考价值。

我正在尝试在MQL4上创建一个相当简单的专家顾问,但是在编译后它甚至没有任何错误也没有执行。

概念如下:

对于要执行的买单:

  bool buy_condition_1 = iosMA(NULL, 0, 12, 26, 9, PRICE_CLOSE, 1)  >  0 ;
  bool buy_condition_2 = iCCI(NULL, 0, 14, PRICE_CLOSE, 1)  <  -100 ;
  bool buy_condition_3 = (MathMin(Open[1],Close[1]) - Low[1] >= 200*Point);

对于要执行的卖单:

  bool sell_condition_1 = iOsMA(NULL, 0, 12, 26, 9, PRICE_CLOSE, 1)  <  0;
  bool sell_condition_2 = iCCI(NULL, 0, 14, PRICE_CLOSE, 1)  > 100 ;
  bool sell_condition_3 = (High[1] - MathMax(Open[1],Close[1]) >=200*Point);

我添加了这些代码,但他们没有执行任何订单。

EA的意思是在以下情况下购买:

  1. OSMA直方图大于0
  2. CC1(5)小于-100
  3. 较低的蜡烛灯芯(阴影)大于20点

出售:

  1. OSMA直方图小于0
  2. CCI(5)大于100
  3. 上蜡烛芯(阴影)大于20点。

任何帮助将不胜感激。

谢谢

#property copyright "Chinedu Onuoha"
#property link "profedu2001@gmail.com"

// External variables
extern double LotSize = 0.1;
extern double StopLoss = 20;
extern double TakeProfit = 0;
extern double TrailingStopLimit = 0;
extern double TrailingStopStop = 0;
extern int MagicNumber = 23310;


// Global variables
int LongTicket;
int ShortTicket;
double RealPoint;
double open;




// Init function
int init(){
    open = 0;
    RealPoint = RealPipPoint(Symbol());
}

// Start function
int start(){
  if (open  == Open[0]) return 0;
  open = Open[0];

  //long

   OrderSelect(LongTicket,SELECT_BY_TICKET);
   if(OrderCloseTime() != 0 || LongTicket == 0) {

      bool buy_condition_1 = iOsMA(NULL, 0, 12, 26, 9, PRICE_CLOSE, 1)  >  0 ;
      bool buy_condition_2 = iCCI(NULL, 0, 14, PRICE_CLOSE, 1)  <  -100 ;
      bool buy_condition_3 = (MathMin(Open[1],Close[1]) - Low[1] >= 200*Point);


      if( buy_condition_1  &&  buy_condition_2  &&  buy_condition_3 ){

          OrderSelect(ShortTicket,SELECT_BY_TICKET);

          if(OrderCloseTime() == 0 && ShortTicket > 0){
            bool Closed = OrderClose(ShortTicket,OrderLots(),Ask,0,Red);
          }

          LongTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,0,0,0,"Buy Order",MagicNumber,0,Green);

          OrderSelect(LongTicket,SELECT_BY_TICKET);
          double OpenPrice = OrderOpenPrice();

          if(StopLoss > 0) double LongStopLoss = OpenPrice - (StopLoss * RealPoint);
          if(TakeProfit > 0) double LongTakeProfit = OpenPrice + (TakeProfit * RealPoint);

            if(LongStopLoss > 0 || LongTakeProfit > 0) {
            bool LongMod = OrderModify(LongTicket,OpenPrice,LongStopLoss, LongTakeProfit,0);
            }
            ShortTicket = 0;
      }
   }


   //Close long
   if (OrdersTotal() > 0){
      bool close_buy_condition_1 = iCCI(NULL, 0, 14, PRICE_CLOSE, 1)  > 100 ;
      bool close_buy_condition_2 = iOsMA(NULL, 0, 12, 26, 9, PRICE_CLOSE, 1)  <  0;
       if( close_buy_condition_1 && close_buy_condition_2){

            OrderSelect(LongTicket,SELECT_BY_TICKET);
            if(OrderCloseTime() == 0 && LongTicket > 0){
                Closed = OrderClose(LongTicket,OrderLots(),Bid,0,Red);
                LongTicket = 0;
            }
        }
    }

   // Short
   OrderSelect(ShortTicket,SELECT_BY_TICKET);
   if (OrderCloseTime() != 0 || ShortTicket == 0) {

      bool sell_condition_1 = iOsMA(NULL, 0, 12, 26, 9, PRICE_CLOSE, 1)  <  0;
      bool sell_condition_2 = iCCI(NULL, 0, 14, PRICE_CLOSE, 1)  > 100 ;
      bool sell_condition_3 = (High[1] - MathMax(Open[1],Close[1]) >= 200*Point);


        if( sell_condition_1  &&  sell_condition_2  &&  sell_condition_3 ){

          OrderSelect(LongTicket,SELECT_BY_TICKET);
          if(OrderCloseTime() == 0 && LongTicket > 0){
            Closed = OrderClose(LongTicket,OrderLots(),Bid,0,Red);
          }
          ShortTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,0,0,0,"Sell Order",MagicNumber,0,Red);
          OrderSelect(ShortTicket,SELECT_BY_TICKET);
          OpenPrice = OrderOpenPrice();

          if(StopLoss > 0) double ShortStopLoss = OpenPrice + (StopLoss * RealPoint);
          if(TakeProfit > 0) double ShortTakeProfit = OpenPrice - (TakeProfit * RealPoint);
           if(ShortStopLoss > 0 || ShortTakeProfit > 0) {
                bool ShortMod = OrderModify(ShortTicket,OpenPrice,ShortStopLoss, ShortTakeProfit,0);
           }
          LongTicket = 0;
        }
   }

     //Close Short
   if (OrdersTotal() > 0){
    bool close_sell_condition_1 = iCCI(NULL, 0, 14, PRICE_CLOSE, 1)  <  -100 ;
    bool close_sell_condition_2 = iOsMA(NULL, 0, 12, 26, 9, PRICE_CLOSE, 1)  >  0;

    if ( close_sell_condition_1 && close_sell_condition_2){
        OrderSelect(ShortTicket,SELECT_BY_TICKET);
      if(OrderCloseTime() == 0 && ShortTicket > 0){
        Closed = OrderClose(ShortTicket,OrderLots(),Ask,0,Red);
        ShortTicket = 0;
      }
    }
  }

   return(0);
}


// Pip Point Function
double RealPipPoint(string Currency){
   int CalcDigits = MarketInfo(Currency,MODE_DIGITS);
   if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
   else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
   return(CalcPoint);
}
答案

欢迎来到MQL4!请显示EA的代码(您展示的内容是不够的) - 必须根据某些事件(OnTick,OnTimer,OnChartEvent)采取一些行动,检查一些条件(如您在示例中显示的那些条件)并决定做什么(没有,发送买入,发送卖出,移动止损/止盈,必要时进行其他修改,关闭机票),然后发送订单或修改或关闭。查看MQL4 \ Experts文件夹中给出的MA EA和Macd EA的示例,以了解它应该是什么样子

另一答案

在MCVE确实发布后更新:

您的代码忽略了一种语言规则。它被称为有效范围。鉴于上面的代码,函数RealPipPoint()在沉默中导致一个主要问题:

double RealPipPoint( string Currency ){
   int       CalcDigits  = MarketInfo( Currency, MODE_DIGITS );
   if (      CalcDigits == 2
      ||     CalcDigits == 3
        ) double CalcPoint = 0.01;
   else if(  CalcDigits == 4
          || CalcDigits == 5
             )   CalcPoint = 0.0001;
   return( CalcPoint );
}

在这里,return( )几乎不会返回适当的价值。为什么?正确的,因为有效范围:double CalcPoint,在某个范围内声明“内部”(if(){...}-one),一旦代码执行步骤超出有效范围,就不再存在/承担任何值。

double RealPipPoint( string Currency ){
   int       CalcDigits  = MarketInfo( Currency, MODE_DIGITS );
   if (      CalcDigits == 2
      ||     CalcDigits == 3
        )                  return( 0.01 );     // WILL WORK FINE
   else if(  CalcDigits == 4
          || CalcDigits == 5
             )             return( 0.0001 );   // WILL WORK FINE
   return( EMPTY );
}

下一个, 如果你定义一个函数类型,保持这样的定义是公平的:

// Init function
int init(){                                    // read New-MQL4 int OnInit(){...}
    open      = 0;
    RealPoint = RealPipPoint( _Symbol );
    return( INIT_SUCCEDED );                   // return(); // WAS MISSING AT ALL
}

新的MQL4代码执行单元需要这个正式的结构:

公平地说,如果“它有9个警告而0个错误”没有什么致命的,除了阅读警告所涵盖的内容(最重要的是,这样的警告有助于程序员抛光类型转换/类型转换并消除歧义代码)。

随意点击列出的错误/警告,IDE应该将光标移动到触发错误/警告的行。

// #####################################################################
// CODE-PREPROCESSOR AND MQL4-LANGUAGE-SPECIFIC DEFINITIONS:
#property show_inputs

// #####################################################################
// HEADER DEFINITIONS:
#define aThingToDEFINE   aValueToHAVE

// #####################################################################
// EXTERNS FOR EA-SETUP + STRATEGY-TESTER OPTIMISATION SCANS:
extern double OsMA_LIMIT_LONG =     0;
extern double iCCA_LIMIT_LONG =  -100;
extern double OC2L_LIMIT_LONG =   200;

extern double OsMA_LIMIT_SHORT =    0;
extern double iCCA_LIMIT_SHORT =  100;
extern double OC2L_LIMIT_SHORT =  200;

// #####################################################################
// INIT HANDLER:
   int  onInit(){

        OC2L_LIMIT_LONG  *= Point;
        H2OC_LIMIT_SHORT *= Point;

        return( INIT_SUCCEEDED );
   }
// #####################################################################
// FX-MARKET QUOTE-FEED EVENT HANDLER:
   void OnTick(){

     // LONG-DIRECTION FLAGS
        bool buy_condition_1 = ( OsMA_LIMIT_LONG <  iOsMA( NULL, 0, 12, 26, 9, PRICE_CLOSE, 1 ) );
        bool buy_condition_2 = ( iCCA_LIMIT_LONG >  iCCI(  NULL, 0, 14, PRICE_CLOSE, 1 ) );
        bool buy_condition_3 = ( OC2L_LIMIT_LONG <= ( MathMin(  Open[1],
                                                               Close[1]
                                                               )
                                                    -            Low[1]
                                                      )
                                 );    
     // SHORT-DIRECTION FLAGS
        bool sell_condition_1 = ( OsMA_LIMIT_SHORT >  iOsMA( NULL, 0, 12, 26, 9, PRICE_CLOSE, 1 ) );
        bool sell_condition_2 = ( iCCI_LIMIT_SHORT <  iCCI(  NULL, 0, 14, PRICE_CLOSE, 1 ) );
        bool sell_condition_3 = ( H2OC_LIMIT_SHORT <= (           High[1]
                                                      - MathMax(  Open[1],
                                                                 Close[1] 
                                                                 )
                                                        )
                                  );
     // DECISIONS:
        if (  buy_condition_1
           && buy_condition_2
           && buy_condition_3
              ){
        // ***********************************
           // ACT:

        }
        if (  sell_condition_1
           && sell_condition_2
           && sell_condition_3
              ){
        // ***********************************   
        // ACT:

        }

}
// #####################################################################
// DEINIT HANDLER:
void OnDeinit( const int aDeinitREASON ){

     // TIDY-UP?
        ..
}

以上是关于如何让这个MQL4 EA正确执行?的主要内容,如果未能解决你的问题,请参考以下文章

mql4如何自定义画图

MQL4绘制一个带有文本的动态Rectangle_Label

MQL4:如何从 URL 读取 CSV

C++ 代码片段执行

如何让 videoView 在片段内播放?

我在 Mql4 中的 if 条件从未成立