찻주전자의 질문 - 페이지 262

 
agvozdezkiy :

방금 MQL을 배우기 시작했고 이제 iMA를 그리고 마우스 포인터가 시간 축을 따라 위치한 지점에서 iMA의 차트에 접선(매우 근사)을 그리는 Expert Advisor를 작성했습니다 .

문제 1. 고문은 매우 바보입니다. 즉, 접선을 오랜만에 다시 그려서 마우스의 움직임을 따라가지 못한다는...

내 버전 확인:

 //+------------------------------------------------------------------+
//|                                                Antonio_Mouse.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//---
int Handle_iMA;
double Buffer_iMA[];
string Name_iMA;
datetime TimeArray[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---Устанавливаем свойство графика посылать события при движении мышы     
   ChartSetInteger ( 0 , CHART_EVENT_MOUSE_MOVE , true );
//---Рисуем индикатор iMA
   Handle_iMA= iMA ( NULL , 0 , 10 , 0 , MODE_SMA , PRICE_CLOSE );
   if (Handle_iMA!= INVALID_HANDLE )
     {
       ChartIndicatorAdd ( 0 , 0 ,Handle_iMA);
       Print ( "iMA скопировано в буффер." );
     }
//---
   string name= "Line" ;
   ObjectCreate ( 0 ,name, OBJ_TREND , 0 , 0 , 0 );
   ObjectSetInteger ( 0 ,name, OBJPROP_COLOR , clrRed );
   ObjectSetInteger ( 0 ,name, OBJPROP_WIDTH , 10 );
   ObjectSetInteger ( 0 ,name, OBJPROP_BACK , true );
   ObjectSetInteger ( 0 ,name, OBJPROP_RAY_LEFT , false );
   ObjectSetInteger ( 0 ,name, OBJPROP_RAY_RIGHT , true );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   IndicatorRelease (Handle_iMA);
  }
datetime CarrentBarTime[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
  }
double PriceCoord,Angle;
datetime TimeCoord;
int SubWindow,BarPos,X1,Y1,X2,Y2;
int prevX=- 1 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &XCoord,
                   const double &YCoord,
                   const string &SParam)
  {
   if (id== CHARTEVENT_MOUSE_MOVE )
     {
       int x=( int )XCoord;
       int y=( int )YCoord;
       if (x==prevX) return ;
       CopyTime ( NULL , 0 , 0 , 1 ,CarrentBarTime);
       //---
       ChartXYToTimePrice ( NULL ,x,y,SubWindow,TimeCoord,PriceCoord);
       if (TimeCoord>CarrentBarTime[ 0 ]) return ;
       CopyBuffer (Handle_iMA, 0 ,TimeCoord+ PeriodSeconds (), 2 ,Buffer_iMA);
       //---
       string name= "Line" ;
       ObjectSetDouble ( 0 ,name, OBJPROP_PRICE , 0 ,Buffer_iMA[ 0 ]);
       ObjectSetInteger ( 0 ,name, OBJPROP_TIME , 0 ,TimeCoord);
       ObjectSetDouble ( 0 ,name, OBJPROP_PRICE , 1 ,Buffer_iMA[ 1 ]);
       ObjectSetInteger ( 0 ,name, OBJPROP_TIME , 1 ,TimeCoord+ PeriodSeconds ());
       //---
       ChartRedraw ();
      prevX=x;
     }
  }

노트북에서 - 모든 것이 날아갑니다!

 

객체 생성 함수를 처음 호출할 때 오류 5040(문자열 유형의 매개변수 손상)이 발생합니다.

 void   CreateTL( string name, datetime time1, double price1, datetime time2, double price2, bool ray_left, bool ray_right, color color_TL)
  {
//------------ nTL,nTLh,nTLl,nTLe
   nTL= "nTL_" + IntegerToString ( MathRand ());
   nTLh= "nTLh_" + IntegerToString ( MathRand ());
   nTLl= "nTLl_" + IntegerToString ( MathRand ());
   nTLe= "nTLe_" + IntegerToString ( MathRand ());
//------------
   ObjectCreate ( 0 ,name, OBJ_TREND , 0 ,time1,price1,time2,price2);
   ObjectSetInteger ( 0 ,name, OBJPROP_COLOR ,color_TL);
   ObjectSetInteger ( 0 ,name, OBJPROP_STYLE , STYLE_DOT );
   ObjectSetInteger ( 0 ,name, OBJPROP_RAY_RIGHT ,ray_left);
   ObjectSetInteger ( 0 ,name, OBJPROP_RAY_RIGHT ,ray_right);
   ObjectSetInteger ( 0 ,name, OBJPROP_BACK , true );
  };

통화 전에 설정하면

nTL= "" ;

오류 4002(클라이언트 터미널 기능을 내부적으로 호출할 때 잘못된 매개변수)

통화 전에 설정하면

nTL= "a" ;

첫 번째 개체의 이름이 지정됩니다.

이렇게 부르다

 if (hlp_var==high_low)
     {
       //CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTL,dt[ 0 ],pr[ 0 ],dt[ 0 ],pr[ 1 ], false , false ,nTL_color);
      CreateTL(nTLe,dt[ 1 ],pr[ 0 ],dt[ 1 ],pr[ 1 ], false , false ,nTL_color);
      CreateTL(nTLh,dt[ 0 ],pr[ 0 ],dt[ 1 ],pr[ 0 ], false , true ,nTL_color);
      CreateTL(nTLl,dt[ 0 ],pr[ 1 ],dt[ 1 ],pr[ 1 ], false , true ,nTL_color);
      CreateTL(nTL,dt[ 0 ],pr[ 0 ],dt[ 1 ],pr[ 1 ], false , true ,nTL_color);
      CreateTL(nTL,dt[ 0 ],pr[ 1 ],dt[ 1 ],pr[ 0 ], false , true ,nTL_color);
       Print ( "CreateTL GetLastError " + IntegerToString ( GetLastError ()));
     };

말해봐, 어디가 잘못됐어?

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 

이전 버전에서

 ObjectCreate ( 0 ,nTL= "nTL_" + IntegerToString ( MathRand ()), OBJ_TREND , 0 ,time1,price1,time2,price2);

충돌은 없었습니다.

이것은 코드 또는 터미널의 버그입니까?

 
Silent :

오류가 어디에 있습니까?

오류 x는 어디에 있지만 개체 이름 으로 작업하는 것은 가볍게 말해서 매우 논란의 여지가 있습니다.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
개체 이름에 임의의 숫자가 필요한 이유가 명확하지 않아 오류가 발생할 수 있습니다.
 
Silent :

객체 생성 함수를 처음 호출할 때 오류 5040(문자열 유형의 매개변수 손상)이 발생합니다.

통화 전에 설정하면

오류 4002(클라이언트 터미널 기능을 내부적으로 호출할 때 잘못된 매개변수)

통화 전에 설정하면

첫 번째 개체의 이름이 지정됩니다.

이렇게 부르다

오류가 어디에 있습니까?

Get Last Error가 0이 아닌 다른 것을 인쇄하는 것이 걱정되십니까? 그렇다면 함수가 실패를 보고한 경우에만 오류를 요청할 가치가 있습니다. 그리고 섹션 끝에서 오류를 요청할 가치가 없습니다. 쓰레기 값을 얻을 수 있습니다. 따라서 MT4에서는 여기에서 어떻게 든 다를 수 있습니다.

의사 코드:

 if ( ! ObjectCreate (...) )
     Print ( GetLastError () );
 
Silent :

객체 생성 함수를 처음 호출할 때 오류 5040(문자열 유형의 매개변수 손상)이 발생합니다.

통화 전에 설정하면

오류 4002(클라이언트 터미널 기능을 내부적으로 호출할 때 잘못된 매개변수)

통화 전에 설정하면

첫 번째 개체의 이름이 지정됩니다.

이렇게 부르다

말해봐, 어디가 잘못됐어?

StringConcatenate() "접착제"를 통해 문자열 시도

 
TheXpert :
오류 x는 어디에 있지만 개체 이름 으로 작업하는 것은 가볍게 말해서 매우 논란의 여지가 있습니다.
나는 또 일주일 동안 머리를 긁적일 것이다. 조금 더 자세하게 가능할까요? (무례할 수 있습니다 :))
zfs :
개체 이름에 임의의 숫자가 필요한 이유가 명확하지 않아 오류가 발생할 수 있습니다.

고유한 이름을 가진 수백 개의 개체에 대한 다른 옵션이 있습니까?

(그룹을 제거하려면 개체 그룹의 이름에 동일한 문자열 부분이 있어야 합니다.)

 
220Volt :

Get Last Error가 0이 아닌 다른 것을 인쇄하는 것이 걱정되십니까? 그렇다면 함수가 실패를 보고한 경우에만 오류를 요청할 가치가 있습니다. 그리고 섹션 끝에서 오류를 요청할 가치가 없습니다. 쓰레기 값을 얻을 수 있습니다. 따라서 MT4에서는 여기에서 어떻게 든 다를 수 있습니다.

아니요, 첫 번째 호출이 개체를 만드는 데 실패했기 때문입니다. 나는 (지금은) 첫 번째 호출의 라인을 복제한 다음 두 번째 실행에서 생성합니다.
 
220Volt :

Get Last Error가 0이 아닌 다른 것을 인쇄하는 것이 걱정되십니까?

음, 일반적으로 논리적으로 함수가 마지막 오류를 전혀 노출하지 않으면 함수가 성공적으로 완료되면 오류 값이 0이거나 설명서에 설명된 값이 있어야 합니다. 그리고 다른 것은 없습니다.

저것들. 호출이 성공하고 오류가 0이 아닌 경우 이 경우를 설명서에 설명해야 합니다.

침묵 :

나는 또 일주일 동안 머리를 긁적일 것이다. 조금 더 자세하게 가능할까요? (무례할 수 있습니다 :))

글쎄, 일반적으로 같은 유형의 개체 이름은 삭제(당신을 위해 "nTL_")와 차이점의 편의를 위해 공통 부분에서 형성됩니다. 차트에 이러한 모듈이 한 번에 둘 이상 있을 수 있는 경우에도 모듈 식별자를 사용합니다.

차이점은 무엇이든 될 수 있습니다. 심지어 개체를 생성할 때마다 증가하는 카운터도 포함됩니다. 그러나 보장된 유일성을 달성하기 위해서는 논리(객체의 시간, 객체의 좌표, 목표)에 따라 구별하는 것이 좋습니다. 긍정적인 부작용은 이름을 다시 구성하여 원하는 이미 생성된 객체 의 속성을 변경할 수 있다는 것입니다.

Random은 이 "고유성 보장"을 제공하지 않습니다.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5