mql5言語の特徴、微妙なニュアンスとテクニック - ページ 101

 
fxsaber

結果

はい、私のコンピュータでは約4ミリ秒かかるスリープの 内部作業を考慮に入れていません。

Sleepに代わる良い方法(精度を気にする人 : )として

void sleep(int m)
  {
   if(m>0) Sleep(int(0.995*m+0.5)-1);
  }

0.995の精度を保証することはできませんが。自分のパソコン用に手に取りました。万人向けかもしれません。

ファイル:
TestSleep.mq5  1 kb
 
fxsaber

正直、どういう意味なのか、MQL5のどこで遭遇できるのかさえもわかりません。

同期機能であっても、あらゆる場面でスパイクが発生する可能性があるということです。どうしようもないことなので、意識して気にしないようにすればいいのです。

https://en.wikipedia.org/wiki/Interrupt
Interrupt - Wikipedia
Interrupt - Wikipedia
  • en.wikipedia.org
This article is about computer interrupts. For the study of the effect of disruptions on job performance, see Interruption science. For other uses, see Interruption. In system programming, an interrupt is a signal to the processor emitted by hardware or software indicating an event that needs immediate attention. An interrupt alerts the...
 

プログラム間の情報伝達には、ファイルやグローバル変数のほかに、次のような方法があります。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

ライブラリ:TradeTransactions

fxsaber さん 2018.09.20 16:23

// Пример хранения/обмена данными через Ресурсы внутри Терминала
#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166

void OnStart()
{  
  const RESOURCEDATA<int> ResourceINT("::int"); // Ресурс для обмена int-ами. const - как доказательство, что ничего не пишется в объект класса
  
  int ArrayINT[] = {1, 2, 3};
  int Num = 5;
  
  ResourceINT = ArrayINT;  // Ресурс хранит массив.
  ResourceINT += Num;      // Добавили в ресурс еще значение.
  ResourceINT += ArrayINT; // Добавили массив.
  
  int ArrayINT2[];  
  ResourceINT.Get(ArrayINT2); // Считали данные из ресурса.
  ArrayPrint(ArrayINT2);      // Вывели: 1 2 3 5 1 2 3

  ResourceINT.Free();                // Удалили данные из ресурса
  Print(ResourceINT.Get(ArrayINT2)); // Убедились, что данных нет: 0

  const RESOURCEDATA<MqlTick> ResourceTicks("::Ticks"); // Ресурс для обмена тиками. const - как доказательство, что ничего не пишется в объект класса
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    for (int i = 0; i < 3; i++)
      ResourceTicks += Tick; // Добавили в ресурс тики

  MqlTick Ticks[];
  ResourceTicks.Get(Ticks); // Считали данные из ресурса.
  ArrayPrint(Ticks);        // Вывели.
  
  // Это полное имя ресурса для обращения из другой программы
  const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::Ticks";  
  Print(NameOut); // Вывели полное имя ресурса.
  
  const RESOURCEDATA<MqlTick> Resource(NameOut); // Ресурс для доступа к данным (read-only) из другой программы
  
  MqlTick TicksOut[];
  Resource.Get(TicksOut); // Считали данные из ресурса.
  ArrayPrint(TicksOut);   // Вывели.
  
  Resource.Free();   // Не получится повлиять на данные read-only-ресурса.
  Print(_LastError); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции.
}
 
fxsaber

ファイルやグローバル変数とは別に、プログラム間で情報を やり取りする方法がある

1つの実行中の端末内のプログラムの話ですよね?

 
ニコライ・セムコ

1つの実行端末内のプログラムの話ですよね?

そうです、だからグローバル変数 と書いてあるのです。

そして、端末間でもこの ような使い方をするようになりました。
 
fxsaber

そうです、だからグローバル変数 と書いてあるのです。

そして、端末間でもこの 方法が使われるようになった。

ええ、本当にかっこいいです!
SSDの代わりにRAMディスクを使用した非常にクールな発見です。

 
fxsaber

そうです、だからグローバル変数 と書いてあるのです。

端子と端子の間はこの ように使うようになりました。

そんなuser32.dllを使った簡単なセミハッカー方式をずっと使っています。しかし、この方法ではティックの配列を渡すことは不可能です。

昔、MQL4をマスターしているときに発明したものです。もちろん、交換の合理的な構成という点では最短の解決策ではありませんが、速くてよく動く(たぶん既存のすべての解決策より速い)ので、もう頭を悩ませていないわけです。

しかも、この方法は、追加のアクションを必要としません。

ポイントは、Windows全体で、メインWindowsウィンドウの名前という文字列型の共通変数があることです。すべての人が変えることができ、すべての人が見ることができる。

ファイル:
 
ニコライ・セムコ

そんな簡単な半ハッカー方式で、user32.dllを使った方法をずっと使っています。しかし、この方法ではティックアレイを転送することはできません。

dll経由であれば、すべてのデータ型に対応するユニバーサルソリューションが あります。

 
ニコライ・セムコ

しかし、高速です(おそらく既存のすべてのソリューションよりも高速です)。

まあ、行き過ぎですね)まず、メッセージキューを経由します。次に、追加でコンバージョン(前後変換)をする必要があります。それに、検証も行われているんですよ。

ちなみに、構造体の大き さは明示的に指定しないほうがいい。そのためのsizeofです。

 
fxsaber

dll経由であれば、すべてのデータ型に対応するユニバーサルソリューションが あります。

議論しているわけではありません。あなたのソリューションは、本当はもっと普遍的なものなのです。
しかし、個人的には、電流のカチカチ伝達のための端子間ブリッジがあればいいと思っています。

私のバリエーションは、原始的であるために理解しやすく、動作が少し速いだけです。皆さんのものと比較して測定したところ、1.5~2倍速くなっていました。1ティックの読み取り時間は、90マイクロ秒と160マイクロ秒の比較。

ファイル:
理由: