如何解决我可以做一个使用RSI值作为条件的while循环吗?
当我尝试在MQL4中运行此while
循环时,似乎无法从循环内更新 rsi
。它始终返回与rsi
相同的值,因此保持永恒循环。我已经在EA和脚本上进行了尝试。
我也曾尝试使rsi
成为全局定义的变量,但仍然无法正常工作。
void OnTick()
{
double rsi = iRSI(NULL,14,PRICE_CLOSE,0); // defining rsi
while( rsi < 50 )
{
double rsi = iRSI(NULL,0); // update rsi
Sleep(10000); // slow down loop
Alert("this is from inside while loop rsi is "+rsi);
}
Alert("While loop exited,condition met"); // now code goes
Alert("opening an order now " ); // to place an order
}
解决方法
我可以制作一个使用RSI值作为条件的
while
循环吗?
哦,可以。
让我们排除碰撞的元素。
鉴于代码原样,有一些残酷的误解需要修复:
- 如果代码在这样的循环内“花了一些时间”,则永远不会听到来自市场的新传入
QUOTE
消息,因此您的Close[0]
值将对任何人保持“盲目”来自Market的此类更新。 - 如果第二个
double rsi = ...
声明是在while
循环构造函数的范围内进行的,则MQL4语言的较新版本(Builds)实际上将“屏蔽”较旧的(“外部”)变量,该变量仍在循环构造器控制变量/条件中使用。结果?您将“新”值分配给“内部”变量,该变量恰好与“外部”变量具有相同的名称(两个变量均名为rsi
,而“ 内部 “会不断掩盖“外部”,因此“外部”永远不会得到任何更新,如果有任何更新存储在循环中的“内部”中)
解决方案
- 通过不声明任何同名的命名变量来避免屏蔽(始终,这是良好的工程实践的标志)
- 避免通过聋环锁定接收市场-
QUOTE
-更新-优先使用if(){...}
而不是while(){...}
的非阻塞方式
MQL4是一个响应式生态系统,其中每当有来自外汇市场的新OnTick()
消息到达时,都会自动调用QUOTE
,因此请设计算法以使这些 从不阻止
为了获得学习指导的灵感,您可以使用此模板尝试以下几个步骤:
string MASK = "[%s]_INF:: " // DEF. & INIT...
+ "This is a QUOTE# %5d "
+ "Having arrived at [%s]_FX-MarketTIME\n"
+ "|Ask %16.8f\n"
+ "|Bid %16.8f\n"
+ "|Vol %16d\n"
+ "|RSI %16.8f";
double rsi = EMPTY; // DEF. & INIT...
int nTicks = 0; // DEF. & INIT...
void OnDeinit( const int aDeinitReason )
{ EventKillTimer();
}
int OnInit()
{ EventSetTimer( 1 );
Comment( "------------------------------------------------------\n ","WAITING for a first QUOTE-arrival from FX-Market\n","------------------------------------------------------"
);
return( 0 );
}
void OnTick()
{ nTicks++; // update COUNTER
rsi = iRSI( NULL,14,PRICE_CLOSE,0 ); // update rsi
Comment( SetupComment() ); // update GUI
// -------------------------------- FIRST 50 FX-Market Ticks delivered
if ( nTicks < 50 ) return;
// -------------------------------- AFTER 50 FX-Market Ticks delivered
// -------------------------------- BE WARNED,THIS IS AN AWFUL ANTI-PATTERN
while( True )
{
rsi = iRSI( NULL,0 ); // update rsi
Comment( SetupComment() ); // update GUI
Sleep( 10000 );
}
// -------------------------------- NEVER GETS HERE
Alert( "?" );
}
string SetupComment()
{ return( StringFormat( MASK,TimeToStr( TimeLocal(),TIME_DATE|TIME_MINUTES|TIME_SECONDS
),nTicks,TimeToStr( TimeCurrent(),NormalizeDouble( Ask,8 ),NormalizeDouble( Bid,Volume[0],NormalizeDouble( rsi,8 )
)
);
}
void OnTimer()
{ Comment( ChartGetString( 0,CHART_COMMENT ),"\n",TIME_DATE|TIME_MINUTES|TIME_SECONDS
)
);
Print( ChartGetString( 0,CHART_COMMENT ) );
}
,
在循环外仅声明一次rsi
,因为您已经拥有它。要使其按预期工作,请从循环内的变量double
前面删除类型rsi
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。