在MQL4 MetaTrader4 [EA交易]中定义一个数组,取决于Symbol()

时间:2017-10-16 14:08:42

标签: arrays mql4 metatrader4 forex mt4

我有一个交易突破的EA。我在多对上运行它。当具有高相关性的两对交换相同方向(或相反,如果是负相关)时,出现问题。这使我的风险加倍。所以,我在我的EA中添加了一个片段,如果已经存在与当前符号高度相关的符号的开放位置,则会阻止开启新交易。

(这是我试过的):

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; }
                           }
                     }
               }
         }
   }
}

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

variable 'HighCorrelationPairs' not used
declaration of 'HighCorrelationPairs' hides global declaration at line 120

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

2 个答案:

答案 0 :(得分:0)

这个警告非常重要,因为大多数警告都是。 它说明如下:您在HighCorrelationPairs[]内声明了OnInit(),现在您使用这个新声明的数组执行所有操作,并且该数组仅在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);
}

答案 1 :(得分:0)

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

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

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

if身体的词汇范围内的最后一行 - if() {...} 正文 - part,作为{...} - 是唯一的短暂区域,其中新“本地”创建静态预先调整大小的对象,将为其分配值 string HighCorrelationPairs[1] = ... ; 是 立即失去了 一旦“声明范围”将被越过(即在创建/转让后立即)

接下来是变量名屏蔽:

接下来,在创建一个新的“本地”string HighCorrelationPairs[]之后,编译器必须至少通知您,在任何其他级别(已访问过的层次结构中较高)上定义的任何冲突对象名称都将变为un - 同时可用,因此保留最近声明的对象的名称,以有效地屏蔽所有先前定义的对象,带有词法上“相同”的名称。所以,你已被警告过了。

优化代码,以避免变量名掩盖并遵守变量词法“声明范围”。

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部分作为表达式(已满足)。

  

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

然而,编译器拒绝在此语法构造函数中提供任何其他 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();
                           }
  }