【问题标题】:Defining an array, depending on Symbol(), in MQL4 MetaTrader4 [Expert Advisor]在 MQL4 MetaTrader4 [Expert Advisor] 中根据 Symbol() 定义一个数组
【发布时间】:2023-04-05 03:30:01
【问题描述】:

我有一个交易突破的 EA。我在多对上运行这个。当具有高相关性的两对交易方向相同(或相反,如果负相关)时,就会出现问题。这使我的风险加倍。因此,我在我的 EA 中添加了一个 sn-p,如果已经存在与当前交易品种高度相关的交易品种的未平仓头寸,则它会阻止新的交易。

(这是我尝试过的):

string       strSymbol;
string       HighCorrelationPairs[];

int OnInit() {
   strSymbol = Symbol();
   if (  strSymbol == "EURAUD" ) {
         ArrayResize( HighCorrelationPairs, 1 );
         string HighCorrelationPairs[1] = { "EURJPY" };
   }
   else if (  strSymbol == "EURJPY" ) {
              ArrayResize( HighCorrelationPairs, 2 );
              string HighCorrelationPairs[2] = { "EURAUD", "EURUSD" };
        }
        else if (  strSymbol == "EURUSD" ) {
                   ArrayResize( HighCorrelationPairs, 2 );
                   string HighCorrelationPairs[2] = { "EURJPY", "USDCHF" };
             }
             else if (  strSymbol == "GBPJPY" ) {
                        ArrayResize( HighCorrelationPairs, 1 );
                        string HighCorrelationPairs[1] = { "GBPUSD" };
                  }
                  else if (  strSymbol == "GBPUSD" ) {
                             ArrayResize( HighCorrelationPairs, 1 );
                             string HighCorrelationPairs[1] = { "GBPJPY" };
                       }
                       else if (  strSymbol == "USDCHF" ) {
                                  ArrayResize( HighCorrelationPairs, 1 );
                                  string HighCorrelationPairs[1] = { "EURUSD" };
                            }
                            else if (  strSymbol == "USDJPY" ) {
                                       ArrayResize( HighCorrelationPairs, 1 );
                                       string HighCorrelationPairs[1] = {};
                                 }
                                 else {
                                        ArrayResize( HighCorrelationPairs, 1 );
                                        string HighCorrelationPairs[1] = {};
                                 }
}

void OnTick() {          //--- Check Correlation and Number of Trades
   for ( k = OrdersTotal() - 1; k >= 0; k-- ) {
         if (  OrderSelect( k, SELECT_BY_POS, MODE_TRADES ) ) {
               if (  OrderType() == OP_BUY
                  || OrderType() == OP_SELL
                     ) {
                     if (  OrderSymbol()      == Symbol()
                        && OrderMagicNumber() == MagicNumber
                           ) {
                           return;
                     }
                     if (  TimeCurrent() - OrderOpenTime() <= 18000 ) {
                           for ( int i = 0;i <  ArraySize( HighCorrelationPairs ); i++ ) {
                                 if (  OrderSymbol() == HighCorrelationPairs[i] ) { return; }
                           }
                     }
               }
         }
   }
}

编译后,这是我得到的警告

未使用变量“HighCorrelationPairs” 'HighCorrelationPairs' 的声明隐藏了第 120 行的全局声明

这只是一个警告,而不是错误。

【问题讨论】:

    标签: arrays mql4 metatrader4 forex mt4


    【解决方案1】:

    主要问题称为变量“声明范围”

    给定代码指示编译器执行此操作:

    if (  strSymbol == "EURAUD" ) {
             ArrayResize( HighCorrelationPairs, 1 );
             string HighCorrelationPairs[1] = { "EURJPY" };
       }
    

    if的正文的词法范围内的最后一行——if(){...}正文部分,即@987654325 @ -- 是唯一的临时区域,新“本地”创建的静态预大小对象在其中分配一个值string HighCorrelationPairs[1] = ... ; 是 立即丢失
    一旦“声明范围”将被跨越(即在它创建/分配之后立即)

    接下来是变量名掩码:

    接下来在创建一个新的“本地”string HighCorrelationPairs[] 之后,编译器必须至少通知您,在任何其他级别(已访问的层次结构中的更高级别)定义的任何冲突对象名称变得不可用同时,从而使最近声明的对象的名称有效地掩盖了所有先前定义的对象,并带有词法上的“相同”名称。所以,你已经被警告了。

    优化您的代码,以避免变量名被屏蔽并遵守变量词法“声明范围”。

    switch( _Symbol ){
         case "EURAUD" : {  ArrayResize( HighCorrelationPairs, 1 );
                                         HighCorrelationPairs[0] = "EURJPY";
                            break;
                            }
         case "EURUSD" : {  ArrayResize( HighCorrelationPairs, 2 );
                                         HighCorrelationPairs[0] = "EURJPY";
                                         HighCorrelationPairs[1] = "USDCHF";
                            break;
                            }
         ...
    }
    

    嗯,没错,MQL4 文档在这方面并不清楚。规范规定 switch( selector ) 必须将 selector 部分作为表达式(已满足)。

    切换运算符
    将表达式值与所有 case 变体中的常量进行比较,并将控制权传递给与表达式值对应的运算符。每个 case 变体都可以用整数常量、文字常量或常量表达式来标记。

    尽管如此,编译器拒绝在此语法构造函数中提供除 int 之外的任何其他类型。

    所以,最好使用一些简单的 HASH 函数来获取 int

    int   Symbol2HASH( const string aSymbol = "EURUSD" ) {
    // -----------------------------------
    // NAIVE, BUT WORKING:
    // ------------------UUID--------------
    #define DEF_EURUSD      0
    #define DEF_EURJPY      1
    #define DEF_EURAUD      2
    #define DEF_EURCHF      3
    //          ...       ...
    // ------------------UUID--------------
    // MAINTAIN HERE ALL UUID #s PLUS aSymbol MAPPINGS:
    // --------vvvvvvv----------------------vvvvvvvvvv
          if ( aSymbol == "EURUSD" ) return DEF_EURUSD;
          if ( aSymbol == "EURJPY" ) return DEF_EURJPY;
          if ( aSymbol == "EURAUD" ) return DEF_EURAUD;
          if ( aSymbol == "EURCHF" ) return DEF_EURCHF;
    
          return EMPTY;
      }
    

    switch( Symbol2HASH( _Symbol ) ) {
           case DEF_EURAUD: {  ArrayResize( HighCorrelationPairs, 1 );
                                            HighCorrelationPairs[0] = "EURJPY";
                               break;
                               }
           case DEF_EURUSD: {  ArrayResize( HighCorrelationPairs, 2 );
                                            HighCorrelationPairs[0] = "EURJPY";
                                            HighCorrelationPairs[1] = "USDCHF";
                               break;
                               }
           case EMPTY: {       PrintFormat( "Symbol()==[%s] not included inside Symbol2HASH() function. Edit source.", _Symbol );
                               ExpertRemove();
                               }
           default:    {       PrintFormat( "Symbol()==[%s] code [%d] was not served inside switch(){ case-s }. Edit source.", _Symbol, Symbol2HASH( _Symbol ) );
                               ExpertRemove();
                               }
      }
    

    【讨论】:

    • 我也很想用“开关”功能。但显然 MT4 不允许在开关功能上使用符号。这是编译错误:(FIRST ERROR)'_Symbol' - 非法开关表达式类型(SECOND ERROR)'EURAUD' - 常量表达式不是整数
    • @RobertSimonUy 对,上面解决了编译差异。享受这一天 + 快乐交易。
    【解决方案2】:

    该警告非常重要,就像大多数警告一样。 它说明了以下内容:您在OnInit() 中声明了HighCorrelationPairs[],现在您使用这个新声明的数组执行所有操作,并且该数组仅在OnInit() 函数中可见。当您尝试从OnTick() 函数调用该数组时,它会调用一个已声明但从未在第120 行启动的数组(在OnInit() 之外,在全局变量中)。

    怎么办?尝试填充您的数组,但不要创建一个新数组!

    string HighCorrelationPairs[];
    int OnInit(){
       string strSymbol = Symbol();
       if(strSymbol == "EURAUD") {
          ArrayResize(HighCorrelationPairs,1);
          HighCorrelationPairs[0] = "EURJPY";
       }else if(strSymbol == "EURJPY") {
          ArrayResize(HighCorrelationPairs,2); 
          HighCorrelationPairs[0] = "EURAUD";
          HighCorrelationPairs[1] = "EURUSD";
       }
       //also you may print all elements of the array here if you wish
       return (INIT_SUCCEEDED);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多