Обсуждение статьи "Основы программирования на MQL5 - Глобальные переменные терминала"

 

Опубликована статья Основы программирования на MQL5 - Глобальные переменные терминала:

В данной статье демонстрируются объектно-ориентированные возможности языка MQL5 по созданию объектов, отвечающих за работу с глобальными переменными терминала. В качестве практического примера рассматривается ситуация, когда глобальные переменные могут использоваться как контрольные точки выполнения этапов программы.

В среде MQL4/5 есть интересный инструмент – глобальные переменные клиентского терминала. Он позволяет создавать некоторую общую область хранения данных для всех программ терминала. Кроме того, жизнь этой области не прекращается при закрытии терминала. В данной статье я предлагаю воспользоваться средствами ООП, чтобы "разобраться" с глобальными переменными терминала.

В тексте статьи, если не оговорено иное, глобальные переменные клиентского терминала будут называться для краткости "глобальные переменные".


1. Глобальные переменные, функции

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

Разработчики языка в документации указывают, что есть 11 функций, обрабатывающих потребности глобальных переменных. В учебнике по MQL4 есть раздел "Переменные GlobalVariables", где рассматривается теория.  В следующих разделах будем использовать средства ООП для выполнения поставленных задач.

Схематично процесс отслеживания этапов работы модулей посредством глобальных переменных представлен на рис.8.

Рис.8 Диаграмма последовательностей для обработки флагов

Рис.8. Диаграмма последовательностей для обработки флагов

Автор: Dennis Kirichenko

 
### Успение · Что вы хотите реализовать

※ Пожалуйста, проверьте файл библиотеки 2, который будет использоваться сначала из нижней ссылки ссылки.



① Назначение:

Хотите написать и прочитать глобальные переменные (обычно называемые глобальными переменными) для внешних txt-файлов в MT4 / MT5, который является инструментом для торговли валютой, предоставляемым MetaQuotes.


② Состояние:

Я хотел бы реализовать это, используя классы CGlobalVar.mqh и CGlobalVarList.mqh, описанные на ссылочной странице ниже.

(В частности, он выполняет запись / чтение глобальной переменной с использованием метода Save () / Load () класса CGLobalVarList)

В основном не используют Windows API (HANDLE CeateFile W () и т. Д.).


③ Место хранения файла операции:

Позиция файла адресата по умолчанию соответствует спецификации этого класса

/ Файлы

или

Он сохраняется, когда FILE_COMMON указан как аргумент FileOpen ()

C: \ User \ User-Name \ AppData \ Roaming \ MetaQuotes \ Terminal \ Common \ Files \ File

И один из.


④ Созданные файлы:

Два простых файла сценариев в качестве экспериментальных образцов

WriteGlobalParameters.mq4

и

ReadGlobalParameters.mq4

Она была создана.


※ замечания

① Если только целью является обмен глобальной переменной с другим терминалом, можно подумать о методе использования разделяемой памяти и т. Д. Однако на этот раз думать только о методе, использующем внешний файл txt.


② Что касается файла (WriteGlobalParamaeters.mq 4) на стороне экспорта, используя встроенные функции MQL GlobalVariablesTotal (), GlobalVariableName (), GlobalVariableGet (), GlobalVariableTime (), не используя Save (HANDLE) Запись с помощью функции WriteFile () (↓)

  for (int i = GlobalVariablesTotal () - 1; i> = 0; i -) {

  string gName = GlobalVariableName (i);

  if (this.CheckGlobalVar (gName)) continue;

  double gValue = GlobalVariableGet (gName);

  datetime gTime = GlobalVariableTime (gName);

        WriteFile (hFile, gName, gValue, gTime);

}, Можно было написать список переменных в txt-файл в указанном каталоге.

Однако в случае использования вышеперечисленной функциональной группы GlobalVariable, даже если она может быть выписана, ее нельзя добавить в список глобальных переменных чтения и терминала, поэтому она оставлена.


### Проблемы, возникающие · Сообщение об ошибке

WriteGlobalParameters.mq 4 Сторона:

2018.05.26 22: 34: 45.283 WriteGlobalParameters EURUSD, M1: uninit reason 0

2018.05.26 22: 34: 45.283 WriteGlobalParameters EURUSD, M1: Ошибка сохранения файла

2018.05.26 22: 34: 45.282 WriteGlobalParameters EURUSD, M1: Ошибка создания указателя


ReadGlobalParameters.mq 4 Сторона:

