初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 964

 
vladzeit:

例を挙げていただき、ありがとうございます。

明確に教えてください...というのは、私の理解が正しければですが。

この=(datetime)OrderGetInteger で、OrderGetInteger に明示的にdatetime型を 取るように指示しているのです。?

このルールは、型が明示されていない、あるいは代入される変数の型と一致しないすべての関数に適用されるのでしょうか? それとも、特別な場合だけなのでしょうか?

これはルールなのか、それとも特別なケースとして覚えておく必要があるのか、理解したいのです。

特別なことではないのです。ある型の変数に別の型の値を書き込むと、コンパイラは警告を出します。そして、どの変数からデータを取るかは、あなた次第です。

あなたの場合 -long 型を持つ関数から明示的にdatetime値を返す場合、もちろん安全なので、関数から取得する値の型を明示的に指定する必要があります。

しかし、int-variableにdoubleの値を取り込んだ場合、そのような代入でデータが失われないかどうかは、あなた次第です。戻り値がintに収まることが確実に分かっている場合は明示的にintを指定し、分からない場合はdouble変数として受け取ります。

 
Artyom Trishkin:

これは特別なことではありません。ある型の変数に別の型の値を書き込むと、コンパイラが警告を出します。そして、どの変数からデータを取るかは、あなた次第です。

あなたの場合、つまりlong型の 関数から明示的にdatetimeの値を返す場合は、もちろん安全なので、関数から取得する値の型を明示的に指定すべきです。

しかし、int-variableにdouble値を取り込んだ場合、そのような代入中にデータが失われることはないことを自分で理解する必要があります。戻り値がintに収まることが確実な場合は明示的にintを指定し、わからない場合はdouble変数に取り込みます。

詳しい回答ありがとうございました。了解です。

 

(皆様、こんにちは)))


MT4はマスターしましたが、MT5は...わかりません(( 例が少ないし、あっても必要なことを説明してくれない。

MT4のコードからいくつかのサンプルを使ってMT5を使用する方法をアドバイスするか、同様のケースを持つインジケーターのリンクを教えてください。


1.

if(Period()<=PERIOD_H4 && TimeHour(Time[h])==0 && TimeMinute(Time[h])==0)


2.

while(A<1)
  {
   ObjectDelete("MB");
   OP=iOpen(NULL,Timeframe,br);
   CL=iClose(NULL,Timeframe,br);
 if(OP>CL)
   bear=(OP-CL)/_Point;
 if(SizeCandles*FactorCandleы <= bear)
   A=2;
 if(br>iBars(NULL,Timeframe))
  {
   Lab("MB", " No Bear candle", 4, 510, 1, clrWhite);
   break;
  }
   br++;
  }


3.iMaハンドルで要素比較する方法がわからない...。構造物について知っている!!!試してみたが、MT5はMT4と違って分かりにくい...。

   
 for(int i=limit; i>0 && !IsStopped(); i--)
   {
   ma1=iMA(NULL,Period(),Ma1,0,MAMethod1,MAPrice1,i);
   ma2=iMA(NULL,Period(),Ma2,0,MAMethod2,MAPrice2,i);
   ma3=iMA(NULL,Period(),Ma3,0,MAMethod3,MAPrice3,i);
   ma4=iMA(NULL,Period(),Ma4,0,MAMethod4,MAPrice4,i);
   MA=iMA(NULL,Period(),MAPeriod,0,MAMethod,MAPrice,i);
//----
 if(filtercase==true && xPer==Period())
  {
//--- High signal
 if(Open[i]<Close[i] && MA>Open[i] && MA<Close[i] && ma1>ma2 && ma1<ma3 && MA<ma4)  
   ExtLineBuffer1[i]=High[i]+shiftmap*_Point;
 if(ShowPeriod==false && xPeriod==Period())
   ExtLineBuffer1[i]=0.0;
//--- Low signal
 if(Open[i]>Close[i] && MA<Open[i] && MA>Close[i] && ma1<ma2 && ma1>ma3 && MA>ma4)  
   ExtLineBuffer2[i]=Low[i]-shiftmap*_Point;
 if(ShowPeriod==false && xPeriod==Period())
   ExtLineBuffer2[i]=0.0;
  } 
 

MT5でのプログラミングの一般的な違いは、すでに理解されていますでも、まだプログラミングはできない(サイコロの目が合わない)))))

MT5のこれらのパーツやモジュールを頭の中でLISTENすることが重要なんです...。MT4ではすぐにロジックが理解できるのですが、MT5では「キューブ」しかない・・・。

ヒントありがとうございました)))

 
ロボットのフィックスロットを%ロットに変更してください。コードは私のプライベートメッセージの中にあります。
 
Sprut112:
ロボットのフィックスロットを%ロットに変更してください。プライベートでのコード

フリーランス です。

 
kopeyka2:

(皆様、こんにちは)))


MT4はマスターしましたが、MT5は...わかりません(( 例が少ないし、あっても必要なことを説明してくれない。

MT4のコードからいくつかのサンプルを使ってMT5を使用する方法をアドバイスするか、同様のケースを持つインジケーターのリンクを教えてください。


1.


2.


3.iMaハンドルで要素比較する方法がわからない...。構造物について知っている!!!試してみたが、MT5はMT4と違って分かりにくい...。

MT5でのプログラミングの一般的な違いは、すでに理解されていますでも、まだプログラミングはできない(サイコロの目が合わない)))))

MT5のこれらのパーツやモジュールを頭の中でLISTENすることが重要なんです...。MT4ではロジックがすぐに理解できるのですが、MT5では「サイコロ」だけ...。

ヒントありがとうございました)))

まず、ドキュメントをよく読んでください。時系列や指標へのアクセス」の項をご覧ください。

時刻を取得し、構造体に「入れる」、そして時間と分を別々に取得する方法が明確であるべきです。

また、ハンドルでインジケータ値を取得するCopyBufferもあります。

もし、まだ質問があるのなら...


 
kopeyka2:

(皆様、こんにちは)))


MT4はマスターしましたが、MT5は...わかりません(( 例が少ないし、あっても必要なことを説明してくれない。

MT4のコードからいくつかのサンプルを使ってMT5を使用する方法をアドバイスするか、同様のケースを持つインジケーターのリンクを教えてください。


1.


2.


3.iMaハンドルで要素比較する方法がわからないのですが...。構造物について知っている!!!試してみたが、MT5はMT4と違って分かりにくい...。

MT5でのプログラミングの一般的な違いは、すでに理解されていますでも、まだプログラミングはできない(サイコロの目が合わない)))))

MT5のこれらのパーツやモジュールを頭の中でLISTENすることが重要なんです...。MT4ではすぐにロジックを理解できるのですが、MT5では「キューブ」しかない・・・。

ヒントありがとうございました)))

1つのタイムフレームの複数の時系列を比較する必要がある場合は、MqlRates-> の ような配列で作業し、この配列を埋めるためにCopyRates を使用します。

MqlDateTime 構造体に時刻を格納するのが便利です。→TimeToStructを使って、時刻をdatetimeからMqlDateTime 構造体に変換してください。

これで、例1は次のようになります。

//+------------------------------------------------------------------+
//|                                                      Test_en.mq5 |
//+------------------------------------------------------------------+
#property script_show_inputs
//--- input parameters
int InpBarTime=3; // Bar where we compare the time
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlRates rates[];
   ArraySetAsSeries(rates,true);

   int start_pos  =0;                           // start position 
   int count=(InpBarTime<10)?10:InpBarTime+1;   // data count to copy 

   int result=CopyRates(Symbol(),Period(),start_pos,count,rates);
   if(result!=count)
     {
      Print("Ordered: ",IntegerToString(count),", received ",IntegerToString(result));
     }

//--- example 1
// if(Period()<=PERIOD_H4 && TimeHour(Time[h])==0 && TimeMinute(Time[h])==0)
   MqlDateTime SDateTime;
   TimeToStruct(rates[InpBarTime].time,SDateTime); // Converts a value of datetime type into a structure variable MqlDateTime
   if(Period()<=PERIOD_H4 && SDateTime.hour==0 && SDateTime.min==0)
     {

     }
  }
//+------------------------------------------------------------------+
ファイル:
Test_en.mq5  3 kb
 
ルールがあれば教えてください。
mql5では、1つの同じタスクを様々な方法で解決することができます。
あるコードでクラスのインスタンスを参照する場合、例えば、以下のようになります。CSymbolInfo.m_symbol.Ask()...といった具合に。
で、同じコードの中で、クラスを参照せずにAskの値を代入しています。
double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

質問:これはエラーの原因になるのでしょうか、それとも1つのコード、あるいは1つの関数の範囲内では正常なのでしょうか?

 
kopeyka2:

(皆様、こんにちは)))


MT4はマスターしましたが、MT5は...わかりません(( 例が少ないし、あっても必要なことを説明してくれない。

MT4のコードからいくつかのサンプルを使ってMT5を使用する方法をアドバイスするか、同様のケースを持つインジケーターのリンクを教えてください。


1.


2.


3.iMaハンドルで要素比較する方法がわからない...。構造物について知っている!!!試してみたが、MT5はMT4と違って分かりにくい...。

MT5でのプログラミングの一般的な違いは、すでに理解されていますでも、まだプログラミングはできない(サイコロの目が合わない)))))

MT5のこれらのパーツやモジュールを頭の中でLISTENすることが重要なんです...。MT4ではすぐにロジックを理解できるのですが、MT5では「キューブ」しかない・・・。

ヒントありがとうございました)))

インジケーターを使う -MA Forceの コードを例にして

ステップ1:グローバルプログラムレベルで変数handle_iMAを 宣言し、インジケータハンドルを格納します。

int    handle_iMA;                           // variable for storing the handle of the iMA indicator

ステップ2:OnInit()でインジケータを作成し、変数handle_iMAを 返す

//--- create handle of the indicator iMA
   handle_iMA=iMA(m_symbol.Name(),Inp_MA_period,Inp_MA_ma_period,Inp_MA_ma_shift,
                  Inp_MA_ma_method,Inp_MA_applied_price);
//--- if the handle is not created 
   if(handle_iMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(Inp_MA_period),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }

ステップ3:OnTick()でリクエストを出す - インジケータから一定量のデータ(カウント)をma[] 配列にコピーする

   double ma[],force[];
   ArraySetAsSeries(ma,true);
   ArraySetAsSeries(force,true);
   int start_pos=0,count=InpTrendBars+3;
   if(!iGetArray(handle_iMA,0,start_pos,count,ma) || 
      !iGetArray(handle_iForce,0,start_pos,count,force))
     {
      PrevBars=0;
      return;
     }

ステップ4:インジケータ・データ配列を操作し、その要素を比較する。

   bool trend_up=(ma[1]>ma[2]);
   bool trend_down=(ma[1]<ma[2]);
 
vladzeit:
ルールがあれば教えてください。
mql5では、1つの同じタスクを様々な方法で解決することができます。
あるコードでクラスのインスタンスを参照する場合、例えば、以下のようになります。CSymbolInfo.m_symbol.Ask()...といった具合に。
で、同じコードの中で、クラスを参照せずにAskの値を代入しています。
double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

質問:これはエラーの原因になるのでしょうか、それとも1つのコード、あるいは1つの関数の範囲内では正常なのでしょうか?

トレードクラスのCsymbolInfoか、SymbolInfoXXXXのようなシステム関数か、どちらか一方を使うのがよいでしょう。

理由: