GetSymbolByName(string symbol)
{
string symbol_name=""; // Имя символа на сервере//--- Если передали пустую строку, вернем пустую строкуif(symbol=="")
return("");
//--- Пройтись по списку всех символов на сервереfor(int s=0; s<SymbolsTotal(false); s++)
{
//--- Получим имя символа
symbol_name=SymbolName(s,false);
//--- Если искомый символ есть на сервереif(symbol==symbol_name)
{
//--- Выберем его в окне "Обзор рынка"SymbolSelect(symbol,true);
//--- Вернем имя символаreturn(symbol);
}
}
//--- Если искомого символа нет, вернем пустую строкуPrint("Символ "+symbol+" не найден на сервере!");
return("");
}
int OnInit()
{
//---
GetSymbolByName("EURUSD"+SymbolSuffix);
GetSymbolByName("GBPUSD"+SymbolSuffix);
GetSymbolByName("EURGBP"+SymbolSuffix);
}
void OnTimer() // или OnTick
{
if(!SymbolInfoTick("EURUSD"+SymbolSuffix,tickEUR)) {Print("EURUSD price has not been received"); return;}
if(!SymbolInfoTick("GBPUSD"+SymbolSuffix,tickGBP)) {Print("GBPUSD price has not been received"); return;}
if(!SymbolInfoTick("EURGBP"+SymbolSuffix,tickEURGBP)) {Print("EURGBP price has not been received"); return;}
if(tickEUR.ask!=0 && tickEUR.bid!=0) {} // ну и все в этом духе
}
有趣的是,昨天我想利用MarketBookAdd和OnBookEvent的功能来制作一个多货币的EA。
但由于某些原因,测试器上的MarketBookAdd不起作用。它给出了一个错误4901-价格 栈不能被添加。
它只在实时情况下工作。
而且我不需要得到一个价格的堆叠,而是要有这样简单的功能。
1.清除市场观察的内容。
2.在那里添加所需的字符(这是可用的)。
3.使用函数或事件来接收每个符号在市场观察中显示的所有刻度,或者将OptiScope与多刻度功能结合起来。
而且我不需要得到那一叠价格,而是要有这样简单的可能性。
1.清除市场观察的内容。
2.在那里添加所需的字符(这是可用的)。
3.使用函数或事件来接收每个符号在Market Watch中显示的所有刻度,或将Optik与MultiTick函数一起使用。
不太清楚的是,如果你想用市场概况和刻度线工作,为什么你决定通过价格堆栈?
而你要从哪里获得所有可见或添加到市场概览中的报价数据。
而你要从哪里获得所有可见或添加到市场概览中的报价数据。
而你要从哪里获得所有可见或添加到市场概览中的报价数据。
你怎么能在这么多的帖子中如此不敬业的愚昧呢?
如果EA处理每一个刻度,即使在计时器中使用了毫秒,也是低效的。
需要一个更简单的方法来直接从市场概览中获得所有的点位。
通过OpTisk是不可能的,因为它只在下一个tick出现在EA所处的位置时起作用。
你仍然要通过计时器来做这件事。计时器只需要一个算法,以便在最后一个刻度与前一个刻度相同的情况下不提出请求。
BookEvent在这里不会帮助你。
你仍然要通过计时器来做这件事。计时器只需要一个算法,以便在最后一个刻度与前一个刻度相同的情况下不提出请求。
BookEvent在这里不会帮助你。
是的,但你也应该考虑到这里只有一个定时器,而不是那么,那么VC++,如果你有很多的定时器检查,你就可能失去很多的时间,一切都会变成一团糟。