Как импортировать бид/аск из другой валютной пары? - страница 5

 
HosseinKOGO:

Это GBPAUD H4 3.12.2018 целый день! И в этот раз я не пропустил до конца.

Может ли функция печати терять некоторые отчеты, когда у нее слишком много отчетов для печати?
Я думаю, другая проблема может быть связана с тем, что тики этих 3 инструментов выходят в разные миллисекунды, поэтому, когда мы используем функцию start/OnTick на GBPAUD, она просто выполняет функцию start всякий раз, когда выходит тик GBPAUD. И я предполагаю, что в вашем коде может быть сказано, что нужно вернуть цены всех этих 3 пар, когда ни одна из них не равна 0. Если это так, то функция возвращает цены, когда все цены ask/bid всех инструментов выходят в одно и то же время.

Данные выглядят нормально...

Вы правы насчет функции печати... Я тоже вижу много пропущенных строк в своем тестировании. Но когда я печатаю все в файл, ничего не пропущено.

Вот немного информации о коде: время каждого тика GBPAUD будет использоваться для получения последних тиков других пар (до того же времени), поэтому функция всегда будет что-то возвращать, не ноль.

Я решил поместить функцию в класс, что должно быть аккуратнее. См. прикрепленный файл. Поместите его в папку expert вместе с советником. Не стесняйтесь модифицировать его.

Следующий пример показывает один из вариантов использования (выделенные линии очень важны):

#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 будет использоваться для получения последних тиков других пар (до того же времени), поэтому функция всегда будет что-то возвращать, не ноль.

Я решил поместить функцию в класс, что должно быть аккуратнее. См. прикрепленный файл. Поместите его в папку expert, вместе с советником. Не стесняйтесь модифицировать его.

Следующий пример показывает один из способов использования (выделенные линии очень важны):

Итак, ключом на самом деле является только эта строка:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Если она возвращает false, вам придется проверить журнал на наличие сообщения об ошибке.

Спасибо за помощь,

Я скопировал все эти строки во все нужные места. Но поскольку я не понимаю код, пожалуйста, подскажите, как поместить Ask и Bid второй пары в Ask2,Bid2 и то же самое для третьей пары.
Вот моя глобальная область:

#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:

Спасибо за помощь,

Я скопировал все эти строки во все нужные области. Но поскольку я не понимаю код, пожалуйста, подскажите мне, как поместить Ask и Bid второй пары в Ask2,Bid2 и то же самое для третьей пары.
Вот моя глобальная область:

И Эта часть возвращает 2 ошибки при компиляции. Что мне с ними делать?
'SecondPair' - требуется константное выражение MyEA!.mq4
'ThirdPair' - требуется постоянное выражение MyEA!.mq4

Тогда объявите свои otherPairs так же, как и allPairs. И в 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:

Затем объявите свои otherPairs так же, как и allPairs. И в 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");

Journal:
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 тик номер 221179, в 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. Загружаются индикаторы/ЭА. Инициализируются статические и глобально объявленные переменные. (Не зависит от конкретного порядка).
    3. ВызываетсяOnInit.
    4. Для индикаторов вызывается OnCalculate с любой существующей историей.
    5. Человеку может потребоваться ввести пароль, начинается соединение с сервером.
    6. Получена новая история, снова вызывается OnCalculate.
    7. Получается новый тик, вызывается OnCalculate/OnTick. Теперь TickValue, TimeCurrent, информация о счете и цены действительны.

  2. На MT4: Если текущий график не относится к конкретной паре/TF, вы должны обработать ошибки 4066/4073перед обращением к ценам.
    История загрузки в MQL4 советнике - MQL4 и MetaTrader 4 - Форум по программированию на MQL4
    Исправлено

    Функция, на которую дана ссылка, открывает скрытый график для данного символа/TF (если он еще не открыт), обновляя историю, и временно помещает символ в Market Watch (если его там еще нет), чтобы SymbolInfoDouble(symbol, SYMBOL_BID ) или MarketInfo(symbol, MODE_BID ) также не вернули ноль при первом вызове.

 
William Roeder:
  1. Не пытайтесь использовать какие-либо функции, связанные с ценой или сервером, в OnInit (или при загрузке), так как может еще не быть соединения/графика:
    1. Терминал запускается.
    2. Загружаются индикаторы/ЭА. Инициализируются статические и глобально объявленные переменные. (Не зависит от конкретного порядка).
    3. ВызываетсяOnInit.
    4. Для индикаторов вызывается OnCalculate с любой существующей историей.
    5. Человеку может потребоваться ввести пароль, начинается соединение с сервером.
    6. Получена новая история, снова вызывается OnCalculate.
    7. Получается новый тик, вызывается OnCalculate/OnTick. Теперь TickValue, TimeCurrent, информация о счете и цены действительны.

  2. На MT4: Если текущий график не относится к конкретной паре/TF, вы должны обработать ошибки 4066/4073перед обращением к ценам.
    История загрузки в MQL4 советнике - MQL4 и MetaTrader 4 - Форум по программированию на MQL4
    Исправлено

    Функция, на которую дана ссылка, открывает скрытый график для данного символа/TF (если он еще не открыт), обновляя историю, и временно помещает символ в Market Watch (если его там еще нет), чтобы SymbolInfoDouble(symbol, SYMBOL_BID ) или MarketInfo(symbol, MODE_BID ) также не вернули ноль при первом вызове.

Вы правы. Но не стоит беспокоиться, потому что единственное, что мы делаем в OnInit, это инициализируем массивы для хранения имен символов и подготавливаем некоторые дескрипторы файлов для чтения наших собственных файлов данных. Что касается цен спроса и предложения (т.е. "тиковых" данных), мы обращаемся к ним только в OnTick, и в основном из наших собственных файлов данных, поскольку тестер стратегий MT4 всегда возвращает нули при запросе таких данных других символов (обратите внимание, что это поведение отличается от получения данных OHLC, с которыми люди более знакомы).

Причина обращения: