teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

条件を満たす続けるとき、アラートが鳴りやまなくなっていたので補足情報に記載したサイトを参考に、ローソク足1本に対し1アラートが鳴るようにしました。

2021/11/15 00:39

投稿

tera-ryo
tera-ryo

スコア4

title CHANGED
File without changes
body CHANGED
@@ -26,7 +26,7 @@
26
26
  #property indicator_width2 2
27
27
 
28
28
  double arrEntUp[], arrEntDown[];
29
- int maxlimit = 1000;
29
+ int maxlimit = 10000;
30
30
  datetime lastAlertTime;
31
31
  double MathAbs;
32
32
 
@@ -43,8 +43,8 @@
43
43
  SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID);
44
44
  SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID);
45
45
 
46
- SetIndexArrow(0, 233);
46
+ SetIndexArrow(0, 233);//上矢印
47
- SetIndexArrow(1, 234);
47
+ SetIndexArrow(1, 234);//下矢印
48
48
 
49
49
  //---
50
50
  return(INIT_SUCCEEDED);
@@ -67,7 +67,7 @@
67
67
  double dForceNow,dMFINow,dMANow1,dMANow2,dOpen1,dOpen2,dLow1,dLow2,dHigh,dClose1,dClose2;
68
68
 
69
69
 
70
- for(int i=maxlimit; i>=1; i--){
70
+ for(int i=maxlimit-1; i>=0; i--){
71
71
  dForceNow = iForce(NULL,0,13,MODE_SMA,PRICE_CLOSE,i);
72
72
  dMFINow = iMFI(NULL,0,14,i);
73
73
  dMANow1 = iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,i);//今のma
@@ -96,15 +96,17 @@
96
96
  // 陽線              / forceが0以上      /  MFIが50以上     /   差の差が3pips以下 /  1本前の足の終値がma以下  / 1本前の足の始値ma以下(1本前が陰線だった場合)/実体がmaまたぐ
97
97
  if(dOpen1 < dClose1 && dForceNow >= 0 && dMFINow > 50 && gapOfGap <= 3 && dMANow2 > dClose2 && dMANow2 > dOpen2 && dOpen1 < dMANow1 && dMANow1 < dHigh){
98
98
  arrEntUp[i] = Low[i];
99
+
99
100
  if(lastAlertTime != Time[0]){
100
- Alert("エントリーアラート");
101
+ Alert(Symbol()+"/n"+"ハイエントリー");
101
102
  lastAlertTime = Time[0];
102
103
  }
103
104
  // 陰線             / forceが0以下 / MFIが50以下    / 差の差が3pips以下 / 1本前の足の終値がma以上 / 1本前の足の始値がma以上(1本前が陽線だった場合)/実体がmaまたぐ
104
105
  }else if(dOpen1 > dClose1 && dForceNow <= 0 && dMFINow < 50 && gapOfGap <= 3 && dMANow2 < dClose2 && dMANow2 < dOpen2 && dLow1 < dMANow1 && dMANow1 < dOpen1){
105
106
  arrEntDown[i] = High[i];
107
+
106
108
  if(lastAlertTime != Time[0]){
107
- Alert("エントリーアラート");
109
+ Alert(Symbol()+"\n"+"ローエントリー");
108
110
  lastAlertTime = Time[0];
109
111
  }
110
112
  }
@@ -123,4 +125,6 @@
123
125
 
124
126
  ### 補足情報(FW/ツールのバージョンなど)
125
127
 
126
- mt4はFXCM社、PCのOSはWindows11です。
128
+ mt4はFXCM社、PCのOSはWindows11です。
129
+ 参考にしたサイト
130
+ https://blog.codinal-systems.com/alert-per-bar/

2

エントリー条件を増やしたためソースコードを少し変更しました。実現したいことをより具体的に記述しまし。

2021/11/15 00:39

投稿

tera-ryo
tera-ryo

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- MQL4を用いて、エントリーポイントとなる条件を満たすとシグナル(矢印)とアラートが鳴るというインジケータを作っています。現状は、特にエラーはなく、シグナルもアラートも実現できていますが、そのどちらもタイミングが、そのローソク足が完成したタイミングで表示されてしまいます。そうではなく、条件を満たしたタイミングで、シグナルを表示し、アラートが鳴るようにしたいです。(ちなみにローソク足一つに対しアラートは1回だけ)
3
+ MQL4を用いて、エントリーポイントとなる条件を満たすとシグナル(矢印)とアラートが鳴るというインジケータを作っています。現状は、特にエラーはなく、シグナルもアラートも実現できていますが、そのどちらもタイミングが、そのローソク足が完成したタイミングで表示されてしまいます。そうではなく、条件を満たしたタイミングで、シグナルを表示し、アラートが鳴るようにしたいです。具体的は、シグナルは条件を満たしている間ずっと表示、アラートはローソク足一つに対し1回だけ発生というようにしたいです。
4
4
  どこをどのように変更すれば実現できますか。
5
5
  よろしくお願いします。
6
6
 

1

エントリー条件を増やしたためソースコードを少し変更しました。大きくは変わっていません。

2021/11/12 16:04

投稿

tera-ryo
tera-ryo

スコア4

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,8 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- MQL4を用いて、エントリーポイントとなる条件を満たすとシグナル(矢印)とアラートが鳴るというインジケータを作っています。現状は、特にエラーはなく、シグナルもアラートも実現できていますが、そのどちらもタイミングが、そのローソク足が完成したタイミングで表示されてしまいます。そうではなく、条件を満たしたタイミングで、シグナルを表示し、アラートが鳴るようにしたいです。
3
+ MQL4を用いて、エントリーポイントとなる条件を満たすとシグナル(矢印)とアラートが鳴るというインジケータを作っています。現状は、特にエラーはなく、シグナルもアラートも実現できていますが、そのどちらもタイミングが、そのローソク足が完成したタイミングで表示されてしまいます。そうではなく、条件を満たしたタイミングで、シグナルを表示し、アラートが鳴るようにしたいです。(ちなみにローソク足一つに対しアラートは1回だけ)
4
4
  どこをどのように変更すれば実現できますか。
5
+ よろしくお願いします。
5
6
 
6
7
  ### 該当のソースコード
7
8
 
@@ -27,6 +28,7 @@
27
28
  double arrEntUp[], arrEntDown[];
28
29
  int maxlimit = 1000;
29
30
  datetime lastAlertTime;
31
+ double MathAbs;
30
32
 
31
33
  //+------------------------------------------------------------------+
32
34
  //| Custom indicator initialization function |
@@ -62,31 +64,44 @@
62
64
  const int &spread[])
63
65
  {
64
66
  //---
65
- double dForceNow,dMFINow,dMANow1,dMANow2,dOpen,dLow,dHigh,dClose1,dClose2;
67
+ double dForceNow,dMFINow,dMANow1,dMANow2,dOpen1,dOpen2,dLow1,dLow2,dHigh,dClose1,dClose2;
66
68
 
69
+
67
70
  for(int i=maxlimit; i>=1; i--){
68
71
  dForceNow = iForce(NULL,0,13,MODE_SMA,PRICE_CLOSE,i);
69
72
  dMFINow = iMFI(NULL,0,14,i);
70
73
  dMANow1 = iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,i);//今のma
71
74
  dMANow2 = iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,i+1);//1本前のma
72
- dOpen = iOpen(NULL,0,i);
75
+ dOpen1 = iOpen(NULL,0,i);
76
+ dOpen2 = iOpen(NULL,0,i+1);
73
- dLow = iLow(NULL,0,i);
77
+ dLow1 = iLow(NULL,0,i);
78
+ dLow2 = iLow(NULL,0,i+1);
74
- dHigh = iHigh(NULL,0,i);
79
+ dHigh = iHigh(NULL,0,i+1);
75
- dClose1 = iClose(NULL,0,i);//今の終値
80
+ dClose1 = iClose(NULL,0,i);//今の終値(現在のレート)
76
81
  dClose2 = iClose(NULL,0,i+1);//1本前の終値
82
+ double gapOfNow = MathAbs(dClose1 - dMANow1);//現在レートとmaの差
83
+ double gapOfStart = MathAbs(dOpen1 - dMANow1);//始値とmaの差
77
84
 
85
+ if(Digits==2 || Digits==3){
86
+ gapOfNow *= 100;
87
+ gapOfStart *= 100;
88
+ }else if(Digits==4 || Digits ==5){
89
+ gapOfNow *= 10000;
90
+ gapOfStart *= 10000;
91
+ }
92
+ double gapOfGap = MathAbs(gapOfNow - gapOfStart);
78
93
 
79
94
  arrEntUp[i] = EMPTY_VALUE;
80
95
  arrEntDown[i] = EMPTY_VALUE;
81
-
96
+ // 陽線              / forceが0以上      /  MFIが50以上     /   差の差が3pips以下 /  1本前の足の終値がma以下  / 1本前の足の始値ma以下(1本前が陰線だった場合)/実体がmaまたぐ
82
- if(dForceNow > 0 && dMFINow > 50 && dOpen < dMANow1 && dMANow1 < dHigh && dMANow2 > dClose2){
97
+ if(dOpen1 < dClose1 && dForceNow >= 0 && dMFINow > 50 && gapOfGap <= 3 && dMANow2 > dClose2 && dMANow2 > dOpen2 && dOpen1 < dMANow1 && dMANow1 < dHigh){
83
98
  arrEntUp[i] = Low[i];
84
99
  if(lastAlertTime != Time[0]){
85
100
  Alert("エントリーアラート");
86
101
  lastAlertTime = Time[0];
87
102
  }
88
-
103
+ // 陰線             / forceが0以下 / MFIが50以下    / 差の差が3pips以下 / 1本前の足の終値がma以上 / 1本前の足の始値がma以上(1本前が陽線だった場合)/実体がmaまたぐ
89
- }else if(dForceNow < 0 && dMFINow < 50 && dLow < dMANow1 && dMANow1 < dOpen && dMANow2 < dClose2){
104
+ }else if(dOpen1 > dClose1 && dForceNow <= 0 && dMFINow < 50 && gapOfGap <= 3 && dMANow2 < dClose2 && dMANow2 < dOpen2 && dLow1 < dMANow1 && dMANow1 < dOpen1){
90
105
  arrEntDown[i] = High[i];
91
106
  if(lastAlertTime != Time[0]){
92
107
  Alert("エントリーアラート");