2018.05.26 22: 43: 08.397 ReadGlobalParameters EURUSD, M1: непонятная причина 0

2018.05.26 22: 43: 08.397 ReadGlobalParameters EURUSD, M1: Ошибка создания указателя


* Из приведенного выше сообщения об ошибке

Понятно, что предполагаемая операция не выполняется из-за недостатков в указании указателя и неадекватной работы файла,

Поскольку неизвестно, где проблема находится в следующем коде, я хотел бы рассказать об этой точке (а также о непонятной причине 0)


```MQL4/MQL5

WriteGlobalParameters.mq4>

//+------------------------------------------------------------------+

//|                                        WriteGlobalParameters.mq4 |

//|                        Copyright 2018, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2018, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#include <Arrays\List.mqh>

#include <CGlobalVar.mqh>

#include <CGlobalVarList.mqh>

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart(){

//Your File Name

string FileName="Write";

string FileType="txt";

string file=FileName+"."+FileType;


//Pointer

CGlobalVarList *list = new CGlobalVarList;

if(list!=NULL){

   Print("Pointer Create Error");

}


//Handle

int hFile;

hFile=FileOpen(file,FILE_WRITE|FILE_COMMON); //FILE_CSV|FILE_UNICODE


if(hFile>=0){

   if(!list.Save(hFile)){

      Print("File Save Error");

      delete list;

      FileClose(hFile);

   }

//Close

    FileClose(hFile);

}

//Release the Pointer

delete list;

}

==========================================================================

ReadGlobalParameters.mq4>

//+------------------------------------------------------------------+

//|                                                  ReadGlobalParameters.mq4 |

//|                        Copyright 2018, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2018, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#include <Arrays\List.mqh>

#include <CGlobalVar.mqh>

#include <CGlobalVarList.mqh>

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart(){

//Your File Name

string FileName="Read";

string FileType="txt";

string file=FileName+"."+FileType;


//Pointer

CGlobalVarList *list = new CGlobalVarList;

if(list!=NULL){

   Print("Pointer Create Error");

}


//Handle

int hFile;

hFile=FileOpen(file,FILE_READ|FILE_COMMON); //FILE_CSV|FILE_UNICODE


if(hFile>=0){

   if(!list.Load(hFile)){

      Print("File Load Error");

      delete list;

      FileClose(hFile);

   }

//Close

    FileClose(hFile);

}

//Release the Pointer

delete list;

}


### Я пробовал

起動 Включить MT 4 и зарегистрировать произвольные имена и числовые значения (0.0 или 1.0 легко в Coco) в списке глобальных переменных на терминале.

(Время не установлено, поскольку оно автоматически устанавливается при регистрации)


================================================== ===============

Сначала от Write GlobalParameters.mq4 side ---


① WriteGlobalParameters.mq4 применяется к диаграмме с настройкой ⓪.

→ Если он работает правильно, файл создается в каталоге, указанном выше, и должна быть введена информация о глобальной переменной.


② Если вы проверяете каталог (C: \ User \ User - Name \ AppData \ Roaming \ MetaQuotes \ Terminal \ Common \ Files \),

Указанный «Write.txt» был создан, но размер файла составляет 0 килобайт.

→ Когда я открыл его, естественно, имя и значение глобальной переменной не были введены.


================================================== ================

Далее на ReadGlobalParameters.mq 4 сторона ---


③ Я создал файл «Read.txt» для чтения глобальной переменной с произвольным именем и числовым значением в том же каталоге, что и 2

(Мы создали и протестировали два типа имен / номеров / временных разрывов, разделили (не указано) и разделили табуляцию (указав «\ t» в FileOpen ()))


④ Как и в случае с ①, аналогично ①, даже если вы примените ReadGlobalParameters.mq4 к диаграмме, выведенное выше сообщение об ошибке и открытие списка глобальных переменных на терминале также было пустым.


================================================== ================

※ замечания

В качестве меры предосторожности мы провели тот же эксперимент с FILE_CSV, FILE_UNICODE, FILE_BIN и FILE_ANSI, которые по умолчанию заданы для функции FileOpen (), но результат не изменился.

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • www.mql5.com
The Synchronized Charts script allows comparing bars of different symbols or different periods of the same symbol. Attach the script to a chart and move bars or change the scale, all opened chart will move synchronously with the current one. The bars on different charts aligned to the border according to their open time. CreateGridOrdersTune A...
Причина обращения: