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

 

Program.mqh에서 데이터를 요청하는 방법을 알려주시겠습니까?

그런 코드가 있습니다

 //--- Определение точек
double stS= 0 ,opS= 0 ,stB= 0 ,opB= 0 ;
   if ( ObjectsTotal ( 0 , 0 , OBJ_TREND )> 0 )
      {
      stS= NormalizeDouble (ObjectGet( "OrderS" ,OBJPROP_PRICE1)+ 5 * Point , Digits - 1 );
      opS= NormalizeDouble (ObjectGet( "OrderS" ,OBJPROP_PRICE2)- 5 * Point , Digits - 1 );
      stB= NormalizeDouble (ObjectGet( "OrderB" ,OBJPROP_PRICE1)- 5 * Point , Digits - 1 );
      opB= NormalizeDouble (ObjectGet( "OrderB" ,OBJPROP_PRICE2)+ 5 * Point , Digits - 1 );
      }
EA에서 포인트 데이터를 요청하는 방법은 무엇입니까?
 
MakarFX :

Program.mqh에서 데이터를 요청하는 방법을 알려주시겠습니까?

그런 코드가 있다

EA에서 포인트 데이터를 요청하는 방법은 무엇입니까?

모든 차트에서 개체를 가져오는 데 필요한 것은 개체 이름과 차트 ID뿐입니다.

 #property script_show_inputs

//--- input parameters
input long      chartID = 0 ;
input string    name = "OrderS" ;
input int       subwin = 0 ;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart () {
//---
   double stS = 0 , opS = 0 , stB = 0 , opB = 0 ;
   if ( ObjectsTotal (chartID, subwin, OBJ_TREND ) > 0 ) {
    stS = NormalizeDouble ( ObjectGetDouble (chartID, name, OBJPROP_PRICE1) * Point , Digits );
    opS = NormalizeDouble ( ObjectGetDouble (chartID, name, OBJPROP_PRICE2) * Point , Digits );
    stB = NormalizeDouble ( ObjectGetDouble (chartID, name, OBJPROP_PRICE1) * Point , Digits );
    opB = NormalizeDouble ( ObjectGetDouble (chartID, name, OBJPROP_PRICE2) * Point , Digits );
     Print ( "stS: " , stS, "; opS: " , opS, "; stB: " , stB, "; opB: " , opB, "." );
  }
}

따라서 모든 MQL4 프로그램에서 모든 개체의 데이터를 가져올 수 있습니다.

Документация по MQL5: Операции с графиками / ChartID
Документация по MQL5: Операции с графиками / ChartID
  • www.mql5.com
Операции с графиками / ChartID - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mihail Matkovskij :

모든 차트에서 개체를 가져오는 데 필요한 것은 개체 이름과 차트 ID뿐입니다.

따라서 모든 MQL4 프로그램에서 모든 개체의 데이터를 가져올 수 있습니다.

당신은 나를 이해하지 못했습니다 ...

위의 코드는 Program.mqh =>OnTimerEvent 파일에 있습니다.

포인트 값은 주기적으로 업데이트되며 어드바이저는 이러한 값을 받아야 합니다.

따라서 질문: Program.mqh에서 데이터를 요청하는 방법은 무엇입니까?

 void CProgram::OnTimerEvent( void )
  {
   CWndEvents::OnTimerEvent();
//--- Индикатор выполнения
   static int count1= 0 ;
//--- Пауза между обновлением элементов
   static int count2= 0 ;
   if (count2< 200 )
     {
      count2+=TIMER_STEP_MSC;
       return ;
     }
//--- Обнулить счётчик
   count2= 0 ;
//--- Определение точек
double stS= 0 ,opS= 0 ,stB= 0 ,opB= 0 ;
   if ( ObjectsTotal ( 0 , 0 , OBJ_TREND )> 0 )
      {
      stS= NormalizeDouble (ObjectGet( "OrderS" ,OBJPROP_PRICE1)+ 5 * Point , Digits - 1 );
      opS= NormalizeDouble (ObjectGet( "OrderS" ,OBJPROP_PRICE2)- 5 * Point , Digits - 1 );
      stB= NormalizeDouble (ObjectGet( "OrderB" ,OBJPROP_PRICE1)- 5 * Point , Digits - 1 );
      opB= NormalizeDouble (ObjectGet( "OrderB" ,OBJPROP_PRICE2)+ 5 * Point , Digits - 1 );
      }
  }
 
MakarFX :

당신은 나를 이해하지 못했습니다 ...

위의 코드는 Program.mqh =>OnTimerEvent 파일에 있습니다.

포인트 값은 주기적으로 업데이트되며 어드바이저는 이러한 값을 받아야 합니다.

따라서 질문: Program.mqh에서 데이터를 요청하는 방법은 무엇입니까?

아무도 변수 선언을 귀찮게하지 않습니다.

 double stS = 0 , opS = 0 , stB = 0 , opB = 0 ;

CProgram 클래스의 공개 범위에서 문제 없이 전문가로부터 액세스할 수 있습니다.

마카르FX :

당신은 나를 이해하지 못했습니다 ...

물론 문제에 대한 설명이 더 완벽해야 하기 때문에 바로 이해하지는 못했습니다. 이상적으로는 소스를 추가하는 것이 바람직합니다.

 
Mihail Matkovskij :

Program.mqh 파일이 Expert Advisor에 연결되어 있습니까? ...

그렇다면 아무도 변수 선언을 귀찮게하지 않습니다.

CProgram 클래스의 전역 범위에서 전문가로부터 쉽게 액세스할 수 있습니다.

파일 Program.mqh 포함...

이제 변수 gobalno를 선언하려고 합니다.

 
MakarFX :

파일 Program.mqh 포함...

이제 변수 gobalno를 선언하려고 합니다.

수정됨: h ttps://www.mql5.com/ru/forum/160683/page1199#comment_17172497 , 처음에 저를 혼란스럽게 만드셨기 때문에...

 
Mihail Matkovskij :

아무도 변수 선언을 귀찮게하지 않습니다.

CProgram 클래스의 공개 범위에서 문제 없이 전문가로부터 액세스할 수 있습니다.

작동하지 않습니다

 //+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ( void )
  {
   if (program.stS< 0 ):: Print ( "ERROR" );
  }


 
MakarFX :

작동하지 않습니다


CProgram 클래스의 소스 또는 코드가 필요합니다. 그렇지 않으면 작동하지 않습니다 ...

다음과 같이 하려고 했습니다.

 class CProgram : ... {
...
public:
   double stS, opS, stB, opB;
...
줄임표, 이것은 내가 당신의 수업에 대해 모르는 것입니다 :)
 
Mihail Matkovskij :

CProgram 클래스의 소스 또는 코드가 필요합니다. 그렇지 않으면 작동하지 않습니다 ...

다음과 같이 하려고 했습니다.

줄임표, 이것은 내가 당신의 수업에 대해 모르는 것입니다 :)

감사해요!!! 모든 것이 해결되었습니다.

나도 모르게 넣어

 public:
   double stS=0, opS=0, stB=0, opB=0;

나는 0을 제거했고 모든 것이 잘되었습니다.

정말 감사합니다.

 
MakarFX :

감사해요!!! 모든 것이 해결되었습니다.

나도 모르게 넣어

나는 0을 제거했고 모든 것이 잘되었습니다.

정말 감사합니다.

하나 더. 초기화를 수행하는 것이 좋습니다.

CProgram::CProgram():
  stS( 0 ), opS( 0 ), stB( 0 ), opB( 0 )
{
  ...
}

그렇지 않으면 타이머의 틱 이전에 OnTick()에서 읽기가 수행되면 EA가 변수에 임의의 데이터를 수신 할 수 있습니다.