如何从其他货币对导入买入/卖出价? - 页 5

 
HosseinKOGO:

这就是GBPAUD H4 3.12.2018的一整天!而且这次我没有跳到最后。

打印功能 有太多的报告需要打印时,可能会丢失一些报告?
我想另一个问题可能是因为这三个工具的ticks是在不同的毫秒内出现的,所以当我们在GBPAUD上使用start/OnTick函数时,只要GBPAUD的tick出现,它就会执行start函数。我想你的代码可能会说,当这3个货币对的价格都不为0时,就会返回所有的货币对价格。

数据看起来很好...

你对打印功能的看法是正确的...我在测试中也看到许多缺失的行。但是当我把所有的东西都打印到文件中时,没有任何东西被遗漏。

这里有一些关于代码的信息:GBPAUD的每一个刻度的时间将被用来获取其他货币对的最新刻度(到同一时间),所以它总是会返回一些东西,不会是零。

我决定把这个函数放到一个类中,这样应该更整洁。见附件。把它放在你的专家文件夹里,和你的EA一起。请自由修改它。

下面的例子向你展示了使用它的一种方法(突出显示的线条是必不可少的)。

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

string otherPairs[] = {"GBPUSD","EURUSD"};
string allPairs[] = {};

int tickCount = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
      allPairs[i] = otherPairs[i-1];
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
  }
//+------------------------------------------------------------------+

void printTicktoFile(string sym, MqlTick &tick)
{
   int file = FileOpen("LogFile.log",FILE_WRITE|FILE_READ|FILE_TXT);
   FileSeek(file,0,SEEK_END);
   FileWrite(file, sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
   FileClose(file);
}

void printTick(string sym, MqlTick &tick)
{
   Print (sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
}

因此,真正的关键是这一行:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>)。如果它返回false,你将不得不检查日志中的错误信息。

附加的文件:
TicksInfo.mqh  5 kb
 
Seng Joo Thio:

数据看起来很好...

你对打印功能的看法是正确的...我在测试中也看到了许多缺失的行。但是当我把所有的东西都打印到文件中时,没有任何东西被遗漏。

这里有一些关于代码的信息:GBPAUD的每一个刻度的时间将被用来获取其他货币对的最新刻度(到同一时间),所以它总是会返回一些东西,不会是零。

我决定把这个函数放到一个类中,这样应该更整洁。见附件。把它放在你的专家文件夹里,和你的EA一起。请自由修改它。

下面的例子向你展示了使用它的一种方法(突出显示的线条是必不可少的)。

因此,真正的关键是这一行:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>)。如果它返回错误,你必须查看日志中的错误信息。

谢谢你的帮助。

我已经将所有这些行复制到每个适当的区域。但是,由于我不理解这些代码,请告诉我如何将SecondPair的Ask和Bid放入Ask2,Bid2中,ThirdPair也是如此。
这里是我的全局区域。

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {SecondPair,ThirdPair};
string allPairs[] = {};

int tickCount = 0;
.
.
.

这一部分在编译时返回2个错误。我应该如何处理?
'SecondPair' - 需要常量表达式 MyEA!.mq4
'ThirdPair' - 需要常量表达式 MyEA!.mq4

 
HosseinKOGO:

谢谢你的帮助。

我已经把所有这些行复制到每个适当的区域。但是,由于我不理解这些代码,请告诉我如何将SecondPair的Ask和Bid放入Ask2,Bid2中,对ThirdPair也是如此。
这里是我的全局区域。

这一部分在编译时返回2个错误。我应该如何处理?
'SecondPair' - 需要常量表达式 MyEA!.mq4
'ThirdPair' - 需要常量表达式 MyEA!.mq4

然后用和allPairs一样的方式声明你的otherPairs。在OnInit中,这样做。

ArrayResize(otherPairs,2);
otherPairs[0] = SecondPair;
otherPairs[1] = ThirdPair;

为了给Ask2、Bid2、Ask3、Bid3赋值,在OnTick中这样做。

   MqlTick myTick;
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");
 
Seng Joo Thio:

然后用和allPairs一样的方式声明你的otherPairs。在OnInit中,这样做。

为了给Ask2、Bid2、Ask3、Bid3赋值,在OnTick中这样做。

它又给了我00点:(
我的全局区域。

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {};
string allPairs[] = {};

int tickCount = 0;
.
.
.

OnInit:

   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
   allPairs[i] = otherPairs[i-1];
   
   ArrayResize(otherPairs,2);
   otherPairs[0] = SecondPair;
   otherPairs[1] = ThirdPair;
.
.
.

OnDeinit:

   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);

OnTick:

   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
   
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");

日志。
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA!GBPAUD,H4: GBPCAD错误
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA!GBPAUD,H4: GBPUSD 错误
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA!GBPAUD,H4: GBPAUD tick number 221179, at 2018.01.03 23:36:58 000 Ask = 1.72479 Bid = 1.72459
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA!GBPAUD,H4: ===现在处理221179点



我哪里弄错了?
对不起,我的技术水平为零 :D

 
HosseinKOGO:

它又给了我00元:(
我的全局区域。

OnInit:

OnDeinit:

OnTick:

我哪里弄错了?
我为我的零水平技能感到抱歉 :D

OnInit--这3行新字应该放在所有内容之前。
 
HosseinKOGO:

我为我的零水平技能感到抱歉 :D

这都是关于变量和函数,以及实验的意愿。
 
Seng Joo Thio:
OnInit - 这3行新字应该放在所有内容之前。

我做到了。但非常奇怪的是:这两对额外的计时器没有工作......

2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPCAD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPUSD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPAUD tick number 370711, at 2018.01.05 11:11:24 000 Ask = 1.72644 Bid = 1.72624
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: === Now process tick 370711
 
HosseinKOGO:

我做到了。但非常奇怪的是:这两个额外的对子的定时器并不工作......

给我看看整个EA,在你做完实验后,仍然想不明白为什么。我可以在8小时后看一下:)。现在我需要😴...😂
 
  1. Seng Joo Thio: OnInit - 3个新行应该在一切之前。
    不要试图在OnInit(或加载时)使用任何价格或服务器相关的函数,因为可能还没有连接/图表。
    1. 终端启动。
    2. 指标/EAs被加载。静态变量和全局声明变量被初始化。(不要依赖特定的顺序。)
    3. OnInit 被调用。
    4. 对于指标,OnCalculate 被调用,有任何现有的历史记录。
    5. 人类可能需要输入密码,开始与服务器连接。
    6. 收到新的历史记录,OnCalculate 再次被调用。
    7. 现在TickValueTimeCurrent、账户信息和价格都是有效的,如果有新的tick被接收,OnCalculate/OnTick 被调用。

  2. 在MT4上。除非当前的图表是引用的特定货币对/TF,否则您必须 访问价格之前 处理4066/4073 错误。
    MQL4 EA中的下载历史 - MQL4 和 MetaTrader 4 - MQL4 编程论坛
    已更正

    链接到的函数,为有关的符号/TF打开一个隐藏的图表(如果还没有打开的话),从而更新历史,并暂时把符号放在市场观察上(如果还没有的话),所以SymbolInfoDouble(symbol,SYMBOL_BID)或MarketInfo(symbol,MODE_BID)第一次调用时不会返回0。

 
William Roeder:
  1. 不要试图在OnInit(或加载时)使用任何价格或服务器相关函数,因为可能还没有连接/图表。
    1. 终端启动。
    2. 指标/EAs被加载。静态变量和全局声明变量被初始化。(不要依赖特定的顺序。)
    3. OnInit 被调用。
    4. 对于指标,OnCalculate 被调用,有任何现有的历史记录。
    5. 人类可能需要输入密码,开始与服务器连接。
    6. 收到新的历史记录,OnCalculate 再次被调用。
    7. 现在TickValueTimeCurrent、账户信息和价格都是有效的,如果有新的tick被接收,OnCalculate/OnTick 被调用。

  2. 在MT4上。除非当前的图表是引用的那个特定的货币对/TF,否则您必须 访问价格之前 处理4066/4073 错误。
    MQL4 EA中的下载历史 - MQL4 和 MetaTrader 4 - MQL4 编程论坛
    已更正

    链接到的函数,为有关的符号/TF打开一个隐藏的图表(如果还没有打开的话),从而更新历史,并暂时将符号放在市场观察(如果还没有的话),所以SymbolInfoDouble(symbol,SYMBOL_BID)或MarketInfo(symbol,MODE_BID)在第一次调用时不会返回0。

你是对的。不过不用担心,因为我们在OnInit中做的唯一事情是初始化用于存储符号名称的数组,以及准备一些用于读取我们自己的数据文件的文件柄。至于买入和卖出价格(即 "tick "数据),我们只在OnTick中访问它们,而且主要是从我们自己的数据文件中访问,因为MT4策略测试器在查询其他符号的此类数据时总是返回零(注意,这种行为与人们更熟悉的OHLC数据的检索不同)。