我有一个交易突破的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
这只是一个警告,而不是错误。
答案 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();
}
}