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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hosoway
記事: 2
登録日時: 1年前

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

#1

投稿記事 by hosoway » 1年前

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

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

コード: 全て選択

#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);
        }

白い変人

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

#2

投稿記事 by 白い変人 » 1年前

テンプレートを改造して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/

以上が回答になります。

hosoway
記事: 2
登録日時: 1年前

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

#3

投稿記事 by hosoway » 1年前

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

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

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

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

白い変人

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

#4

投稿記事 by 白い変人 » 1年前

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

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

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

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

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

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

返信

“C言語何でも質問掲示板” へ戻る