MT4のEAを作る 勉強を始めたばかりで 混乱しています 既存のインディケータ…

回答1

/* swdvvv123さんへ

※一部修正しました

すみません、EMPTY_VALUEはインジケータの表示においては無効な値として扱われるようですが、実際は2147483647という値のようで、これが最大値としてヒットしてしまうようです。

以下はおそらくこういう事をしたいのかな?というスクリプトの例です。
基本的にH1もD1も同じような事をしているようですので、処理を関数に分離して「配列」と「時間軸」等を引数として渡して処理させています。

※外していたらごめんなさい。

—–実行結果—–
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufD[10]=1.0461
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufD[9]=1.0493
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufD[8]=1.051
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufD[7]=1.0692
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufD[6]=1.0821
2015.06.13 23: 35:41.016 Test EURUSD,Daily: bufD[5]=1.0838
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufD[4]=1.0986
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufD[3]=1.106
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufD[2]=1.1533
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufD[1]=1.1422
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufD[0]=1.1096
2015.06.13 23:35:41.016 Test EURUSD,Daily: —–ArrayPrint()—–
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufH[5]=1.115
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufH[4]=1.118
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufH[3]=1.1385
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufH[2]=1.1373
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufH[1]=1.1213
2015.06.13 23:35:41.016 Test EURUSD,Daily: bufH[0]=1.1344
2015.06.13 23:35:41.016 Test EURUSD,Daily: —–ArrayPrint()—–

*/
#property copyright "None"
#property link &qu ot;None"
#property show_confirm

//標準型の1次元配列なら何でもエキスパートログに内容を出力できるテンプレート関数
template<typename T>
void ArrayPrint(T &arr[],const string array_name="")
{
int size=ArraySize(arr);

Print("—–ArrayPrint()—–");
for(int i=0;i<size;i++){
Print(array_name+"["+i+"]=",arr[i]);
}
}

//1次元配列の型を問わず要素を末尾に追加できるテンプレート関数
//※最大要素数を超える場合は、先頭から消されます
template<typename T>
void PushBack(T& array[], const T data, const int element_max)
{
if(ArraySize(array)>=element_max){//要素が一杯の時
//先頭要素を追い出して末尾に追加する
ArrayCopy(array,array,0,1);
array[ArraySize(array)-1]=data;
return;
}

//最大サイ ズが決まっていない時、または、要素数に空きがある時
//配列サイズを1つ増やして、末尾にデータを格納
ArrayResize(array,ArraySize(array)+1);
array[ArraySize(array)-1]=data;
}

//array=配列の参照,element_max=配列最大要素数,timeframe=時間軸,limit=処理するバーの数、を引数に取り、
//過去から現在へと特徴レートを配列に格納していく関数
void MakeArray(double& array[],const int element_max, const ENUM_TIMEFRAMES timeframe, const int limit)
{
int i;

ArrayResize(array,0,element_max);//配列サイズ=0,配列予約サイズ=element_max

for (i=limit; i>0; i–)
{
double high = iHigh(NULL,timeframe,i);
double low = iLow(NULL,timeframe,i);

if(i==limit){//初回の時、無条件に登録する
PushBack(array,high,element_max);
PushBack(array,low,element_max);
//ArrayPrint(array,&q uot;array");//デバッグ用
continue;
}

//初回でない時
//新値足を格納する配列の最大値、最小値を取得
double max = array[ArrayMaximum(array)];
double min = array[ArrayMinimum(array)];

if(high > max){
PushBack(array,high,element_max);
//ArrayPrint(array,"array");//デバッグ用
}
if(low < min){
PushBack(array,low,element_max);
//ArrayPrint(array,"array");//デバッグ用
}
}
}

double bufH[];//H1用の配列
double bufD[];//D1用の配列
int hon1=5;//H1用の配列最大インデクス番号(要素数-1)
int hon2=10;//D1用の配列最大インデクス番号(要素数-1)

int init()
{

MakeArray(bufH,hon1+1,PERIOD_H1,100);
MakeArray(bufD,hon2+1,PERIOD_D1,100);

ArrayPrint(bufH,"bufH");
ArrayPrint(bufD,"bufD");
return 0;
}

int start()
{
return 0;
}

回答2

ヒント、何がしたいのかわからないので答えられない(☆∀☆)


回答3

何をしたいのか根本的に謎って事をさておいてw

bufH、bufDに初期値が入ってないまま処理をするから後の
MaxH,MinH,MaxD,MinDがぐだぐだ
ってかEMPTY_VALUEは0ではなく特殊な値だチャートとして表示させないための
特殊記号の一種。それを演算に放り込むってむちゃくちゃかと

それ以前の問題としてこの配列は何ぞや?
もっと根本的な勘違いがありそうな気がするの〜〜〜?w


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA