mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 101

 
fxsaber :

결과

예, 내 컴퓨터에서 약 4ms가 소요되는 Sleep 의 내부 작업을 고려하지 않았습니다.

좋은 점은 (정확도를 중요하게 생각하는) 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 :

네. 이것이 전역 변수가 언급되는 이유입니다.

그리고 터미널 사이에 이 방법 을 사용하기 시작했습니다.

네, 정말 멋져요!
아주 멋진 발견은 SSD 대신 RAM 디스크를 사용한다는 것입니다.

 
fxsaber :

네. 이것이 전역 변수가 언급되는 이유입니다.

그리고 터미널 사이에 이 방법 을 사용하기 시작했습니다.

오랫동안 나는 user32.dll을 사용하여 그렇게 쉬운 세미 해커 방법을 사용해 왔습니다. 그러나 틱 배열은 이러한 방식으로 전송할 수 없습니다.

그것은 오래 전 MQL4를 마스터하는 새벽에 발명되었습니다. 어디에서도 더 짧은 솔루션을 본 적이 없습니다. 물론 거래소의 정상적인 조직이라는 관점에서 보면 비뚤어지지만 똑똑하게 작동하고(기존의 모든 솔루션보다 빠를 수도 있음) 제대로 작동하고 모든 면에서 나에게 어울리기 때문에 하지 않았다. 더 이상 내 두뇌를 긴장.

또한 이 방법은 추가 단계가 필요하지 않습니다.

요점은 모든 Windows에는 모두에 대한 공통 문자열 변수인 기본 Windows 창의 이름이 있다는 것입니다. 누구나 변경할 수 있고 누구나 볼 수 있습니다.

 
니콜라이 셈코 :

오랫동안 나는 user32.dll을 사용하여 그렇게 쉬운 세미 해커 방법을 사용해 왔습니다. 그러나 틱 배열은 이러한 방식으로 전송할 수 없습니다.

dll을 통해 모든 데이터 유형에 대한 보편적인 솔루션 이 있습니다.

 
니콜라이 셈코 :

그러나 그것은 현명하게 작동합니다(모든 기존 솔루션보다 빠를 수 있음)

글쎄, 당신은 이미 너무 멀리 갔다) 먼저 메시지 대기열을 통과합니다. 둘째, 몇 가지 추가 변환(앞뒤)을 수행해야 합니다. 또한 일종의 검증이 진행 중입니다.

그런데 구조체의 크기를 명시적으로 지정해서는 안 됩니다. 이것이 바로 sizeof의 용도입니다.

 
fxsaber :

dll을 통해 모든 데이터 유형에 대한 보편적인 솔루션 이 있습니다.

나는 논쟁하지 않는다. 귀하의 솔루션은 실제로 더 일반적입니다.
그러나 개인적으로 현재 틱을 전송하기 위해서만 터미널 사이에 브리지가 필요합니다.

내 버전은 원시성으로 인해 이해하기 쉽고 조금 더 빠르게 작동합니다. 당신과 비교하여 측정 - 1.5-2 배 어딘가에서 더 빠릅니다. 틱 전송당 판독값은 90마이크로초 대 160마이크로초입니다.

파일:
사유: