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

 
兄が来ています。明日にでも行ってみようかな。
 
Merkulovv_Artem:

正確な値は出ているのですが、「Obem_Pozic」の値を1.00にすることができず、表示するためのロットを計算することができません、正規化したいわけでもなく、ただ小数点以下4桁が出てしまうのです。

MQL4で書いています。

MQL4については該当するフォーラムで質問しているのですが、ここではAです。


より正確な値を画面に表示するには、DoubleToStr() を使用する必要があります。

DoubleToStr - Документация на MQL4
  • docs.mql4.com
DoubleToStr - Документация на MQL4
 
Yedelkin:

このペアは、おそらく端子から提供されているので、接続するだけでよい。手動であれば、Market Watchで。そして、大人しくしていれば、SymbolSelect() を使う必要があるのです。

一つエラーが出ると、他のエラーも出てきます。最初のエラーは、端末の下の方にあります。だから、最初のエラーをなくすようにして、それから考えるべきだね :)

ありがとうございます!!!非常によく理解でき、美しく書かれている。私のEAにはSymbolSelect()があります。pgにコード付きで掲載しました。53、必要なら見ることができる。ヘルプで確認したところ、正しい!!!!では、このペアが端末から提供された場合、どう考えればいいのでしょうか?

さらに、First in lineのエラーが端末の最下部にある場合。プリンタのエラーメッセージと端末のメッセージが交互に表示されるのはなぜですか - いいえ、まとめて表示されるのです。

もしかしたら、端末がこの関数からのエラーを報告していないのでは?

 
どうやらこれは違うようだ!!!これでもか、これでもかと。最初はプログラムのメッセージ(プリンター)と端末からのメッセージが交互に表示されていたのですが、突然、しかも10~12回もエラー4002が発生したのです!
 
やっぱりコードを見たほうがいいのかな...。他に指標となるものがあれば
 
Dimka-novitsek: 私のEAでは、SymbolSelect()を使用しています。53ページのコードと一緒に掲載しました。53、見る必要があるのなら

はい、わかります。こんな風にやってみよう。

ResetLastError();
if(SymbolSelect(a_symbol,true)) Print("Символ ",a_symbol," успешно выбран");
else Print("Неудача с выбором символа ",a_symbol,", error = ",_LastError);
 

ありがとうございます!!!!!

可変時間枠のプリントはどのようなものなのか教えてください、デジタルでもいいのでしょうか?1が表示されていますね。

///////////////////////////////////////////////////////////////////////////////////////////////////////
 
 double  iMAf( string symbol, ENUM_TIMEFRAMES timeframe, int period, int mama_shift, ENUM_MA_METHOD mama_method, int applied_pricece, int shift){
 
    Print ( " iMAfsymbol  ",symbol,"    iMAftimeframe ",timeframe,"  iMAfperiod  ",period," iMAfmama_shift  ",mama_shift ,"  iMAfmama_method ",mama_method,
    "  iMAfapplied_pricece ", applied_pricece,"  iMAfshift ",shift);
 
                     MA_handle=iMA(symbol,timeframe,periodd(period),mama_shift, mama_method,applied_pricece);Sleep(2000);
                     //--- если не удалось создать хэндл
   if(MA_handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
     PrintFormat("Не удалось создать хэндл индикатора iMA для пары %s/%s, код ошибки %d",
                 symbol,
                  EnumToString(timeframe),
                  GetLastError()); ResetLastError();return (0.0);} 
                     
                    CopyBuffer( MA_handle,0,0,100,MA);
                    ArraySetAsSeries(MA,true);
                     if(shift>99) return(0);
    return( (MA[shift])); } 
                   
///////////////////////////////////////////////////////////////////////////////////////////////////////

理由を聞いているんです。これは関数で、プリントのある線を持っています。それに伴い、上から2番目のもの。

以下は、その関数呼び出し です。

/////////////////////////////////////////////////////////////////////
int Distance_from_MA(string symbb)
{
 double MAMA = iMAf( symbb, periodd(TFMA), periodMA, ma_shift, ma_method, applied_price, 0);
 
 int spread = (int) MathRound(SymbolInfoInteger(symbb,SYMBOL_SPREAD));
 double point = SymbolInfoDouble(symbb,SYMBOL_POINT);
 
if(SymbolInfoInteger(symbb,SYMBOL_DIGITS) == 3 || SymbolInfoInteger(symbb,SYMBOL_DIGITS) == 5)
{spread = (int) MathRound(SymbolInfoInteger(symbb,SYMBOL_SPREAD)/10);
point = SymbolInfoDouble(symbb,SYMBOL_POINT)*10;}
 
 if(iClose(symb,TF_Price,0)+(spread*point)+(Min_Distance_from_MA*point)<=MAMA) return(-1);
 if(iClose(symb,TF_Price,0)-(Min_Distance_from_MA*point)>=MAMA) return (1);
 
 
 return(0);
} 

////////////////////////////////////////////////////////////////////

なお、コールラインでは別の関数を使用しています。時間軸を納得させるために使用されます。私のExpert Advisorは4からピリピリしているので、そうなのでしょう。ケースオープナーを 使用しています。その後、念のため、FをF4タイムフレームに追加して、さらに使い込んで います。

///////////////////////////////////////////////////////////////////////////////////////////////  
    
   ENUM_TIMEFRAMES  periodd(int per)
  {
   switch(per)
     {
      case 0: return(PERIOD_CURRENT);
      case 1: return(PERIOD_M1);
      case 5: return(PERIOD_M5);
      case 15: return(PERIOD_M15);
      case 30: return(PERIOD_M30);
      case 60: return(PERIOD_H1);
      case 240: return(PERIOD_H4);
      case 1440: return(PERIOD_D1);
      case 10080: return(PERIOD_W1);
      case 43200: return(PERIOD_MN1);
      
      case 2: return(PERIOD_M2);
      case 3: return(PERIOD_M3);
      case 4: return(PERIOD_M4);      
      case 6: return(PERIOD_M6);
      case 10: return(PERIOD_M10);
      case 12: return(PERIOD_M12);
      case 16385: return(PERIOD_H1);
      case 16386: return(PERIOD_H2);
      case 16387: return(PERIOD_H3);
      case 16388: return(PERIOD_H4);
      case 16390: return(PERIOD_H6);
      case 16392: return(PERIOD_H8);
      case 16396: return(PERIOD_H12);
      case 16408: return(PERIOD_D1);
      case 32769: return(PERIOD_W1);
      case 49153: return(PERIOD_MN1);      
      default: return(PERIOD_CURRENT);
     }
  }  
  
  
  ///////////////////////////////////////////////////////////////////////////

そして、これが私の見たものです。

 
Dimka-novitsek: 教えてください!タイムフレーム変数の印字は どのようにすればいいのでしょうか、数値でもいいのでしょうか?1が表示されていますね。

さて、このコードのすぐ下に使われているのは

EnumToString(timeframe), 
 
ありがとうございました。もう一回見てみるよ。
 
Dimka-novitsek: ありがとうございました。もう一度見てみます。

どこに問題がありそうなのか、わかったような気がします。これから記述します。

画像から、EAがM1、時間枠==1、期間==140で 動作していることがわかります。これでいいのでしょうか?

timeframe==1という値は、timeframe==M1である可能性が高いです。同時に、periodd(period)の項目はperiodd(140)を意味します。 コードによると、periodd(140)関数はPERIOD_CURRENT 値を返さなければなりません。つまり、periodd(140)==M1であることが判明したわけです。
つまり、iMAの呼び出しは次のようになります。 iMA(symbol,M1,M1...) iMAを計算するときに、第2引数の値と第3引数の値が一致する(つまり、期間が平均化期間と一致する)ことが許容されるかどうかはわかりませんが、何かが間違っているような気がしています。

理由: