初心者の方からの質問 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ターミナルに表示されない、コンパイル時にエラーが出る、インジケーターの修正をお願いします。

最も簡単な方法は、OnCalculate で ArraySetAsSeries(Open,true) ;ArraySetAsSeries(Close,true) ;などを すべての配列の先頭に設定することである。

これは、平らな場所での伝統的な驚きです。5では、デフォルトのインデックスの方向が 4と異なっています。

インジケータはバッファを使用せず、グラフオブジェクトを構築するだけです - 起動後にCtrl+Bを押して、グラフがどこに配置されるか確認してください

 

ドキュメントやフォーラムを掘り起こすと......。
ポインタ型の変数を OnInit()で文字列で作成した場合、グローバル 変数(例ではvar)にするにはどうしたらよいでしょうか。

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 には、オブジェクトへのポインタ型のグローバル変数が3つあります:var1, var2, var3です。

OnInit()を実行する前に、これらの変数がすべて必要になるかどうかは不明です(これは時間枠に関係します)。また、オブジェクトを初期化するコンストラクタのパラメータも不明です。
このような変数をOnInit()で作成し、グローバルな変数にする方法は?

 
Mikhail Tkachev:

Artemさん、ご返信ありがとうございます。
不明確な質問で申し訳ありません)
EAで使用できるポインタ型のグローバル変数は、var1、var2、var3の3つです。

OnInit()を実行する前に、これらの変数がすべて必要になるかどうかはわかりませんし(時間軸に関係します)、オブジェクトを初期化するコンストラクタのパラメータも不明です。
このような変数をOnInit()で作成し、グローバルな変数にするにはどうしたらよいでしょうか。

未知数なものだけを含む魔法のようなコンストラクタがあるのか、私にはわかりません :)

オブジェクトをあらかじめインスタンスとして宣言しておく必要はない。

配列CArrayObjを1つ宣言する必要があります。オブジェクト自体はCObjectの子孫 でなければなりません。

newでオブジェクトを作成し、そのポインタをリストに追加します。

次のオブジェクトを作成し、リストに追加する、といった具合です。

このリスト-へのポインタ(リストはグローバルに宣言されている)は、あなたのコンストラクタに渡されます。

しかし、ここで事前に引数がわからないコンストラクタをどうするつもりだったのか......ちょっと理解できない。明確にしようとする

 
Artyom Trishkin:


しかし、ここで、あらかじめ引数がわからないコンストラクタを作るのか、ちょっと混乱します。説明してみてください

各シンボルの使用される時間枠ごとにCINewBarタイプのオブジェクトを作成 する。
入力パラメータで文字を区切り記号付きで1行ずつ指定するため、OnInit()の前にあらかじめすべてのオブジェクトを作成しておくことはできません。
すなわち、最初の未知のコンストラクタ・パラメータはシンボルである。
2番目の未知のコンストラクタ・パラメータはタイムフレームで、各シンボルは独自のタイムフレーム・セットを持ち、同様にinput-parameterにデリミタ付きの文字列で渡されるからである。

HH.CArrayObj クラスに問題がありました:CArrayObj* ArrayObj 型の要素にアクセスするとき。At(0)であるオブジェクトのクラス メンバはArrayObj 型の構成要素であり、まさにpublicであるが、アクセスは不可能である。At(0).method(parameter)が動作しない。
また
、これらのライブラリを使用すると、ターミナルを更新 する際に何かが変更され、Expert Advisorが突然動作しなくなるかもしれないので、怖いのです...。
 
Mikhail Tkachev:

各シンボルに使用される各タイムフレームに対してCINewBarタイプのオブジェクトを作成 する。
入力パラメータで文字を区切り記号付きで1行ずつ指定するため、OnInit()の前にある全てのオブジェクトをあらかじめ作成することはできません。
すなわち、最初の未知のコンストラクタ・パラメータはシンボルである。
2番目の未知のコンストラクタ・パラメータはタイムフレームで、各シンボルは独自のタイムフレーム・セットを持ち、同様にinput-parameterにデリミタ付きの文字列で渡されるからである。

追伸:CArrayObj クラスで、CArrayObj* 型の要素にアクセスする際に、問題が発生しました。At(0) が利用できないオブジェクトクラスのメンバは、これらのクラスメンバが まさにパブリック、すなわちArrayObj 型のコンストラクトであるにもかかわらず、です。At(0).method(parameter)が動作しない。
また
、これらのライブラリを使用すると、ターミナルを更新 する際に何かが変更され、Expert Advisorが突然動作しなくなるかもしれないので、怖いのです...。

なんだかおかしいな...。

やりたいことをシンプルな言葉で書く。あなたのコード化の試みに一切言及することなく。

 
Artyom Trishkin:

なんだかしっくりこない...。

やりたいことをシンプルな言葉で書く。あなたのコード化の試みには一切触れずに。

マルチカレンシー・エキスパート・アドバイザー
シンボルのリストは入力パラメータで指定します。デリミタは "AUDUSD,EURUSD,GBPUSD..." で、シンボルの数は事前に定義されていません。
各シンボルには2つのタイムフレームがあり、その上で「独自の」取引システムが動作します。
入力パラメータは2つあり、それぞれのシンボル "M1,M30,M5... "に対する短い時間枠で区切られた文字列である。"
H1,D1,H4 "というそれぞれのシンボルの長いタイムフレームを表示します。."
例えば、AUDUSDの場合はM1とH1、EURUSDの場合はM30とD1などのタイムフレームがあります。
OnTick()では、各シンボルについて、取引の意思決定を行うために、両方の(短い、長い)タイムフレームで新しいバーの出現を追跡することが必要である。
なるべくシンプルに書くように心がけました)

 
Mikhail Tkachev:

マルチカレンシー・エキスパート・アドバイザー
シンボルのリストは、入力パラメータ、セパレータ "AUDUSD、EURUSD、GBPUSD... "と文字列を介して設定され、シンボルの数は、事前に定義されていません。
各シンボルには2つのタイムフレームがあり、その上で「独自の」取引システムが動作します。
入力パラメータは2つあり、それぞれのシンボル "M1,M30,M5... "に対する短い時間枠で区切られた文字列である。"
H1,D1,H4 "というそれぞれのシンボルの長いタイムフレームを表示します。."
例えば、AUDUSDの場合はM1とH1、EURUSDの場合はM30とD1などのタイムフレームがあります。
OnTick()では、各シンボルについて、取引の意思決定を行うために、両方の(短い、長い)タイムフレームで新しいバーの出現を追跡することが必要である。
なるべくわかりやすく書いたつもりです)

新しいバーのクラスはすでにあるのでしょうか?

また、入力パラメータは具体的にどのようなものなのでしょうか?

理由: