MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 618

 
neverness :

나는 당신 자신이 그것에 대해 전혀 모를 때 다른 사람을 가르치지 말아야 한다고 바로 당신에게 말했습니다.

도움은 "등불"이 아니라 "자격이 있어야" 합니다!

정확히 무엇이 필요한지 작업을 다시 설명하십시오.

 
Vitaly Muzichenko :

정확히 무엇이 필요한지 작업을 다시 설명하십시오.

다른 모듈 간에 MT4/MT5의 데이터를 전송할 수 있는 가능성에 관심이 있습니다.

예를 들어:

한 지표에서 다른 지표로 데이터를 전송하는 방법은 무엇입니까?

지표에서 스크립트로 데이터를 전송하는 방법은 무엇입니까?

지표에서 Expert Advisor 로 데이터를 전송하는 방법은 무엇입니까? … 등.

상당히 분명하고 일반적인 전송 방법은 전송된 데이터를 별도의 파일에 쓴 다음 다른 모듈의 파일에서 이 데이터를 읽는 것입니다.

그러나 이 경우 전송/읽기 데이터의 동기화 문제가 있다.

직관적으로 MT4/MT5 터미널에는 공통 메모리 버퍼 영역이 있어야 하고 이 영역을 통한 데이터 교환을 규제하는 절차가 있어야 한다고 가정합니다.

그러나 나는 설명에서 아무것도 찾지 못했습니다.

 
neverness :

다른 모듈 간에 MT4/MT5의 데이터를 전송할 수 있는 가능성에 관심이 있습니다.

예를 들어:

한 지표에서 다른 지표로 데이터를 전송하는 방법은 무엇입니까?

지표에서 스크립트로 데이터를 전송하는 방법은 무엇입니까?

지표에서 Expert Advisor로 데이터를 전송하는 방법은 무엇입니까? … 등.

상당히 분명하고 일반적인 전송 방법은 전송된 데이터를 별도의 파일에 쓴 다음 다른 모듈의 파일에서 이 데이터를 읽는 것입니다.

그러나 이 경우 전송/읽기 데이터의 동기화 문제가 있다.

직관적으로 MT4/MT5 터미널에는 공통 메모리 버퍼 영역이 있어야 하고 이 영역을 통한 데이터 교환을 규제하는 절차가 있어야 한다고 가정합니다.

그러나 나는 설명에서 아무것도 찾지 못했습니다.

음, 앞서 언급한 것처럼 데이터 전송은 파일이나 터미널 전역 변수 를 통해 이루어질 수 있습니다.

주요 trans.therm의 경우:

 // записываем значение, помещаем это всё в OnTick()
GlobalVariableSet ( "Sname" , 123.25 );

// Получаем в любой программе эти значения, так-же внутри OnTick()
GlobalVariableGet ( "Sname" ); // получим 123.25

이것은 하나의 터미널에서 모든 프로그램을 교환하는 가장 쉬운 방법입니다

 
Vitaly Muzichenko :

글쎄, 아마도 파일이나 터미널 전역 변수 를 통해 이전에 작성된 데이터 전송

주요 trans.therm의 경우:

이것은 하나의 터미널에서 모든 프로그램을 교환하는 가장 쉬운 방법입니다

좋은. 지표에 표현식을 씁니다.

GlobalVariableSet ( "이름" , 123.25 ); 이 이벤트는 예를 들어 OnTick()에서 발생합니다.

그러나 스크립트는 데이터 배열과 함께 작동하지 않으며 OnTick() 이벤트가 없습니다. 스크립트는 OnTick() 이벤트가 발생했음을 어떻게 알 수 있으며 새 데이터를 얻기 위한 절차를 적용해야 합니다.

GlobalVariableGet ( "이름" );

OnTick() 대신 OnTimer() 이벤트를 사용할 수 있습니다. 그러나 스크립트에는 자체 OnTimer()가 있고 표시기는 자체적으로 가지고 있으며 어떤 식으로든 서로 관련이 없습니다.

문제가 있습니다.

동기 이벤트를 보장하는 방법 GlobalVariableSet ( "Sname" , 123.25 ); 및 GlobalVariableGet ( "이름" );?

아니면 "Sname" 값의 변화를 모니터링하는 절차가 있습니까? 변경 유형.

즉, 스크립트는 표시기가 "Sname"의 값을 변경했으며 이 값이 125.35가 되었음을 어떻게 알 수 있습니까?

GlobalVariableSet ( "Sname" , 123.25 ) 사이의 링크는 어디에 있습니까? GlobalVariableGet ( "이름" ); ?

그들은 다른 프로그램에 있습니다.


 
neverness :

좋은. 지표에 표현식을 씁니다.

GlobalVariableSet ( "이름" , 123.25 ); 이 이벤트는 예를 들어 OnTick()일 때 발생합니다.

그러나 스크립트는 데이터 배열과 함께 작동하지 않으며 OnTick() 이벤트가 없습니다. 스크립트는 OnTick() 이벤트가 발생했음을 어떻게 알 수 있으며 새 데이터를 얻기 위한 절차를 적용해야 합니다.

GlobalVariableGet ( "이름" );

OnTick() 대신 OnTimer() 이벤트를 사용할 수 있습니다. 그러나 스크립트에는 자체 OnTimer()가 있고 표시기는 자체적으로 가지고 있으며 어떤 식으로든 서로 관련이 없습니다.

문제가 있습니다.

동기 이벤트를 보장하는 방법 GlobalVariableSet ( "Sname" , 123.25 ); 및 GlobalVariableGet ( "이름" );?

아니면 "Sname" 값의 변화를 모니터링하는 절차가 있습니까? 변경 유형.

즉, 스크립트는 표시기가 "Sname"의 값을 변경했으며 이 값이 125.35가 되었음을 어떻게 알 수 있습니까?

GlobalVariableSet ( "Sname" , 123.25 ) 사이의 링크는 어디에 있습니까? GlobalVariableGet ( "이름" ); ?

그들은 다른 프로그램에 있습니다.

연결 링크는 컴퓨터의 하드 드라이브입니다. 적어두셔도 문제 없을거 같은데 스크립트에서도 어떤 이벤트에서든 얻을 수 있어요 현재 ASK, BID 값을 구하는 방법과 다르지 않습니다


추신: 예를 들어 지표와 스크립트를 첨부합니다. 지표에 틱 볼륨 을 씁니다.

지시자

 //+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version    "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   ArraySetAsSeries (tick_volume, true );
  
   // записываем значение
   GlobalVariableSet ( "Sname" , tick_volume[ 0 ]);

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

스크립트

 //+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
     Alert ( GlobalVariableGet ( "Sname" ));
  }
//+------------------------------------------------------------------+
파일:
Set.mq5  4 kb
Get.mq5  1 kb
 
Vitaly Muzichenko :

연결 링크는 컴퓨터의 하드 드라이브입니다. 적어두셔도 문제없을거 같은데 스크립트로도 어떤 이벤트에서나 받을수있어요 현재 ASK나 BID값을 구하는 방법과 별반 다르지않습니다

시원한!

그리고 그것을 하는 방법?

예를 들어 주십시오.

예를 들어, 그러한 사례를 모델링하는 방법.

표시기는 데이터를 수신하고 이 데이터의 분산을 계산하고 스크립트에 대한 타원 점의 좌표를 준비합니다(4개의 전역 변수 Q1,Q2,T1,T2가 스크립트에 전달됨).

이제 표시기는 스크립트에 명령을 제공해야 하며, 이 명령은 이러한 전역 변수를 기반으로 타원을 생성합니다.

지표는 어떻게 이것을 할 수 있습니까?

 
Vitaly Muzichenko :

연결 링크는 컴퓨터의 하드 드라이브입니다. 적어두셔도 문제없을거 같은데 스크립트로도 어떤 이벤트에서나 받을수있어요 현재 ASK나 BID값을 구하는 방법과 별반 다르지않습니다


추신: 예를 들어 지표와 스크립트를 첨부합니다. 지표에 틱 볼륨 을 씁니다.

지시자

스크립트

따라서 귀하의 예에서 스크립트는 시작 시, 즉 OnStart() 이벤트가 발생할 때 한 번만 작동합니다.

그리고 어떻게?

동기화는 어디에 있습니까?

스크립트가 표시기와 동기적으로 작동하도록 하는 방법은 무엇입니까?

예를 들어 볼륨이 특정 값을 초과할 때마다 스크립트를 활성화하는 방법은 무엇입니까?

 
neverness :

따라서 귀하의 예에서 스크립트는 시작 시, 즉 OnStart() 이벤트가 발생할 때 한 번만 작동합니다.

그리고 어떻게?

동기화는 어디에 있습니까?

스크립트가 표시기와 동기적으로 작동하도록 하는 방법은 무엇입니까?

예를 들어 볼륨이 특정 값을 초과할 때마다 스크립트를 활성화하는 방법은 무엇입니까?

스크립트로 작업하는 방법은 사용자에게 달려 있습니다. 스크립트보다 Expert Advisor를 만드는 것이 더 쉬울까요?

값을 제공하는 지표:

 //+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version    "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   return ( INIT_SUCCEEDED );

  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   ArraySetAsSeries (time, true );
   ArraySetAsSeries (tick_volume, true );

   // записываем нужные значение
   GlobalVariableSet ( "Q1" , tick_volume[ 0 ]);
   GlobalVariableSet ( "Q2" , tick_volume[ 1 ]);
   GlobalVariableSet ( "T1" , time[ 0 ]);
   GlobalVariableSet ( "T2" , time[ 1 ]);

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+


루프 스크립트의 간단한 예:

 //+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   while (! IsStopped ())
    {
     double Q1 = GlobalVariableGet ( "Q1" );
     double Q2 = GlobalVariableGet ( "Q2" );
     datetime T1 = ( datetime ) GlobalVariableGet ( "T1" );
     datetime T2 = ( datetime ) GlobalVariableGet ( "T2" );
     Print ( "Q1 = " ,Q1, ", Q2 = " ,Q2, ", T1 = " , TimeToString (T1), ", T2 = " , TimeToString (T2));
     Sleep ( 1000 ); // Пауза 1 секунда
    }
  }
//+------------------------------------------------------------------+

PS 코드를 수정했습니다.

 
Vitaly Muzichenko :

스크립트로 작업하는 방법은 사용자에게 달려 있습니다. 스크립트보다 Expert Advisor를 만드는 것이 더 쉬울까요?

값을 제공하는 지표:


루프 스크립트의 간단한 예:

MQL에서는 다른 모듈을 동기화할 가능성이 없다는 것을 알고 있습니다.

확인. 그럼 그런 질문. 그리고 필드에 버튼을 놓고 이 버튼에 스크립트를 붙이면 됩니다.

MQL에 그러한 가능성이 있습니까? 아니면 그런 가능성은 없나요?

결국 어떻게든 스크립트가 시작되어야 합니다!!!

 
neverness :

MQL에서는 다른 모듈을 동기화할 가능성이 없다는 것을 알고 있습니다.

확인. 그럼 그런 질문. 그리고 필드에 버튼을 놓고 이 버튼에 스크립트를 붙이면 됩니다.

MQL에 그러한 가능성이 있습니까? 아니면 그런 가능성은 없나요?

결국 어떻게든 스크립트가 시작되어야 합니다!!!

주제는 오래 되었지만 여전히 읽거나 누군가 새로운 것을 알려줄 것입니다. 나는 스크립트를 실행하지 않으며 전혀 작업하지 않습니다)

Как вызвать скрипт из индикатора
Как вызвать скрипт из индикатора
  • 2008.10.15
  • www.mql5.com
Подскажите можноли и как вызвать на выполнение скрипт из индикатора...