초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1331

 

표시기를 수정하는 데 도움이 됩니다. MT5 터미널에 표시되지 않고 컴파일하는 동안 오류가 발생합니다.

 //--- descriзгo
#property description "Script cria objeto grбfico de \"Texto\"."
//--- janela de exibiзгo dos parвmetros de entrada durante inicializaзгo do script
#property script_show_inputs


//--- entrada de parвmetros do script
input int                IHistoryBars= 25 ;           // Check Historical Data
input string             InpFont= "Tahoma" ;       // Font Type
input int                InpFontSize= 7 ;           // Size of fonts
input color              UpColor= clrGold ;         // Cor Up
input color              DwColor= clrRoyalBlue ;         // Cor Dw
input color              HLColor= clrAqua ;         // Cor Center
input bool               InpBack= false ;           // Objeto de fundo
input bool               InpSelection= false ;       // Destaque para mover
input bool               InpHidden= true ;           // Ocultar na lista de objetos
input bool               WithDigit= true ;           // Ocultar na lista de objetos
input long               InpZOrder= 0 ;             // Prioridade para clique do mouse


int digits= 0 ,extradig= 0 ;

double             InpAngle= 0.0 ;           // Вngulo de inclinaзгo em graus
ENUM_ANCHOR_POINT InpAnchor= ANCHOR_CENTER ; // Tipo de ancoragem
double    gBars= 0 ;
double    gTotalRates= 0 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit ()
  {
   digits= MathPow ( 10 , _Digits -extradig);
   if (WithDigit) extradig= 1 ;

  }
//+------------------------------------------------------------------+
//| Mover ponto de ancoragem                                         |
//+------------------------------------------------------------------+
bool TextMove( const long    chart_ID= 0 ,   // ID do grбfico
               const string name= "Text" , // nome do objeto
               datetime      time= 0 ,       // coordenada do ponto de ancoragem do tempo
               double        price= 0 )     // coordenada do ponto de ancoragem do preзo
  {
//--- se a posiзгo do ponto nгo estб definida, mover para a barra atual tendo o preзo Bid
   if (!time)
      time= TimeCurrent ();
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- redefine o valor de erro
   ResetLastError ();
//--- mover o ponto de ancoragem
   if (! ObjectMove (chart_ID,name, 0 ,time,price))
     {
       Print ( __FUNCTION__ ,
             ": falha ao mover o ponto de ancoragem! Cуdigo de erro = " , GetLastError ());
       return ( false );
     }
//--- sucesso na execuзгo
   return ( true );
  }
//+------------------------------------------------------------------+
//| Verificar valores de ponto de ancoragem e definir valores padrгo |
//| para aqueles vazios                                              |
//+------------------------------------------------------------------+
void ChangeTextEmptyPoint( datetime &time, double &price)
  {
//--- se o tempo do ponto nгo estб definido, serб na barra atual
   if (!time)
      time= TimeCurrent ();
//--- se o preзo do ponto nгo estб definido, ele terб valor Bid
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ClearMyObjects();
   Print ( "Deinit Value Chart, reason = " + IntegerToString (reason));
  }
//+------------------------------------------------------------------+
//| Value Chart                                                      | 
//+------------------------------------------------------------------+
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 &TickVolume[],
                 const long &Volume[],
                 const int &Spread[])
  {

//--- definir a forma como muitas vezes os textos serгo exibidos
   int scale=( int ) ChartGetInteger ( 0 , CHART_SCALE );
   int bars=( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS )+ 3 ;
   double value;
   digits= MathPow ( 10 , _Digits -extradig);

//--- definir o passo
   int step= 1 ;
   switch (scale)
     {
       case 0 :
         step= 12 ;
         break ;
       case 1 :
         step= 6 ;
         break ;
       case 2 :
         step= 4 ;
         break ;
       case 3 :
         step= 2 ;
         break ;
     }
   gTotalRates=rates_total;
   gBars=bars;
   for ( int i=rates_total- 1 ;i>rates_total-bars;i-=step) 
     {
       if (Close[i]>Open[i])
        {
         // bullish candle
         value=(Close[i]-Open[i])*digits;
         //Print(Close[i]-Open[i], "->", Close[i]-Open[i]*digits);

         TextCreate( 0 , "Text_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],(Close[i]+Open[i])/ 2 , DoubleToString (value,extradig),InpFont,InpFontSize,
                    UpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder);

         value=(Open[i]-Low[i]) *digits;
         if (!TextCreate( 0 , "TextL_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],Low[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }

         value=(High[i]-Close[i]) *digits;
         if (!TextCreate( ChartID (), "TextH_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],High[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }

           } else {

         value=(Open[i]-Close[i]) *digits;
         if (!TextCreate( ChartID (), "Text_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],(Close[i]+Open[i])/ 2 , DoubleToString (value,extradig),InpFont,InpFontSize,
            DwColor,-InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;      }

         value=(Close[i]-Low[i]) *digits;
         if (!TextCreate( ChartID (), "TextL_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],Low[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }

         value=(High[i]-Open[i]) *digits;
         if (!TextCreate( ChartID (), "TextH_" +( string )i+( string ) PERIOD_CURRENT , 0 ,Time[i],High[i], DoubleToString (value,extradig),InpFont,InpFontSize,
            HLColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder)) {       return 0 ;     }
        }

     }
   ChartRedraw ();
   return 0 ;
  }
//+------------------------------------------------------------------+
//|  Trace Arrow Function                                            |
//+------------------------------------------------------------------+
void Trace( string name, int sens, double price, datetime time, color couleur)
  {
   ObjectCreate ( 0 ,name, OBJ_ARROW , 0 ,time,price);
   if (sens== 1 )
       ObjectSetInteger ( 0 ,name, OBJPROP_ARROWCODE , 233 );
   if (sens==- 1 )
       ObjectSetInteger ( 0 ,name, OBJPROP_ARROWCODE , 234 );
   ObjectSetInteger ( 0 ,name, OBJPROP_COLOR ,couleur);
   ObjectSetInteger ( 0 ,name, OBJPROP_WIDTH , 5 );
  }
//+------------------------------------------------------------------+
//|   Delete Arrow Function                                          |
//+------------------------------------------------------------------+  
void ClearMyObjects() 
  {
   string name;
   int scale=( int ) ChartGetInteger ( 0 , CHART_SCALE );
   int bars=( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS )+ 3 ;
   double value;
   digits= MathPow ( 10 , _Digits -extradig);
   int step= 1 ;
   switch (scale)
     {
       case 0 :
         step= 12 ;
         break ;
       case 1 :
         step= 6 ;
         break ;
       case 2 :
         step= 4 ;
         break ;
       case 3 :
         step= 2 ;
         break ;
     }
   for ( int i=gTotalRates- 1 ;i>gTotalRates-bars;i-=step) 
     {
       if (!TextDelete( ChartID (), "Text_" +( string )i+( string ) PERIOD_CURRENT )){}
       if (!TextDelete( ChartID (), "TextH_" +( string )i+( string ) PERIOD_CURRENT )){}
       if (!TextDelete( ChartID (), "TextL_" +( string )i+( string ) PERIOD_CURRENT )){}
       //--- redesenhar o grбfico
     }
   ChartRedraw ();

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Alterar o texto do objeto                                        |
//+------------------------------------------------------------------+
bool TextChange( const long    chart_ID= 0 ,   // ID do Grбfico
                 const string name= "Text" , // nome do objeto
                 const string text= "Text" ) // texto
  {
//--- redefine o valor de erro
   ResetLastError ();
//--- alterar texto do objeto
   if (! ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text))
     {
       Print ( __FUNCTION__ ,
             ": falha ao alterar texto! Cуdigo de erro = " , GetLastError ());
       return ( false );
     }
//--- sucesso na execuзгo
   return ( true );
  }
//+------------------------------------------------------------------+
//| Excluir objeto Texto                                             |
//+------------------------------------------------------------------+
bool TextDelete( const long    chart_ID= 0 ,   // Id do Grбfico
                 const string name= "Text" ) // nome do objeto
  {
//--- redefine o valor de erro
   ResetLastError ();
//--- excluir o objeto
   if (! ObjectDelete (chart_ID,name))
     {
       Print ( __FUNCTION__ ,
             ": falha ao excluir o objeto \"Texto\"! Cуdigo de erro = " , GetLastError ());
       return ( false );
     }
//--- sucesso na execuзгo
   return ( true );
  }
//+------------------------------------------------------------------+
//| Criando objeto Texto                                             |
//+------------------------------------------------------------------+
bool TextCreate( const long               chart_ID= 0 ,               // ID do grбfico
                 const string             name= "Text" ,               // nome do objeto
                 const int                sub_window= 0 ,             // нndice da sub-janela
                 datetime                 time= 0 ,                   // ponto de ancoragem do tempo
                 double                   price= 0 ,                   // ponto de ancoragem do preзo
                 const string             text= "Text" ,               // o prуprio texto
                 const string             font= "Arial" ,             // fonte
                 const int                font_size= 10 ,             // tamanho da fonte
                 const color              clr= clrRed ,               // cor
                 const double             angle= 0.0 ,                 // inclinaзгo do texto
                 const ENUM_ANCHOR_POINT anchor= ANCHOR_CENTER , // tipo de ancoragem
                 const bool               back= false ,               // no fundo
                 const bool               selection= false ,           // destaque para mover
                 const bool               hidden= true ,               // ocultar na lista de objetos
                 const long               z_order= 0 )                 // prioridade para clicar no mouse
  {

   if ( ObjectFind (chart_ID,name)==- 1 ) 
     {

       //--- definir as coordenadas de pontos de ancoragem, se eles nгo estгo definidos
       //--- redefine o valor de erro
       ResetLastError ();
       //--- criar objeto Texto
       if (! ObjectCreate (chart_ID,name, OBJ_TEXT ,sub_window,time,price)) 
        {
         Print ( __FUNCTION__ ,
               ": falha ao criar objeto \"Texto\"! Cуdigo de erro = " , GetLastError ());
         return ( false );
        }
       //--- definir o texto
       ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text);
       //--- definir o texto fonte
       ObjectSetString (chart_ID,name, OBJPROP_FONT ,font);
       //--- definir tamanho da fonte
       ObjectSetInteger (chart_ID,name, OBJPROP_FONTSIZE ,font_size);
       //--- definir o вngulo de inclinaзгo do texto
       ObjectSetDouble (chart_ID,name, OBJPROP_ANGLE ,angle);
       //--- tipo de definiзгo de ancoragem
       ObjectSetInteger (chart_ID,name, OBJPROP_ANCHOR ,anchor);
       ObjectSetInteger (chart_ID,name, OBJPROP_ALIGN , ALIGN_CENTER );

       //--- definir cor
       ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
       //--- exibir em primeiro plano (false) ou fundo (true)
       ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
       //--- habilitar (true) ou desabilitar (false) o modo de mover o objeto com o mouse
       ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
       ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
       //--- ocultar (true) ou exibir (false) o nome do objeto grбfico na lista de objeto 
       ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
       //--- definir a prioridade para receber o evento com um clique do mouse no grбfico
       ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
       ObjectSetDouble (chart_ID,name, OBJPROP_PRICE ,price);
       ObjectSetInteger (chart_ID,name, OBJPROP_TIME ,time);

       //--- sucesso na execuзгo
       return ( true );
        } else {
      ChangeTextEmptyPoint(time,price);

       ObjectSetString (chart_ID,name, OBJPROP_TEXT ,text);
       ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
       ObjectSetInteger (chart_ID,name, OBJPROP_ANCHOR ,anchor);
       ObjectSetInteger (chart_ID,name, OBJPROP_ALIGN , ALIGN_CENTER );
       ObjectSetDouble (chart_ID,name, OBJPROP_ANGLE ,angle);
       ObjectSetDouble (chart_ID,name, OBJPROP_PRICE ,price);
       ObjectSetInteger (chart_ID,name, OBJPROP_TIME ,time);
       ObjectSetString (chart_ID,name, OBJPROP_FONT ,font);
       //--- definir tamanho da fonte
       ObjectSetInteger (chart_ID,name, OBJPROP_FONTSIZE ,font_size);
       ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE , 100 );

/*ObjectSetString(chart_ID,name,OBJPROP_FONT,Font);
      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,Size);*/
       return ( true );
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,         // Event ID
                   const long & lparam,   // Parameter of type long event
                   const double & dparam, // Parameter of type double event
                   const string & sparam   // Parameter of type string events
                  )
  {
   if (id== CHARTEVENT_CHART_CHANGE )
     {
      ClearMyObjects();
     }

  }
//+------------------------------------------------------------------+
파일:
 
Green handsome :

표시기를 수정하는 데 도움이 됩니다. MT5 터미널에 표시되지 않고 컴파일하는 동안 오류가 발생합니다.

가장 간단한 방법은 맨 처음 ArraySetAsSeries(Open,true) 에서 OnCalculate의 모든 배열을 설정하는 것입니다. ArraySetAsSeries(닫기, 참) ; 등.

이것은 5번째 방향에서 기본 인덱싱 방향 이 4번째 방향과 다릅니다.

버퍼 표시기는 사용하지 않고 그래프 개체만 빌드합니다. 실행 후 Ctrl + B를 누르고 어디에 두었는지 확인합니다.

 

문서 및 포럼을 통해 파고 ...
객체 포인터 유형의 전역 변수 를 만드는 방법 [var 예에서] OnInit()에서 다음 행으로 생성된 경우

CObj* var= new CObj(p1,p2,p3);

게다가 객체의 개수와 생성자의 매개변수는 미리 알 수 없으며 OnInit() ?

 
Mikhail Tkachev :

문서 및 포럼을 통해 파고 ...
OnInit()에서 생성된 경우 객체 포인터 유형의 전역 변수 를 만드는 방법:

게다가 객체의 개수와 생성자의 매개변수는 미리 알 수 없으며 OnInit() ?

나는 아무것도 이해하지 못했지만 OnInit()에서 생성된 객체 에 CArrayObj 포인터 배열을 전달합니다.

Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
Документация по MQL5: Стандартная библиотека / Коллекции данных / CArrayObj
  • www.mql5.com
CArrayObj - Коллекции данных - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Artyom Trishkin :

나는 아무것도 이해하지 못했지만 OnInit()에서 생성된 객체 에 CArrayObj 포인터 배열을 전달합니다.

Artem, 답변 감사합니다.
막연한 질문 죄송합니다)
Expert Advisor는 객체 포인터 유형의 세 가지 전역 변수인 var1, var2, var3을 사용할 수 있습니다.

OnInit()를 실행하기 전에는 이러한 모든 변수가 필요한지 여부를 알 수 없으며(시간 프레임과 관련됨) 개체를 초기화할 생성자에 대한 매개변수도 알 수 없습니다.
OnInit()에서 이러한 변수를 생성하여 동시에 전역 변수가 되도록 하는 방법은 무엇입니까?

 
Mikhail Tkachev :

Artem, 답변 감사합니다.
애매한 질문 죄송합니다)
Expert Advisor는 객체 포인터 유형의 세 가지 전역 변수인 var1, var2, var3을 사용할 수 있습니다.

OnInit()가 실행되기 전에는 이러한 모든 변수가 필요한지 여부를 알 수 없으며(이것은 시간 프레임과 관련됨) 개체를 초기화할 생성자에 대한 매개변수도 알 수 없습니다.
OnInit()에서 이러한 변수를 생성하여 동시에 전역 변수가 되도록 하는 방법은 무엇입니까?

나는 당신이 거기에 어떤 종류의 마법 생성자를 가지고 있는지 모릅니다. 거기에는 미지의 것들만 있습니다 :)

객체는 미리 인스턴스로 선언할 필요가 없습니다.

하나의 배열 CArrayObj를 선언해야 합니다. 개체 자체는 CObject 의 자손 이어야 합니다.

new로 개체를 만들고 목록에 대한 포인터를 추가합니다.

다음 항목을 만들고 목록에 추가하는 식입니다.

이미 이 목록은 그것에 대한 포인터이며(목록은 전역적으로 선언됨) 생성자에 전달합니다.

하지만 미리 알 수 없는 인수를 사용하여 생성자를 만드는 방법은 다음과 같습니다. 여기서는 조금 이해가 되지 않았습니다. 그것을 설명하려고

 
Artyom Trishkin :


하지만 미리 알 수 없는 인수를 사용하여 생성자를 만드는 방법은 다음과 같습니다. 여기서는 조금 이해가 되지 않았습니다. 그것을 설명하려고

각 기호에 대해 사용된 각 기간에 대해 CIsNewBar 유형 의 개체 생성 .
문자는 입력 매개변수에서 구분된 단일 문자열로 제공되므로 OnInit() 전에 모든 개체를 미리 만들 수는 없습니다.
저것들. 첫 번째 알 수 없는 생성자 매개변수는 기호입니다.
생성자의 두 번째 알려지지 않은 매개변수는 시간 프레임입니다. 각 기호에는 입력 매개변수에 구분 기호가 있는 문자열로 유사하게 전달되는 고유한 시간 프레임 세트가 있습니다.

Z.Y. 수업과 함께   CArrayObj 에 문제가 있습니다. CArrayObj* ArrayObj 유형의 요소에 액세스할 때. At(0)인 개체 클래스의 At(0) 멤버는 사용할 수 없지만 이러한 클래스 멤버는 확실히 공용입니다. ArrayObj 유형의 구성. At(0).method(parameter)가 작동하지 않습니다.
그리고 나는 또한 이러한 라이브러리를 사용하는 것이 두렵습니다 . 터미널을 업데이트 할 때 라이브러리에 무언가가 변경되고 내 Expert Advisor가 갑자기 작동을 멈추면 어떻게 될까요?
 
Mikhail Tkachev :

각 기호에 대해 사용된 각 기간에 대해 CIsNewBar 유형 의 개체 생성 .
문자는 입력 매개변수에서 구분된 단일 문자열로 제공되므로 OnInit() 전에 모든 개체를 미리 만들 수는 없습니다.
저것들. 생성자의 첫 번째 알려지지 않은 매개변수는 기호입니다.
생성자의 두 번째 알려지지 않은 매개변수는 시간 프레임입니다. 각 기호에는 입력 매개변수에 구분 기호가 있는 문자열로 유사하게 전달되는 고유한 시간 프레임 세트가 있습니다.

Z.Y. 수업과 함께   CArrayObj 에 문제가 있습니다. CArrayObj* ArrayObj 유형의 요소에 액세스할 때. At(0)인 개체 클래스의 At(0) 멤버는 사용할 수 없지만 이러한 클래스 멤버는 확실히 공용입니다. ArrayObj 유형의 구성. At(0).method(parameter)가 작동하지 않습니다.
그리고 나는 또한 이러한 라이브러리를 사용하는 것이 두렵습니다 . 터미널을 업데이트 할 때 라이브러리에 무언가가 변경되고 내 Expert Advisor가 갑자기 작동을 멈추면 어떻게 될까요?

모든 것이 어떻게 든 잘못되었습니다 ...

당신이하고 싶은 것을 간단한 단어로 쓰십시오. 모든 것을 코딩하려는 시도에 대한 언급 없이.

 
Artyom Trishkin :

모든 것이 어떻게 든 잘못되었습니다 ...

당신이하고 싶은 것을 간단한 단어로 쓰십시오. 모든 것을 코딩하려는 시도에 대한 언급 없이.

다중 통화 전문가 고문 .
문자 목록은 입력 매개변수를 통해 지정되며 구분 기호가 "AUDUSD,EURUSD,GBPUSD..."인 문자열, 문자 수는 미리 결정되지 않습니다.
각 기호에 대해 "자체" 거래 시스템이 작동하는 두 가지 기간이 있습니다.
따라서 두 개의 입력 매개변수, 구분 기호가 있는 문자열: 해당 기호 "M1,M30,M5..."에 대한 짧은 시간 프레임
해당 기호 "H1,D1,H4..."에 대한 긴 기간
저것들. AUDUSD 기간 M1 및 H1의 경우 EURUSD M30 및 D1의 경우 등
OnTick()에서 각 기호에 대해 거래 결정을 내리기 위해 (단기 및 장기) 시간 프레임 모두에서 새 막대 모양을 추적해야 합니다.
최대한 간단하게 작성하려고 노력했습니다

 
Mikhail Tkachev :

다중 통화 전문가 고문 .
문자 목록은 입력 매개변수를 통해 지정되며 구분 기호가 "AUDUSD,EURUSD,GBPUSD..."인 문자열, 문자 수는 미리 결정되지 않습니다.
각 기호에 대해 "자체" 거래 시스템이 작동하는 두 가지 기간이 있습니다.
따라서 두 개의 입력 매개변수, 구분 기호가 있는 문자열: 해당 기호 "M1,M30,M5..."에 대한 짧은 시간 프레임
해당 기호 "H1,D1,H4..."에 대한 긴 기간
저것들. AUDUSD 기간 M1 및 H1의 경우 EURUSD M30 및 D1의 경우 등
OnTick()에서 각 기호에 대해 거래 결정을 내리기 위해 (단기 및 장기) 시간 프레임 모두에서 새 막대 모양을 추적해야 합니다.
최대한 간단하게 작성하려고 노력했습니다

새로운 바 클래스가 이미 있습니까?

입력 매개변수는 정확히 어떻게 생겼습니까?

사유: