合計 昨日 今日

MT4のEAについての質問です

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: hosoway
[URL]
かけだし(1,891 ポイント)
Date: 2017年4月15日(土) 23:06
No: 1
(OFFLINE)

 MT4のEAについての質問です

FX MT4 EAプログラムに関しての質問です
インジケーターを編集して自動売買EAにしようと試みたのですが、
コンパイルできてもストラテジーテスターで稼働せず、チャートにも反映できません。

インジケーターにメール機能を付けることには成功しているのですが…
メールのタイミングでOrdersendを実行することができず困っています。
わかる方がいらっしゃいましたら、修正方法をご指南いただきたいです。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#property indicator_chart_window
#property indicator_buffers 10
#property indicator_color1  clrBlue
#property indicator_color2  clrRed
#property indicator_color3  clrBlue
#property indicator_color4  clrRed
#property indicator_color5  clrYellow
#property indicator_color6  clrYellow
#property indicator_color7  clrYellow
#property indicator_color8  clrYellow
#property indicator_color9  clrDeepSkyBlue
#property indicator_color10 clrPaleVioletRed
#property indicator_width1  1
#property indicator_width2  1
#property indicator_width3  2
#property indicator_width4  2
#property indicator_width5  1
#property indicator_width6  1
#property indicator_width7  2
#property indicator_width8  2
 
//
 
extern int                FractalPeriod   = 25;
extern double             Lots            = 0.1;
extern int                TakeProfit      = 40;
extern int                StopLoss        = 30;
extern ENUM_APPLIED_PRICE PriceHigh       = PRICE_HIGH;
extern ENUM_APPLIED_PRICE PriceLow        = PRICE_LOW;
extern bool               ShowChannel     = true;
 
//---- input parameters
extern bool alert=true;
extern bool email=true;
 
double frhu[];
double frhd[];
double frhbu[];
double frhbd[];
double frnu[];
double frnd[];
double frnbu[];
double frnbd[];
double UpperBuffer[];
double LowerBuffer[];
double trend[];
 
 
//
//
 
int init()
{
   IndicatorBuffers(11);
   SetIndexBuffer(0,frhu);  SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(1,frhd);  SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(2,frhbu); SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexBuffer(3,frhbd); SetIndexStyle(3,DRAW_HISTOGRAM);
   SetIndexBuffer(4,frnu);  SetIndexStyle(4,DRAW_HISTOGRAM);
   SetIndexBuffer(5,frnd);  SetIndexStyle(5,DRAW_HISTOGRAM);
   SetIndexBuffer(6,frnbu); SetIndexStyle(6,DRAW_HISTOGRAM);
   SetIndexBuffer(7,frnbd); SetIndexStyle(7,DRAW_HISTOGRAM);
   SetIndexBuffer(8,UpperBuffer);
   SetIndexBuffer(9,LowerBuffer);
   SetIndexBuffer(10,trend);
   if (ShowChannel)
   {
     SetIndexStyle(8,DRAW_LINE);
     SetIndexStyle(9,DRAW_LINE);
   }
   else
   {
     SetIndexStyle(8,DRAW_NONE);
     SetIndexStyle(9,DRAW_NONE);
   }          
return(0);
}
int deinit() {  return(0); }
 
//+------------------------------------------------------------------+
///////////////////////////////////////////////////////////////////////////////
// Alert once
bool AlertOnce(string alert_msg, int ref)
{
   static datetime LastAlert[20];
 
   if(ref<1 || ref>20){
      Alert(ref+" ref error");
      return(false);
   }
   if(LastAlert[ref-1] != Time[0]){
      Alert(alert_msg,Symbol()," at ",Ask);
      LastAlert[ref-1] = Time[0];
      return(true);
   }
   return(false);
}
/////////////////////////////////////////////////////////////////////////////
//
// Email once
bool EmailOnce(string alert_msg, int ref)
{
   static datetime LastAlert[20];
 
   if(ref<1 || ref>20){
      Alert(ref+" ref error");
      return(false);
   }
   if(LastAlert[ref-1] != Time[0]){
      SendMail(alert_msg,Symbol()+Period()+"at"+DoubleToStr(Ask,Digits)+"¥n"+
      "ServerTime : "+TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)+"¥n"+
      "LocalTime : "+TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS));
      LastAlert[ref-1] = Time[0];
      return(true);
   }
   return(false);
}
   
//
//
//
 
int start()
{
//変数宣言
   int cnt, CurrentPosition;
   int Ticket;
   int i,limit,counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
           limit=MathMin(MathMax(Bars-counted_bars,FractalPeriod),Bars-1);
 
   //
   //オーダーチェック
   CurrentPosition=-1;
   int;
   for(cnt=0;cnt<OrdersTotal();cnt++)
  { int OS = OrderSelect(cnt,SELECT_BY_POS);
   if(OrderSymbol() == Symbol()) CurrentPosition=cnt;
  }
   //
   //
     int half = FractalPeriod/2;
     for(i=limit; i>=0; i--)
     {
         bool   found     = true;
         double compareTo = iMA(NULL,0,1,0,MODE_SMA,PriceHigh,i);
         for (int k=1;k<=half;k++)
            {
               if ((i+k)<Bars && iMA(NULL,0,1,0,MODE_SMA,PriceHigh,i+k)> compareTo) { found=false; break; }
               if ((i-k)>=0   && iMA(NULL,0,1,0,MODE_SMA,PriceHigh,i-k)>=compareTo) { found=false; break; }
            }
         if (found) UpperBuffer[i]=iMA(NULL,0,1,0,MODE_SMA,PriceHigh,i);
         else       UpperBuffer[i]=UpperBuffer[i+1];
 
         //
         //
         found     = true;
         compareTo = iMA(NULL,0,1,0,MODE_SMA,PriceLow,i);
         for (k=1;k<=half;k++)
            {
               if ((i+k)<Bars && iMA(NULL,0,1,0,MODE_SMA,PriceLow,i+k)< compareTo) { found=false; break; }
               if ((i-k)>=0   && iMA(NULL,0,1,0,MODE_SMA,PriceLow,i-k)<=compareTo) { found=false; break; }
            }
         if (found) LowerBuffer[i]=iMA(NULL,0,1,0,MODE_SMA,PriceLow,i);  
         else       LowerBuffer[i]=LowerBuffer[i+1];
         
         //
         //
         frhu[i]  = EMPTY_VALUE;
         frhd[i]  = EMPTY_VALUE;
         frhbu[i] = EMPTY_VALUE;
         frhbd[i] = EMPTY_VALUE;
         frnu[i]  = EMPTY_VALUE;
         frnd[i]  = EMPTY_VALUE;
         frnbu[i] = EMPTY_VALUE;
         frnbd[i] = EMPTY_VALUE;
         trend[i] = trend[i+1];;
         if (Close[i]>UpperBuffer[i])                          trend[i] = 1;
         if (Close[i]<LowerBuffer[i])                          trend[i] =-1;
         if (Close[i]<UpperBuffer[i]&&Close[i]>LowerBuffer[i]) trend[i] = 0;
         
         if (trend[i] == 1)
         {
            frhu[i]  = High[i];
            frhd[i]  = Low[i];
            frhbu[i] = MathMax(Open[i],Close[i]);
            frhbd[i] = MathMin(Open[i],Close[i]);
          }              
          if (trend[i] == -1)
          {
             frhu[i]  = Low[i];
             frhd[i]  = High[i];
             frhbu[i] = MathMin(Open[i],Close[i]);
             frhbd[i] = MathMax(Open[i],Close[i]);
           }
           if (trend[i] == 0)
           {
             frnu[i]  = Low[i];
             frnd[i]  = High[i];
             frnbu[i] = MathMin(Open[i],Close[i]);
             frnbd[i] = MathMax(Open[i],Close[i]);
            }                    
                   
         if (trend[1] == 1 && trend[2] == 0)
           {
           //買いアラート
           if(alert==true) AlertOnce("BlueSignal",1);
           
           //買いメールをする
           if(email==true) EmailOnce("BlueSignal Buy Ordered",1);
           
           if(CurrentPosition==-1)   //ポジション無し
            {Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-(StopLoss*Point), Ask+(TakeProfit*Point), "Buy", 0, 0, Blue);            
            }
           }
           
         
         if (trend[1] == -1 && trend[2] == 0)
           {
           //売りアラート
           if(alert==true) AlertOnce("RedSignal",1);
           
           //売りメールをする
           if(email==true) EmailOnce("RedSignal Sell Ordered",1);
           
           if(CurrentPosition==-1)   //ポジション無し
            {Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Bid-(StopLoss*Point), Bid+(TakeProfit*Point), "Buy", 0, 0, Red);
            }
 
           }
          }
 
return(0);
        }

Name: 白い変人
[URL]
Date: 2017年4月16日(日) 02:49
No: 2
(OFFLINE)

 Re: MT4のEAについての質問です

テンプレートを改造してEA化するという方向性も含め、正攻法とは思えない部分が多く、時代遅れな記述も目立ち、読んでいて「えっ? これで動くんだ?」と疑問に思ってしまう部分も散見されます。

ただ、そこは追々質問者様が改良していけば宜しいと思えますので、まずは、オーダーを発注出来るようにする事を目指しましょう。

休日で相場が動かないので、現時点では私の方で検証しようが有りませんが、原因の検討は大体付きました。

>OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-(StopLoss*Point), Ask+(TakeProfit*Point), "Buy", 0, 0, Blue);

に於ける「Point」の定義を確認してみて下さい。( http://mt4-traders.com/reference/point/ )

つまりは、質問者様は恐らく「Point」の定義を「1pips」と勘違いしているのではないかと疑っています。

しかし、恐らく質問者様のブローカーでは「Point」に相当する値幅が0.1pipsである為に、利確が4pips/損切が3pipsという非常に狭い指値のオーダーが投げられ、ブローカー側の値幅制限に引っかかり「異常なオーダー」として弾かれているのでしょう。

と言われたら、質問者様は思うでしょう。

じゃあ、「TakeProfit=400」「StopLoss=300」にすれば解決じゃん!!

と。

ただ、上記「Point」の定義を確認してみれば分かる通り、ブローカーに依っては「Point」が示す値幅が「1pips」になる可能性があるかもしれませんし、「10pips」になる可能性すら否定できない訳です。

で、それでは別なブローカーで同EAを実行した際に大事故が発生して、下手をすると質問者様の有り金が全部溶ける可能性も出て来る訳で、それでは恐らく質問者様はお困りでしょう。

じゃあ、どうするのかという話ですが、以下のサイトのソースをコピペして、1pipsの値幅を算出出来るようにすれば良いでしょう。

http://autofx100.com/2014/12/03/174256/

以上が回答になります。

Name: hosoway
[URL]
かけだし(1,891 ポイント)
Date: 2017年4月16日(日) 11:30
No: 3
(OFFLINE)

 Re: MT4のEAについての質問です

白い変人 様
お早い回答に感謝いたします。[point]と[pips]の件は、ご指摘頂いた通りに修正したいと思います。

私の質問の仕方が悪かったのですが、質問の主旨としては、「EAが動かない」ことなのです。
できることはコンパイルすることまでで、EAをチャートにドラッグしてもニコちゃんマークが付かず、プロパティ画面も表示されません。

メール&メッセージまではインジケータとして動作します。

EAとして何が足りないのか。
拙い記述でお恥ずかしいのですが、ご教示いただけたら幸いです…。

Name: 白い変人
[URL]
Date: 2017年4月16日(日) 16:09
No: 4
(OFFLINE)

 Re: MT4のEAについての質問です

>EAをチャートにドラッグしてもニコちゃんマークが付かず、プロパティ画面も表示されません。

まぁ、普通のやり方ではありませんからね。

恐らく、そのex4ファイルはテンプレートのディレクトリに入っているのかもしれないので、テンプレートとして認識されるのかもしれませんが、その中身は、テンプレートとして起動されるものでも無く・・・・という摩訶不思議な状態ですからね。

ただ、それでもメールの送信が出来るという奇跡が起きたのならば、試しに、それで明日デモ口座上で良いので稼働してみては?

もしかすると、オーダーが発注出来ているかもしれませんよ。

ちなみに、現状では、仮にオーダーが発注出来た場合、必要証拠金を食いつぶす迄ポジションが連発される可能性があるので、注意した方が良いでしょう。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[3人]