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;}
returnArrayResize(ret,ii)==ii?Ok:AllocError;
}
voidOnStart()
{
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);
}
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);
}
//+----------------------------------------------------------------------------+
皆さん、ごきげんよう。私はこのアルゴリズムをMT4のテスターでmql4を使ってテストしています。入札価格を小数点以下5桁でログ出力するPrint()関数が必要です。しかし、小数点以下4桁までしか表示されない。私のミスを修正する方法があれば、教えてください。以下は私のコードです。
}
同時に、SLとTPによる注文の始値と終値を Print()で表示すると、 Print()は5桁の価格を表示 します。
皆さん、ありがとうございました。
NormalizeDouble()ではなく 、DoubleToString() です。
だから自分の決断が気に入らないって言ったのに((
また書くのが億劫になりました。
array find repetitions」でググってみると、何か見つかると思います。
NormalizeDouble()ではなく 、DoubleToString() です。
このたびは、情報提供ありがとうございました。
use TimeToStruct()
https://www.mql5.com/ru/docs/dateandtime/timetostruct
use TimeToStruct()
https://www.mql5.com/ru/docs/dateandtime/timetostruct
はい、mt4で持っています。
MT4で動作する
MT4で動作する
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);} }実際のテストでは、関数を通して最後の値を検索することはできますが、テストは壊滅的に遅いです(半年間のテストが数日間にわたります)。
そこで、テスト時にスワップを使用し、最後の値をグローバル変数に 保存することにしたところ、Expert Advisorはバッファデータを見なくなりました。また、空のバッファは0なのに、なぜかEAの変数はEMPTY_VALUEの値を取り、変化しない。
しかし、データウィンドウのバッファラインにカーソルを合わせると、ツールチップに2つの値が表示され、最初の値は0、例えば Value 5; 0.0000; 0.8855 と表示されるのです。
インジケーターのコードをつつくも、見つからない。インターネットや資料で検索してもダメだった。このインディケータを使おうとすると、なぜテストが遅くなるのか、どなたかアドバイスをお願いします。
よろしくお願いします。