MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1252

 
ANDREY:
皆さん、ごきげんよう。私はこのアルゴリズムをMT4のテスターでmql4を使ってテストしています。入札価格を小数点以下5桁でログ出力するPrint()関数が必要です。しかし、小数点以下4桁までしか表示されない。私のミスを修正する方法があれば、教えてください。以下は私のコードです。


void OnTick()
{
Print("=======Bid ========= ",NormalizeDouble(Bid,Digits) );

}


同時に、SLとTPによる注文の始値と終値を Print()で表示すると、 Print()は5桁の価格を表示 します。
皆さん、ありがとうございました。

NormalizeDouble()ではなく DoubleToString() です。

 
Igor Makanu:

だから自分の決断が気に入らないって言ったのに((

また書くのが億劫になりました。

array find repetitions」でググってみると、何か見つかると思います。

enum EResult{Ok,AllocError};

template<typename T>
EResult GetRepeat(const T &arr[],T &ret[],uint count){
   int size=ArraySize(arr);
   if (ArrayResize(ret,size)!=size) return AllocError;
   int ii=0;
   for (int i=0;i<size;){
      T tmp=arr[i];
      uint repeatCount=1;
      while(++i<size&&arr[i]==tmp) ++repeatCount;
      if (repeatCount>=count) ret[ii++]=tmp;}
   return ArrayResize(ret,ii)==ii?Ok:AllocError;
}

void OnStart()
{
   int arr[]={1,2,4,4,4,55,55,7,7,7,7,7,8,9,77,66,66,66};
   int ret[];
   if (!GetRepeat(arr,ret,3)) ArrayPrint(ret);
} 
 
Artyom Trishkin:

NormalizeDouble()ではなく DoubleToString() です。

このたびは、情報提供ありがとうございました。

 
もし、ご迷惑でなければ、私の質問について調べてみてください。
https://www.mql5.com/ru/forum/160683/page1251#comment_18219493
具体的には、ポジションが開いて いる分の値を知るにはどうしたらよいのでしょうか?
 
Aleksey Masterov:
具体的には、ポジションが開いて いる分の値をどのように求めるのでしょうか。

use TimeToStruct()

https://www.mql5.com/ru/docs/dateandtime/timetostruct

 
はい、mt4で持っています。
 
Aleksey Masterov:
はい、mt4で持っています。

MT4で動作する

 
Igor Makanu:

MT4で動作する

この構造から、ポジションがオープン された時の分の値を取得する方法がまだ理解できていません...。
 
Aleksey Masterov:
trumpetを返すこの構造体から、ポジションがオープン された時の分の値をどうやって取得するのかが分かりません...。

datetime o_open = OrderOpenTime();

MqlDateTime dt_struct;

TimeToStruct(o_open,dt_struct;)

int min =dt_struct.min;

 

インジケーターバッファーのデータを読もうとすると、何が問題なのか理解できるようになれば。

以下は、EAのコードです。

      if (IsTesting())
         {
         Trend    = GlobalVariableGet(GV_tradesTrend);
         TrendUP  = iCustom(NULL,0,"Used\\# Once Trades Trend",3,0);
         TrendDN  = iCustom(NULL,0,"Used\\# Once Trades Trend",4,0);
         if (TrendUP>0) {Trend=1; GlobalVariableSet(GV_tradesTrend,1);}
         if (TrendDN>0) {Trend=-1;GlobalVariableSet(GV_tradesTrend,-1);}
         if (Trend==1)  {GlobalVariableSet(GV_Trend,1);}
         if (Trend==-1) {GlobalVariableSet(GV_Trend,-1);}
         if (Trend==0)  {GlobalVariableSet(GV_Trend,0);}
         }
      else
         {
         Trend = GetLastTrendChange();
         if (Trend==1)  {GlobalVariableSet(GV_Trend,1);}
         if (Trend==-1) {GlobalVariableSet(GV_Trend,-1);}
         if (Trend==0)  {GlobalVariableSet(GV_Trend,0);}
         }
//+----------------------------------------------------------------------------+
int GetLastTrendChange()
   {
   int   trendType=0;
   int   y=0;
   int   t=500;
   while (y<t)
      {
      if (iOpen(NULL,0,t)==y) {return(0);}
      trendType=FindTrendChange(y);
      if (trendType==1 || trendType==-1) {return(trendType);}
      y++;
      }
   return(0);
   }
//+----------------------------------------------------------------------------+
int FindTrendChange(int index)
   {
   double   trendUP,trendDN;
   int      trendType=0;
   trendUP = iCustom(NULL,0,"Used\\# Once Trades Trend",3,index);
   trendDN = iCustom(NULL,0,"Used\\# Once Trades Trend",4,index);
   if (trendUP>0) {trendType=1;}
   if (trendDN>0) {trendType=-1;}
   return (trendType);
   }
//+----------------------------------------------------------------------------+

実際のテストでは、関数を通して最後の値を検索することはできますが、テストは壊滅的に遅いです(半年間のテストが数日間にわたります)。

そこで、テスト時にスワップを使用し、最後の値をグローバル変数に 保存することにしたところ、Expert Advisorはバッファデータを見なくなりました。また、空のバッファは0なのに、なぜかEAの変数はEMPTY_VALUEの値を取り、変化しない。

通牒

しかし、データウィンドウのバッファラインにカーソルを合わせると、ツールチップに2つの値が表示され、最初の値は0、例えば Value 5; 0.0000; 0.8855 と表示されるのです。

インジケーターのコードをつつくも、見つからない。インターネットや資料で検索してもダメだった。このインディケータを使おうとすると、なぜテストが遅くなるのか、どなたかアドバイスをお願いします。

よろしくお願いします。

ファイル: