Ошибки, баги, вопросы - страница 2963

fxsaber:

Эта схема видится нерабочей. Покажите элементарный пример, пожалуйста.

Почему не рабочей? Как раз мне кажется под задачу. Принцип геттера сеттора.
Получение значения скрытой переменной через функцию.
Если передаёшь структуру MqlTick, то определи свою структуру с набором полей как у MqlTick, и добавь в структуру своё поле счётчика.
И возвращай из export функции эту структуру.
Элементарный пример для индикатора. То что пример приведён в скрипте, не обращайте внимания.

struct myMqlTick 
{ 
   datetime     time;          // Время последнего обновления цен 
   double       bid;           // Текущая цена Bid 
   double       ask;           // Текущая цена Ask 
   double       last;          // Текущая цена последней сделки (Last) 
   ulong        volume;        // Объем для текущей цены Last 
   ulong        count;  //Свой счётчик
   
}myStruct;

//--------------------------------------------------
myMqlTick GetTickStruct() export
{
   
   return(myStruct);
}

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   myStruct.time   = 0.0;
   myStruct.bid    = 0.0;
   myStruct.ask    = 0.0;
   myStruct.last   = 0.0;
   myStruct.volume = 0;
   myStruct.count  = 1;  //свой счётчик  
  
}
//+------------------------------------------------------------------+

В эксперте вызываешь GetTickStruct, и получаешь всю структуру, с своим счётчиком.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура для получения текущих цен
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура для получения текущих цен
  • www.mql5.com
Структура для получения текущих цен - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Roman:

В эксперте вызываешь GetTickStruct, получаешь всю структуру, с своим счётчиком.

Элементарную передачу числа из индикатора в советника напишите, пожалуйста.

fxsaber:

Элементарную передачу числа из индикатора в советника напишите, пожалуйста.

Замени структуру на одну переменную ))

Roman:

Замени структуру на одну переменную ))

Не передается.

fxsaber:

Не передается.

А импортировать функцию в эксперте не забыли?
Пример для структуры обновил, там не много не правильно было.
В общем если работать с структурой, то подумать как лучше объявлять объект структуры, глобально или локально.  
А для одной переменной, все это не нужно, просто возвращаем переменную и всё.

Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Импорт функций (#import) - Препроцессор - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Roman:

А импортировать функцию в эксперте не забыли?

Вы можете предоставить исходник индикатора и советника по своей идее или нет?

fxsaber:

Вы можете предоставить исходник индикатора и советника по своей идее или нет?

Да, странно. Export для функций в mql4 почему то не хочет работать.
Из библиотеки или из индикатора, результат ноль. Хотя в зависимостях, функции видны.
Пример для библиотеки

#property library
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

double value = 0.0;

//+------------------------------------------------------------------+
//| My function                                                      |
//+------------------------------------------------------------------+
double SetValue(double v) export
{
   value = v;    
   return(value);
}

//+------------------------------------------------------------------+
double GetValue(void) export
{
   return(value);
}
//+------------------------------------------------------------------+

Индикатор устанавливающий значение

#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window

#import "Lib.ex4"
   double SetValue(double v);
   double GetValue(void);
#import

MqlTick tick;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   Comment("");
}
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   
   SymbolInfoTick(NULL, tick);
   SetValue(tick.bid);
   
   //Comment((string)GetValue());   
   
   return(rates_total);
}
//+------------------------------------------------------------------+

Эксперт который должен получить значение через функцию, но этого не происходит

#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#import "Lib.ex4"
   double GetValue(void);
#import

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetMillisecondTimer(10);
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");
   EventKillTimer();
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
}

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
   double bid = GetValue();
   
   Comment("\r\nЭксперт получил значение из индикатора = "+(string)bid);
   //ChartRedraw();

}
//+------------------------------------------------------------------+
fxsaber:

Тики из индикатора отправляю через это: sparam содержит MqlTick, lparam - номер тика.

Советник в OnChartEvent ловит эти тики. И ему надо понять, сейчас пойманный тик - это самый актуальный или нет? Т.е. есть ли очередь из тиков или она пустая?

Для этого он читает номер (задача и состоит в чтении этого номера) самого последнего отправленного индикатором тика. Если пойманный тик имеет тот же номер - очередь пуста, и можно пачку тиков пускать в работу.


Ну и по ходу работы OnTick после всяких тормозных OrderSend нужно удостовериться, а не отправил ли индикатор еще тиков. Для этого снова нужно прочесть число от индикатора. И вот таких проверок за выполнение одного OnTick может быть за сотню. Поэтому и нужно быстро читать.

Если советник все равно берет тики через CopyTicks, зачем ему знать, что очередь пустая?

Пусть срабатывает по каждому из событий, а те, у которых время меньше уже обработанного, пропускает.

Andrey Khatimlianskii:

Если советник все равно берет тики через CopyTicks, зачем ему знать, что очередь пустая?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2021.02.17 21:26

Прошу поделиться соображениями по задаче (MT4):

Индикатор должен куда-то писать int-число. А советник его считывать.

fxsaber:

может что-то в этом роде поможет?

https://www.mql5.com/ru/code/818

File Mapping без DLL
File Mapping без DLL
  • www.mql5.com
Класс MQL5, который работает напрямую с маппингом, без использования самописной DLL.