Quantcast
Channel: FX自動売買「Dr.EAのブログ」
Viewing all 55 articles
Browse latest View live

取引を有利にする方法 = CashBackForexのキャッシュバック

$
0
0

次のバックテストレポートを見てください。

Sample_break_rのバックテストレポート

トレードルール検証中によくある右肩下がりの失敗EAです^^;

すべて1ロット(10万通貨)で取引して、5ヶ月ちょっとで約-2582ドル。
動かせば動かすだけ資産が減っていきます。

ここで少し、コストを計算してみましょう。
通貨ペアは、ドル円(USDJPY)スプレッド2ピプスとします。
1ピプスあたりのコストが1000円(現在のレートで約10.7ドル)ですので、
1トレードあたり、21.4ドルのコストがかかります。
取引総数が、853回ですので、21.4ドル×853回で、

コスト総額:18254.2ドル

スプレッドがなければ、資産は約2.5倍に膨らんでました。

キャッシュバックでコスト削減

cbf_letters_logo11.gif

今度は、無料登録でキャッシュバックが受けられるCashBackForexに登録していた場合の計算をしてみましょう。

取引ブローカーによって、還元率が違いますが、
FXCM(1トレードあたり、0.7ピプス)の場合、
1トレードあたり、10.7ドル×0.7ピプス=7.49ドルのキャッシュバック。
取引総数が、853回ですので、7.49ドル×853回で、

キャッシュバック総額:約6389ドル

差し引き、約3807ドルの利益で、右肩上がり、
動かせば動かすだけ資産が増えていきます。

ごく単純計算で、100万円の資産から、5ヶ月で26万円の損失を出すEAが38万円の利益を出すEAになったということです^^
普通に利益を出すEAなら、更に利益増です。

まだ、登録されていない方は、すぐ登録されることを強くお勧めいたします。

CashBackForex無料登録方法

CashBackForexトップページ

上のページにジャンプ後、メニューバーの【Signup】をクリック。

  • First Name(名前)
  • Last Name(苗字)
  • Username(ニックネーム)
  • Password(パスワード)
  • Confirm Password(パスワード再入力)
  • Preferred Broker(使いたいブローカー)
  • Email Address(メールアドレス)

を入力し、Accept Terms of Use(利用規約への同意)にチェックします。

Registerボタンをクリックして登録完了です^^

日本語ページがないようですので、分からない部分はGoogle翻訳などで、しらべながら見てみましょう^^;

ブローカーによって既存の口座を登録できる場合や、新規で口座を開設する必要がある場合があります。
無料で将来の利益の増減が変わるのであれば、1回の手続きはそれほど手間ではないですよね^^

でわこのへんで。

cbf_letters_logo11.gif


VQをEA内で計算する方法

$
0
0

のやり方でいきますと、

extern   bool     Crash = false;
extern   int      TimeFrame = 0;
extern   int      Length = 5;
extern   int      Method = 3;
extern   int      Smoothing = 1;
extern   int      Filter = 5;
extern   int      SignShift = 1;

として、VQからコピペ&SignShiftというパラメータを追加。
そして、Start()関数内で

int sign;
sign = iCustom(NULL, TimeFrame, "VQ", Crash, 0, Length, Method, Smoothing, Filter, 6, SignShift );

とすれば、買い状態の時は、sign が1、売り状態の時は、sign が-1となり、あとは条件をいろいろと加えるだけですね^^

でも、VQ自体にいろいろな機能が付いているため、EA内で計算したほうが稼動がスムーズです。

VQを内部で計算したEAのコード

extern string  Entry_Setting  = "---------- Entry Setting";
extern double  Lots           = 0.1;
extern int     StopLoss       = 50;
extern int     TakeProfit     = 100;
extern int     Slippage       = 3;
extern int     MagicNumber    = 123456;

extern string Indicator_Setting = "---------- Indicator Setting";
extern int     TimeFrame      = 0;
extern int     Length         = 5;
extern int     Method         = 3;
extern int     Smoothing      = 1;
extern int     Filter         = 5;

extern int     EntryShift     = 1;
extern int     ExitShift      = 0;

//記憶用共通変数
int VQsign[2];    //VQのシグナル
int VQsignbar[2]; //VQのシグナルが出た場所(足の番号)
int bar;          //エントリした時の足の数(足の番号)

int init()
  {
//----
   ArrayInitialize(VQsign,0);
   ArrayInitialize(VQsignbar,0);
   bar=0;
//----
   return(0);
  }

int start()
  {
//----
   //VQ sign計算************
   FuncVQ(0);
   FuncVQ(1);
   
   //オーダーに関する部分******
   
   //現在のポジションの情報を取得
   int pos=-1;
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      OrderSelect(i,SELECT_BY_POS);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) pos=i;
   }
   
   /*
   この時点でポジションなしの場合 pos は -1
   ポジションありの場合 pos は、そのポジションのインデックスの値
   となります。
   */
   
   //ポジション有りの場合
   if(pos>=0)
   {
      //そのポジションを選択し情報を取得できるようにする
      OrderSelect(pos,SELECT_BY_POS);
      
      if((OrderType()==OP_BUY && VQsign[ExitShift]==-1) || (OrderType()==OP_SELL && VQsign[ExitShift]==1))
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Yellow);
   }
   
   int ticket=0;   //注文番号を代入する変数
   double sl,tp;   //ストップとリミットを代入する変数
   
   //まだエントリしていない足で ポジションなしの場合
   if(bar!=iBars(NULL,TimeFrame) && pos<0)
   {
      //エントリ条件を計算
      int sign;
      if(VQsignbar[EntryShift]==iBars(NULL,TimeFrame)-EntryShift)
      {
         if(VQsign[EntryShift]==1) sign=1;
         if(VQsign[EntryShift]==-1) sign=-1;
      }
      
      //sign が 1 の場合
      if(sign==1)
      {
         sl=Ask-StopLoss*Point;
         if(StopLoss<=0) sl=0;
         tp=Ask+TakeProfit*Point;
         if(TakeProfit<=0) tp=0;
         ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, sl, tp, NULL, MagicNumber, 0, Blue);
      }
      //sign が -1 の場合
      if(sign==-1)
      {
         sl=Bid+StopLoss*Point;
         if(StopLoss<=0) sl=0;
         tp=Bid-TakeProfit*Point;
         if(TakeProfit<=0) tp=0;
         ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, sl, tp, NULL, MagicNumber, 0, Red);
      }
      //エントリした時の足の数を代入
      if(ticket>0) bar=iBars(NULL,TimeFrame);
   }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

//VQ keisan
void FuncVQ(int VQshift)
{
   double MH1,ML1,MO1,MC1,MCS1,VQ1,SumVQ1,SumVQ2;
   HideTestIndicators(true);

   if(MathAbs(VQsign[VQshift])!=1)
   {
      for(int j=0;j<iBars(NULL,TimeFrame);j++)
      {
         MH1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_HIGH,VQshift+j);
         ML1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_LOW,VQshift+j);
         MO1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_OPEN,VQshift+j);
         MC1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,VQshift+j);
         MCS1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,VQshift + Smoothing+j);
         
         if(MathMax(MH1 - ML1,MathMax(MH1 - MCS1,MCS1 - ML1))==0 ||(MH1 - ML1)==0) return(0);
   
         VQ1 = MathAbs(((MC1 - MCS1) / MathMax(MH1 - ML1,MathMax(MH1 - MCS1,MCS1 - ML1))
                         + (MC1 - MO1) / (MH1 - ML1)) * 0.5)
                        * ((MC1 - MCS1 + (MC1 - MO1)) * 0.5);
         SumVQ2 = iClose(NULL,TimeFrame,2+j);
         SumVQ1 = SumVQ2 + VQ1;
         if (Filter > 0) if (MathAbs(SumVQ1 - SumVQ2) < Filter * Point) SumVQ1 = SumVQ2;

         if(SumVQ1 > SumVQ2)
         {
            if(VQsign[VQshift]==-1) break;
            
            VQsign[VQshift]=1;
            VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift-j;
         }
         if(SumVQ1 < SumVQ2)
         {
            if(VQsign[VQshift]==1) break;
            
            VQsign[VQshift]=-1;
            VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift-j;
         }
      }
   }
   
   MH1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_HIGH,VQshift);
   ML1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_LOW,VQshift);
   MO1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_OPEN,VQshift);
   MC1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,VQshift);
   MCS1 = iMA(NULL,TimeFrame,Length,0,Method,PRICE_CLOSE,VQshift + Smoothing);
   
   if(MathMax(MH1 - ML1,MathMax(MH1 - MCS1,MCS1 - ML1))==0 ||(MH1 - ML1)==0) return(0);
   
   VQ1 = MathAbs(((MC1 - MCS1) / MathMax(MH1 - ML1,MathMax(MH1 - MCS1,MCS1 - ML1)) + (MC1 - MO1) / (MH1 - ML1)) * 0.5) * ((MC1 - MCS1 + (MC1 - MO1)) * 0.5);
   SumVQ2 = iClose(NULL,TimeFrame,2);
   SumVQ1 = SumVQ2 + VQ1;
   if (Filter > 0) if (MathAbs(SumVQ1 - SumVQ2) < Filter * Point) SumVQ1 = SumVQ2;

   if(SumVQ1 > SumVQ2 && VQsign[VQshift]==-1)
   {
      VQsign[VQshift]=1;
      VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift;
   }
   if(SumVQ1 < SumVQ2 && VQsign[VQshift]==1)
   {
      VQsign[VQshift]=-1;
      VQsignbar[VQshift]=iBars(NULL,TimeFrame)-VQshift;
   }
   if(VQshift==0 && SumVQ1 == SumVQ2)
   {
      VQsign[0]=VQsign[1];
      VQsignbar[0]=VQsignbar[1];
   }
   HideTestIndicators(false);
}

今回は詳しい説明は、省略です^^;

ソースファイルもアップしますので、いろいろと改良してみてくださいね!

→VQsimple.mq4ダウンロード

でわ、今回はこのへんでm(..)m

VQの関連記事

カスタムインジケータをEAにする方法の関連記事

MT5bata版をインストール

$
0
0

MT5(MetaTrader5)のベータ版が公開されました!

またワクワクどきどきがやってきました!

残念なことに、MT4のインディケータやEAは使えないのですが、
性能がグンとアップしているようです^^

付属のTetrisというEAを稼動させてみました。

mt5beta.jpg

MQL5の可能性を大いに感じました!

ダウンロードはこちらから→MQL4のフォーラム

でわでわ^^

MQL4からMQL5への移植(その1)

$
0
0

MT5(MetaTrader5)のメタエディタをいじって気が付いたこと。

EAなどから呼び出す、テクニカルインディケータの関数(iMAなど)の使い方が
大きく違いますね^^;

MT4では、iMA(平均線のパラメータ,何本前の足か)と入力すれば、
知りたい平均線の値が呼び出せましたがMT5では、
iMA(~~)の固有のハンドル(変数)をつくって、
さらに、データを入れる配列をつくって、
そのなかにデータをコピーして、
どのデータを知りたいか選択してやっと呼び出せます^^;

作業が、4~5倍になった感じです。
(使いこなせば、処理のパフォーマンスは上がると思いますが^^;)

多くのEAをMT5に移植する場合、1つ1つのEAを
MQL5の形にするのはとても大変です。

そこで、便利なのがインクルード機能です。

#include <MQL4toMQL5_TechnicalIndicators.mqh>

といった感じにEAの頭の部分に書くと、includeフォルダにある 【MQL4toMQL5_TechnicalIndicators.mqh】を
そのEAの中に書いたことにしてくれます^^

includeフォルダのサブフォルダMQL4toMQL5の中にある場合は、

#include <MQL4toMQL5/mql4to5_timeseries_array.mqh>

です^^ 2009.10.21 内容を修正しました。

mqhファイルの保存場所はとあるMetaTraderの備忘秘録さんが、説明されております^^

今回は、MQL4でiMA(~)と書いていたものを、iMA4(~)と書き換えるだけで、 大丈夫なようにした、mqhファイルを作りました。
サンプルのEA(ただ、値を表示するだけのモノ)もあります。
よかったらダウンロードしてくださいね^^

リファレンスと、MetaEditorの書式が違ったりとまだまだ未完成な部分がたくさんあるようですが、
いまのうちから、移植準備をしておきましょうね^^;

ダウンロードはこちらから→MQL4toMQL5.zip

そのサンプルEA→mt4_tech_sample_ea.zip

2009.10.24 サンプルEA更新

でわでわ^^

MQL4からMQL5への移植(その2)

$
0
0

前回【MQL4からMQL5への移植(その1)】のつづきです^^

MT4では、BidやBarsといった変数には自動的にその値が入っていましたが、
MT5では、SymbolInfoDouble(_Symbol,SYMBOL_BID)や
Bars(_Symbol,PERIOD_CURRENT)といった感じに関数で呼び出さなくてはなりません。

Close[1]やHigh[0]といった配列にいたっては、
データを入れる配列をつくって、
そのなかにデータをコピーして、
どのデータを知りたいか選択してやっと呼び出せます^^;

そのうえ、MT4のように1本前の足の高値をHigh[1]といったように、
シフトの数で指定するようにする場合は、
ArraySetAsSeries(...)という関数を使って『最新の足を0として数えますよ』と
書いておかないといけません。

例えば、ArraySetAsSeries(Open,true)を書き忘れてしまっていて、
MT4のように、最新の足の始値を取得しようとOpen[0]と書いたら、
最古の始値を取得しちゃいます^^;

慣れるまで大変ですので、頭に

#include <mql4to5_timeseries_array.mqh>

と、start()に替わるOnTick()(EAの場合)の中の最初に

   CopyCurrent();

を、書き込むだけでよいインクルードファイルを作りました^^

今回は、前回よりも書き換え手順が楽ですね^^

ダウンロードはこちらから→mql4to5_timeseries_array.zip

そのサンプルEA→timeseries_sample1.zip

でわでわ^^

MQL4からMQL5への移植の関連記事

複数のシグナル・複数のフィルタを搭載し選択できるEA

$
0
0

今回のテーマは、EAの中で複数のシグナル・複数のフィルタを搭載し、
それを使うかどうかパラメータで選択できるようにする方法です。

サンプルファイルはこちら→Sample_SwitchSignal.zip
(↑'10.01.22 午前 一部修正)

Start()関数の中身は上から、

  • シグナル計算2つ
  • フィルタ計算3つ
  • エントリシグナル計算
  • エグジットシグナル計算
  • ポジション確認
  • エグジット処理
  • エントリ処理

という感じです。

シグナルが2種類、フィルタが3種類あり、
それぞれどれを使うか[Use~]というパラメータで選択できるようにしています。

シグナル計算やフィルタ計算はそれぞれ[~sign]や[~filter]といった
個別の変数に計算結果を代入します。

そして、サンプルファイル132行目~140行目を見てください。

   int sign;
   
   if((!UseMaCrossSignal || MaCrossSign==1) &&
      (!UseMacdCrossSignal || MacdSign==1) &&
      (!UseMaTrendFilter || MaFilter==1) &&
      (!UseAdxFilter || AdxFilter) &&
      (!UseAtrFilter || AtrFilter)) sign=1;
      
   if((!UseMaCrossSignal || MaCrossSign==-1) &&
      (!UseMacdCrossSignal || MacdSign==-1) &&
      (!UseMaTrendFilter || MaFilter==-1) &&
      (!UseAdxFilter || AdxFilter) &&
      (!UseAtrFilter || AtrFilter)) sign=-1;

エントリ用のシグナルを代入する整数変数 sign を宣言。
もし、
UseMaCrossSignal が false または、MaCrossSign が1で
UseMacdCrossSignal が false または、MacdSign が1で
UseMaTrendFilter が false または、MaFilter が1で
UseAdxFilter が false または、AdxFilter が true で
UseAtrFilter が false または、AtrFilter が true の場合、
signに1を代入
もし、
UseMaCrossSignal が false ・・・(省略)
・・・の場合、
signに-1を代入

といった感じにします。

これで、選択されたシグナルやフィルタのみを使ったシグナルが
sign に入ります^^

フィルタのシグナル用の変数でtrue/falseのbool型の場合は、
外でif文で書いてもいいですね^^

その下のエグジット用のシグナルの条件では
サンプルではフィルタ用の条件は含めてませんが、
書き方としては、同じ感じですね^^

そのほかで、ちょっと分かりづらいところがありますが^^;
コメントで質問してくださいね^^;

でわ、このへんで^^

決まった時刻に残高情報をメールするインジケータ

$
0
0

今回は、毎日決まった時刻に残高情報ををメールするといったインディケータです。
また、残高変動がなかったらメールしないという条件も加えます。

サンプルファイルはこちら→Sample_AccountBalanceCheckMail.zip

中身の解説等は、また後日じっくり書きます^^;

この記事を編集するか、改めて記事を書くかは未定ですm(_ _;)m

もし、ファイルの中身を見て疑問に思ったりした場合は、
質問してくださいね^^;

でわ、このへんで^^

和訳MQL言語リファレンス(日本語翻訳)

$
0
0

今回のテーマは、MetaEditor(メタエディタ)でEAを作成・編集中に参照する
MQL言語リファレンスについてです。

メタエディタでMQLリファレンスを参照するには、

  • NavigatorウィンドウのDictionaryタブで選択
  • ToolboxウィンドウのHelpタブで選択
  • EA内の調べる語句をダブルクリックしてF1ボタン

などがありますが、
英語で説明されていて、よく解らなかったりします^^;

そんな時は、Google検索などで
使い方を調べる旅にでることになります^^;

和訳MQLリファレンスがあったらいいなぁ・・・
と思っていましたが!!

ありました!
メタシス・シーカーのMQL言語リファレンスの日本語翻訳マニュアル
ほとんどの部分が翻訳されています^^

さらに、メタエディタで参照できるようにしたいと思い、
サイトオーナーのMIYAさんに翻訳部分を使わせていただけるようお願いしたところ

サイトお手軽参照システム?についても歓迎です。
ゼロサムゲームの厳しい世界で、矛盾したことを言いますが、
システムトレードで人々に幸せを与えれるお手伝いになるのであれば歓迎です。

と、ありがたいお言葉を頂きました^^

メタエディタで和訳MQL言語リファレンスを参照できるようにする方法

→metaeditor.zipをダウンロード

metaeditor.zipを解凍し、中のmetaeditor.xmlを
MT4フォルダ内のlanguagesフォルダに保存します。(上書きで構いません^^;)

メタエディタを開いていた場合は、再起動させてください。

メタエディタのToolboxのHelpタブで、【和訳リファレンス】という項目をクリックすると
web上の和訳リファレンスを参照できます^^
リファレンスのトップに戻るときは、ToolboxのHomeボタンで戻ってください。

今後、バージョンアップする可能性ありです^^;

でわ、このへんで^^

和訳MQL言語リファレンスの関連記事


EAの休止時間をcsvファイルで指定する方法

$
0
0

今回のテーマは、csvファイル等で指定した時間の前後は
取引をしないようにする方法です。

サンプルファイルはこちら→Sample_NoTradeTime.zip

2つのmq4ファイルと、2つのcsvファイルがありますが、
2つの対になっていて、それぞれやり方が違っています^^

どのように違うかは、
・・・^^;

また、次の機会に書きますm(_ _;)m

通常稼動で使う場合は、csvファイルをMT4→experts→filesフォルダに保存してください。
バックテストで使う場合は、MT4→tester→filesフォルダに保存してください。

でわ、このへんで^^

和訳MQL言語リファレンス(日本語翻訳)(その2)

$
0
0

今回は前回和訳MQL言語リファレンス(日本語翻訳)で紹介したファイルの改良版です^^

→metaeditor2.zipをダウンロード

前回の記事で

語句をマークして、F1でリファレンスを見ているのですが
今回は、それはできないようなので、
これができるように、是非とも改良をお願いします!!

といったコメントを頂きましたので、
語句を選択してF1ボタンを押したら和訳のページを表示するようにしました。

ファイルの保存先等は、前回の記事を参考にしてください^^;

でわ、このへんで^^

和訳MQL言語リファレンスの関連記事

FXDDの8%入金ボーナスでEAプレゼント

$
0
0

FXDDの8%入金ボーナス
に新規口座開設で参加された方で、

お問い合わせフォーム
に、お名前・メールアドレスをご記入の上
参加口座のアカウントIDと特典EA希望とご記入頂いた方全員に
EAプレゼントいたします!!

EAは、レンジ相場に有効なあの手法です^^

是非、ご参加ください^^

でわ、このへんで^^

EA Sample_NoTrade_ReadFile.mq4の解説

$
0
0

今回のテーマは、

EAの休止時間をcsvファイルで指定する方法

で紹介したサンプルEAファイルの説明です。

→Sample_NoTrade_ReadFile.mq4とNoTradeTime.csvをダウンロード

Sample_NoTrade_ReadFile.mq4の解説

まずは、『NoTradeTime.csv』ファイルを見てみましょう。

2010.02.18 01:30
2010.02.18 03:00
2010.02.18 04:30

というように、『yyyy.mm.dd hh.mm』の日付フォーマットで、
トレードしない時間が入力してあります。

『Sample_NoTrade_ReadFile』は、
この時間データを読み取り、その前後の何分間は、
No Trade Time Zone
とチャート上に表示させるようになっています。

早速、メタエディタでSample_NoTrade_ReadFile.mq4の中身を見てみましょう^^

パラメータ

extern int     NoTradeBeforeMin  = 20;
extern int     NoTradeAfterMin   = 30;
extern string  NoTradeFileName   = "NoTradeTime.csv";
NoTradeBeforeMin ・・・ 指定時間の何分前からかを指定
NoTradeAfterMin  ・・・ 指定時間の何分後までかを指定
NoTradeFileName  ・・・ データのファイル名を指定

です。

そして、記憶用変数(グローバル変数)で

int BeforSecond;
int AfterSecond;

パラメータ『NoTradeBeforeMin』と『NoTradeAfterMin』の
『分指定』を『秒指定』に変換したものを格納しておく変数です。

その下に、どの関数からも共通で使える変数(グローバル変数)で

datetime LastNoTradeData;
datetime NextNoTradeData;

『LastNoTradeData』は、
csvファイルで指定した時間データのうち、
過去のもので現在の時間に一番近い時間データを格納しておく変数です。

『NextNoTradeData』は、
csvファイルで指定した時間データのうち、
未来のもので現在の時間に一番近い時間データを格納しておく変数です。

その下に、

bool NoData;
datetime Now;

『NoData』は、
もうcsvファイルの指定時間をチェックする必要がなくなったら、
NoDataをtrueにして、ファイルを開かないようにするための変数です。

『Now』は、
現在の時間データを代入する変数です。

次は、EA開始時に1度だけ実行されるinit()関数です。

int init()
{
   BeforSecond = NoTradeBeforeMin * 60;
   AfterSecond = NoTradeAfterMin  * 60;
   
   LastNoTradeData = -1;
   NextNoTradeData = -1;
   
   NoData = false;
   return(0);
}

『BeforSecond』『AfterSecond』に、
パラメータ『NoTradeBeforeMin』『NoTradeAfterMin』の、
秒に換算したものを代入します。

今後、時間の比較を、秒単位で進行する時間データで行うためです。

パラメータ『NoTradeBeforeMin』『NoTradeAfterMin』の役割は、
ここで終了し、もう使いません^^;

『LastNoTradeData』『NextNoTradeData』に、マイナス値を入します。
これらの変数にマイナス値が入っている場合は、
それに対応するデータが空っぽというルールにするためです。

『NoData』にfalseを代入しておきます。

ここで、グローバル変数の宣言部分に初期値を代入しておくのと、
init()関数内で値を代入するのでは、若干動作が違います。

グローバル変数は、記憶力を持った変数で、
EAをチャートから外したときに、はじめて格納されている値がなくなります。

もし、仮に『NoData』を、
グローバル変数宣言
bool NoData = false;
として、init()関数ではfalseを代入しなかった場合、
EA稼動中、NoDataがtrueになったあと、 csvファイルの時間データを更新して、 再読込させようと、EAのパラメータ等を入力するプロパティウィンドウを開き、 OKボタンで再スタートさせたとします。
しかし、EAは前回稼動していたグローバル変数の値が残っていますので、 NoDataがtrueのままで、csvファイルを読まないようになってしまいます。

そうならないためにも、init()関数の中で
稼動開始時にグローバル変数に入っていて欲しい値を代入しておきます。

次に、ティック毎に実行されるstart()関数です。

int start()
{
   Now = TimeCurrent();

一番最初に、『Now』に現在の時間データ(時刻1秒ごとに付けられている整数)を代入しておきます。

次に、

   if(Now >= NextNoTradeData && !NoData) SetNoTradeData();

として、

もし現在の時間が、前回記憶していた『未来の直近の時間データ』に到達し、
かつ、まだファイルをチェックする必要がある場合は、
 SetNoTradeData()関数を実行する。

という意味です。
SetNoTradeData()関数では、時間指定のcsvファイルを開いて、
『LastNoTradeData』『NextNoTradeData』『NoData』に
それぞれの値を代入する関数として、start()関数の下に作ってあります。
後で、見てみましょう。

次に、

   static datetime PrintData;
   if(NextNoTradeData > 0 && NextNoTradeData != PrintData)
   {
      Print("No Trade: ", TimeToStr(NextNoTradeData - BeforSecond, 
                 TIME_DATE | TIME_MINUTES), " - ",
                          TimeToStr(NextNoTradeData, 
                 TIME_DATE | TIME_MINUTES), " - ",
                          TimeToStr(NextNoTradeData+AfterSecond, 
                 TIME_DATE | TIME_MINUTES));
      PrintData = NextNoTradeData;
   }

として、

記憶用変数『PrintData』を宣言。
もし、『NextNoTradeData』に指定時間が入っていて、その値が『PrintData』と違う場合、
 『No Trade: 取引停止開始時刻 - 取引停止指定時刻 - 取引停止終了時刻』を出力。
 『PrintData』に『NextNoTradeData』の値を代入。

という意味です。
新しく『未来の直近の時間データ』になった場合は、
1度、操作履歴にその時刻と停止開始・終了時刻を出力するということです。

次に、

   if(IsNoTradeTime()) return(0);
IsNoTradeTime()関数がtrueを返したら、ここで実行終了。

という意味です。

IsNoTradeTime()関数は、それぞれの時間データから
現在取引停止の時間かどうかを判断し、停止の時間の場合、
チャート上に『No Trade Time Zone』と表示させ、trueを返します。
そうでない場合は、falseを返します。後で、見てみましょう。

そして、return(0)で実行終了とならなかった場合は、次の

   Comment("Trade Time Zone");

チャート上に『Trade Time Zone』と表示させます。

これで、start()関数は終了ですね。

つぎは、SetNoTradeData()関数とIsNoTradeTime()を見ていきます^0^

つづく^^

csvファイルで指定した時間にEAを休止させるインジケータ

$
0
0

EAの休止時間をcsvファイルで指定する方法

で紹介したEAで、稼働中のすべてのEAを休止状態にしたいというお問い合わせがありました。
確か・・・
faiさんが以前に・・・
http://d.hatena.ne.jp/fai_fx/20091201/1259610071

同じ感じですが、一応インジケータを作りました^^; ファイルはこちら→NoTrade_ReadFile_Ind.zip

インジケータですので、experts→indicatorsフォルダに保存してくださいね。

faiさんがおっしゃっているように、
エントリ後に、ストップ値変更でストップを入れるEAを稼動させている場合は、
決済(ストップ設定)用のEAが必要になります。

実際に使用される場合は、十分動作確認をしてから使用してください^^;
パラメータ『SwitchEAs』をfalseにした場合は、EA休止機能が無効になり、テキスト表示だけになります。
でわでわ^^

MQL4セミナー開催のお知らせ

$
0
0

【MQLセミナー】

日にち:2012年2月11日(土・祝)
時間: 13:00 ~ 17:45

セミナー会場:東京都墨田区錦糸町周辺

募集人数:20名
(先着順となりますので、お早めにご連絡ください。)

セミナー内容: これからMQLプログラミングを習得する方のための入門編から
高度なEAを作成するための応用編までです。
(EA作成のセミナーです。インジケータ作成の内容は含まれておりません。)

【懇親会】

同日 18:30~20:30 懇親会開催

両方参加でも、どちらか片方でもOKです^^

日中は都合が都合が悪くセミナーに参加できない方でも、夜の懇親会にご参加いただけます。
また、セミナーのお申し込みを頂いた方は、当日不参加であっても特典は得られます。
特典のみ欲しい方は、お申し込み時にセミナー不参加というご連絡をください。

お申し込みページ
→EA作成マスターセミナー お申し込み

MQL4セミナーDVD発売のお知らせ

$
0
0

【EA作成パーフェクトマスタースクール】

2012年2月11日に開催したセミナーで、場所・時間の都合上、参加できなかった方のために
セミナーDVDを販売することになりました!

お申し込みページ
→EA作成パーフェクトマスタースクール DVDお申し込み

実際にEAを編集しながら説明しておりますので、
EA編集スキルアップに是非ご活用ください^^


EA作成ノウハウ本

$
0
0

MetaTrader 4で始める FX自動売買システム作成の教科書

EA作成ノウハウ本【MetaTrader 4で始める FX自動売買システム作成の教科書】
2013年3月15日発売決定!

MetaTrader 4で始める FX自動売買システム作成の教科書
MetaTrader 4で始める FX自動売買システム作成の教科書(amazon.co.jp)

著者紹介

●星野 慶次(ほしの けいじ)
1977年生まれ。2007年にFX投資を始める。MetaTrader 4のEAによる自動売買を知り、MQLを習得。EA作成プログラミングに関するブログを開始。2008年にEA作成代行会社を設立。2009年にEA作成セミナーを名古屋で開催。EA作成代行サイト「Dr.EA」を公開。EA開発チーム「Project V Japan」結成。2012年、「MQLアカデミー」のメイン講師として活動開始。

EA作成ノウハウ本について

こんにちわ!
星野慶次です^^

大変長らくお待たせ致しましたm(_ _;)m
ブログ読者さんからのメッセージやメールで、『EA作成の本は出さないの?』とか『早く小学生でも解るようなEA作成方法についての本を出してください』とのお声を頂き続け、ようやくご期待にお応えできるEA作成入門書を出版させて頂くことができました^^

EAについて

『EAってなに?』という方の為に、少し説明します。
EAとは、Expert Advisor(エキスパートアドバイザー)の略で、自動売買をするソフトです。 MetaTrader(メタトレーダー)というFXなどの取引をするプラットフォーム上で動作します。

EAを作成・編集することができるようになると、FXトレード手法のちょっとしたアイデアをEA化して、バックテストで過去の成績をすぐに調べることができるようになります。
また、無料EAをダウンロードして、より良い成績を出すEAにカスタマイズすることができます。
さらに、優秀なEAが出来上がったら、リアルタイムチャートで稼動させて、24時間自動売買してくれます。
もうPC画面の前にずっと座っている必要が無くなります^^

対象:プログラミング未経験者~

プログラミングをしたことがない方でも、楽しくMetaTrader4(MT4)のEA作成方法をマスターできるようにできるだけ分かりやすくしていますので、無理なくEA作成方法(MQL4プログラミング)を習得できます。

実は私、
・・・
数年前までプログラミング、ド素人でした(汗)

しかし今では、自由自在にEA作成ができるようになり、年間300を超えるEA・インジケータの作成・編集をするプロとして、セミナーやウェブ上でEA作成方法を教えられるまでになりました。

こんな私だからこそ、プログラミング未経験者にも分かるように、EA作成のノウハウをお伝えすることができるのです(^^)v

お住まいの最寄の書店で、一度手に取り内容を確認してみてくださいm(_ _)m

→MetaTrader 4で始める FX自動売買システム作成の教科書(amazon.co.jp)

→【電子書籍】MetaTrader 4で始める FX自動売買システム作成の教科書(PuBooks)

シグナル系カスタムインジケーターで自動売買するEA

$
0
0

すごいシグナルインジケータがあるんです!


Aさん:
す、すごいシグナルがあるんです!矢印で売買タイミングを知らせてくれるカスタムインジケータでトレードしているんですが、最近の利益がハンパないんです!
トレーリング機能と時間指定機能つきでバックテスト可能なEAの作成を頼んだ場合、いくらになりますか??

慶次:
新規EA作成と各機能、合計●万円になります。

Aさん:
えええぇぇぇ・・・orz

こんにちわ!
上記のようなやりとり、たまにあります^^;

矢印やドットなどのマークで売買タイミングをお知らせしてくれるカスタムインジケータで、バックテストやフォワードテストをしてみたいと思うときってありますよね?

そんなときは、iCustom()関数でシグナル発生を感知して自動売買をするEAを作成します。でも、EAの作り方がわからない場合は、できる人やEA作成代行業者に頼むことになります。
そこで・・・

シグナルインジケータ用のEAを作成しました!

パラメータで、カスタムインジケータ名を指定して各設定をするだけで、そのシグナルインジケータでのバックテスト・フォワードテストが可能なEAを作成しました。

→ダウンロードはこちら

使用できるインジケータの条件として、矢印やドットなどのマークで描画されるシグナル系のインジケータということが大前提です。その他、オブジェクトでの描画ではないことや、リペイントしないこと(リペイントについて理解されている方はOK)などの条件があります。

パラメータ説明

------Main Setting------
Lotsロット数
TakeProfitリミットのPIPS数 0の場合リミットなし
StopLossストップロスのPIPS数 0の場合ストップロスなし
TrailingStopトレーリングのPIPS数 0の場合トレーリングなし
Slippage許容スリッページ
MagicNumberマジックナンバー
------Entry Time Setting------
UseTradeTime時間指定機能使用スイッチ
Trade_StartHourトレード許可開始時間
Trade_StartMinuteトレード許可開始分
Trade_EndHourトレード許可終了時間
Trade_EndMinuteトレード許可終了分
------Signal Setting------
CustomIndicatorName使用するカスタムインジケータ名
BuyEntrySignalIndex買いエントリシグナルの番号
BuyEntrySignalShift買いエントリシグナルのシフト数
SellEntrySignalIndex売りエントリシグナルの番号
SellEntrySignalShift売りエントリシグナルのシフト数
BuyExitSignalIndex買いポジション決済シグナルの番号
BuyExitSignalShift買いポジション決済シグナルのシフト数
SellExitSignalIndex売りポジション決済シグナルの番号
SellExitSignalShift売りポジション決済シグナルのシフト数
------Parameter of Singal Indicator Setting------
Para1カスタムインジケータのパラメータ1つ目
Para2カスタムインジケータのパラメータ2つ目
Para3カスタムインジケータのパラメータ3つ目
:
Para20カスタムインジケータのパラメータ20個目

TakeProfit・StopLoss・TrailingStopで、使用しない機能は0以下の数値を指定します。

BuyEntrySignalIndex・SellEntrySignalIndex・BuyExitSignalIndex・SellExitSignalIndexで使用しないシグナルはマイナスの数値を指定します。

シフト数とは、何本前のローソク足の位置に表示されていたらシグナルとみなすという本数を指定します。0を指定した場合は、現在変動中のローソク足の位置に表示された場合にシグナル発生とみなします。

カスタムインジケータのパラメータは、1つ目から順番に指定していきます。カスタムインジケータのパラメータ数が20個未満の場合、指定するパラメータが余りますが、余った分は無視してください。
(例えば、カスタムインジケータのパラメータ数が5つの場合は、Para6~Para20を無視します)

カスタムインジケータのパラメータのうち、文字列で指定する場合で、トレードに影響するパラメータの場合は、その部分の「extern double」を「extern string」にして、「= 0;」を「= "";」としてコンパイルしてください。

シグナルの番号とは?

カスタムインジケータのシグナルには、0から始まる番号が割り振ってあります。
その番号を調べるには、チャートにそのインジケータをアタッチしたときに出るダイアログの【色の設定】タブをクリックして対応するシグナルの色の#の番号を見ます。色だけでは識別できない場合は、幅を変更してチャートに表示させ、大きさが変わったものを見て識別します。

いろいろと試してみてくださいね^^
でわでわ^^

カスタムインジケータをEAにする方法の関連記事

MetaTrader 4 IEDのbeta版について

$
0
0

こんにちわ!
メルマガ、再開しました!

再開第1号は、以下のような内容です。


最近、MetaTrader 4 の仕様変更スピードがあがってきているように感じます。

これからもっと、大きな変更がありそうです。

重要そうな記事を訳してみますので、間違っていたら連絡ください^^;


■記事URL
http://forum.mql4.com/57476

------------------------------------------------------------------------
新しいMQL4コンパイラとエディタを含むメタトレーダー4 IDE(統合開発環境)のベータ版
------------------------------------------------------------------------

メタクォーツ社 2013.08.26 14:12


次のトピックの続き:

・今後のメタトレーダー4とMQL4のアップグレード - 大きな変更が進行中(MQL4フォーラム)
→http://forum.mql4.com/56885

・興味深いニュース:今後のメタトレーダー4とMQL4のアップグレード - 大きな変更が進行中(MQL5フォーラム)
→http://www.mql5.com/en/forum/13116


メタトレーダー4/MQL4とメタトレーダー5/MQL5に共通のIDEのベータ版を、以下に添付します。
これは、みんなの情報のための暫定版です。


旧MQL4バージョンとの違い:

・AND/OR理論演算の優先順位を変更しました。現在、すべてが標準C/C++に似ています。

・論理式の短縮評価を導入しました。現在、論理式がその最後に到達する前に評価された場合、C/C++と同じように、後の残りの式は評価されません。

・現在、整数のみがswitch文で使われます。以前は、実数も使用することができました。

・.(ドット記号)は、もう変数名に使用することはできません。また、 @(アットマーク)、$(ドルマーク)、?(クェッションマーク)も変数名で使用することはできません。

・start()関数の必要条件を厳しくしました。以前は、start()関数にパラメータ(仮引数)を設定することができました。現在、init(), start(), deinit(), OnInit(), OnStart(), OnTick(), OnTimer() やその他のエントリーポイントは、それらのシグニチャに正確に一致する必要があります。

※その他のエントリーポイント
MQL5におけるOnTrade(), OnTradeTransaction()

※シグニチャ
関数名と関数の引数の型の並び方の組み合わせ

・キーワード(予約語)の拡張により、現在では、long, float, const, virtual, input, delete, new, do, char のような(変数・関数)名は使用することができません。

・現在、インポートされたDLLの関数は、MQL5と同じように、パラメータ(引数)としてMQLの文字列配列を受けとることはできません。

・定義済み変数 _Period, _Symbol, _LastError, _CriticalError, _StopFlag, _Point, _Digits, _UninitReason, _RandomSeed を取り入れました。これらは、既存のソースファイル内で同じ名前で宣言された単純変数と衝突するかもしれません。

・datetime型は、MQL5のように、8バイトのものになっています。


これらの違いは大したことはなく、コード内で容易に修正することができます。(これらの変更の)見返りに、私たちは多数のMQL5の機能、実行速度の向上、より厳密な優良性操作を手に入れます。

私たちは十分な意見を受け取り、開発者を準備するために、来月中に一般公開テストを実施するつもりです。

MQL5フォーラムでの話し合い:http://www.mql5.com/en/forum/13655

添付たzipファイルは、次のリンクからダウンロードできます:http://forum.mql4.com/c/forum/2013/08/MetaTrader4.Beta.IDE_1.zip


■編集後記

>・AND/OR理論演算の優先順位を変更しました。

if(条件A && 条件B || 条件C)

とすると、今のMT4のMetaEditorだと、
「条件Bまたは条件C」から判定するんですよね。。


>・論理式の短縮評価を導入しました。

if(条件A && 条件B && 条件C && ・・・)

というように&&が多くなるif文の場合、処理時間短縮のために

if(条件A) if(条件B) if(条件C) ・・・

なんてしてましたけど、その必要が無いということですね^^


>・定義済み変数 _Period, _Symbol, _LastError, _・・・

IEDのベータ版では、今のところ変数_Symbolを宣言すると

declaration of '_Symbol' hides predefined variable

といった警告が出て、変数が上書きされるようです。


これからの動き、目が離せませんね。

最後までお読み頂きありがとうございました!

メタトレ!メールマガジン
登録・解除: http://www.mag2.com/m/0000255713.html

ご意見・ご要望は、お問い合わせフォームからお願い致します。

でわでわ!

カスタムインジケータの値を出力するEA

$
0
0

iCustom()関数でカスタムインジケータを使ってEAを作る際、カスタムインジケータのラインインデックスが何番のものを使えばよいかは、インジケータ設定ダイアログの「色の設定」でなんとなくわかります。

下の図は、VQの「色の設定」タブで、#0(インデックス0番)の幅を最大にして表示させた状態のものです。

vq_index.png

色や幅で、下記の表の通りの番号になることがわかります。

0番Yellowライン
1番Green上昇ライン
2番Red下降ライン
3番Yellow↑矢印
4番Aqua↓矢印

使用する番号がわかったら、次にその番号がどのようになればシグナルとするかを知る必要があります。

CustomChecker_EAv2

パラメータIndicatorNameにカスタムインジケータ名を入力すれば、#0~#7までの3本前・2本前・1本前・現在の値をチャート上に出力してくれるEAです。

→CustomChecker_EAv2ダウンロード

下の図をみてください。

vq_index2.png

もし、現在の足の始値の時点で売りシグナル発生にしたい場合は、「4番のShift1がEMPTY_VALUEではない」という条件にすればよいですね。

   double vq4_1 = iCustom(NULL, 0, "VQ", ・・・, 4, 1);

   int sign = 0;
   if(vq4_1 != EMPTY_VALUE) sign = -1;

という感じです。

もし、矢印を使わず赤色ライン確定で売りシグナルにしたい場合はもう少し複雑になります。

   double vq2_1 = iCustom(NULL, 0, "VQ", ・・・, 2, 1);
   double vq2_2 = iCustom(NULL, 0, "VQ", ・・・, 2, 2);
   double vq2_3 = iCustom(NULL, 0, "VQ", ・・・, 2, 3);

   int sign = 0;
   if(vq2_3 == EMPTY_VALUE &&
      vq2_2 != EMPTY_VALUE &&
      vq2_1 != EMPTY_VALUE) sign = -1;

という感じです。

ラインの場合は矢印等とは違い、各バーの間の部分を直線でつないで表示するようになっています。

なので、上記売りシグナルの条件の意味は「3本前と2本前の間は表示なし、かつ、2本前と1本前の間は表示あり」ということになります。

複数のラインインデックスで1本のラインを描画するインジケータの場合で重なって表示している場合は、インデックスの大きいほうが優先して表示され小さいほうは後ろに隠れてしまうので注意してください。(VQの#0黄色ラインのように。)

カスタムインジケータをEAにする方法の関連記事

Build600以降の新MQL4

$
0
0


ビルド600からMQL4の仕様が大きく変わりました。
ビルド509以前のMT4はいずれ利用できなくなるので
新旧MQL4の変更点などを確認しておきましょう。


MQL4 ReferenceのUpdated MQL4の和訳


■MQL4の新機能

ビルド600からMQL4プログラミング言語は完全に改訂され、MQL5レベルに達しています。今あなたは統合されたメタエディタ・ライブラリー・デバッグツールを使用してMQL4/5で売買ロボットを開発することができます。

MQL4は、学習のしやすさとメタトレーダー4ターミナルを使用している何年もの間に生成されたコードが膨大な量のため、自動システムの開発者の間で人気があります。しかし、言語はその主な利点から生じるいくつかの欠点を持っています - 簡単なプログラミング言語は、複雑なシステムの開発を許可せず、また高レベル言語からデバッグライブラリの移植を妨げます。そのため、我々はそれにMQL5言語の関数を最大限実装して完全にMQL4の機能を維持することを決定しました。つまり、OOP(オブジェクト指向プログラミング)とネイティブコードコンパイラを含むすべての強力なMQL5機能は、MQL4で利用できるようになります。

これを達成するために、我々はMQL4とMQL5の両方の言語を自動的にサポートする統一されたコンパイラを開発しました。 メタエディターもメタトレーダー4とメタトレーダー5プラットフォーム用の両方の統一されたアプリケーションとなります。このように、いずれかのバージョンからMQL4とMQL5の両方をコンパイルすることが可能となります。MQL5ストレージも利用可能になります。

MQL4アプリケーションの保護は、MQL5レベルに上昇。新しいEX4/EX5ファイルは、重大かつ完全に改訂された保護を備えています。これは安全なEX4アプリケーションマーケットもメタトレーダー4で利用可能になることを意味しています。

また、MQL4は現在新しいグラフィカル・オブジェクトとチャートを操作するための新しい関数を備えています。MQL5標準ライブラリはMQL4に移植され、独自のグラフィカル・インターフェースと取引のライブラリを作成する際に新たな可能性を開発者に提供します。今あなたはリソースを使用してメタトレーダー4で本格的なアプリケーションを作成することができます。


■MQL4言語の変更点

新しいデータ型char, short, long, uchar, ushort, uint, ulong, doubleが追加された。これは他のC++のような言語からのコード転写を可能にします。様々な種類のデータが異なる速度で処理される。整数データが最も速く処理される。特別なコプロセッサは、倍精度浮動小数点数型を処理するために使用される。しかし、浮動小数点型の内部表示の複雑さにより整数よりも遅く処理される。型キャストも実装されている。

文字列は、以前はANSI形式(シングルバイト)であったが、現在、Unicode形式で表示されます。プログラムがDLLを使用し、それらに文字列変数を渡した場合、それは考慮されるべきである。

定義済みのボリュームの変数はlong型になりました。ボリュームにアクセスするための時系列もlong型の配列で構成されています。オーバーフローエラーを回避するために、古いMQL4プログラムではターゲットの型にこのタイプを持っているデータという明示的なキャストを使用することをお勧めします。

構造体、クラス、オブジェクトポインタ、void型、オブジェクトが自分自身への参照ができるthisキーワードが追加されました。次のようにすべてのオブジェクト指向プログラミングの標準がサポートされています。

・カプセル化およびタイプの拡張性
・継承(インヘリタンス)
・多相性(ポリモーフィズム)
・多重定義(オーバーロード)
・仮想関数
http://docs.mql4.com/basis/oop

OOPではクラスを使用してプログラムを開発することができます。これは、デバッグや大規模なアプリケーションの開発を容易にするだけでなく、継承(インヘリタンス)によって以前に生成されたコードを何度も再利用する機能を提供します。しかし、それは以前のように手続き指向のスタイルではMQL4コードが生成できないことを意味するものではありません。新しい機能を必要としない場合は、あなたが過去に行ったようにプログラムを開発することができます。

定義済みの関数init(), deinit(), start()は互換性のため残っていますが、現在 OnInit(), OnDeinit(), OnStart(), OnCalculate(), OnTick()が代わりに使用できます。また、新しい定義済みのハンドラ関数 OnTimer(), OnChartEvent(), OnTester()が実装されています。以前のMQL4では、定義済みの関数は任意のパラメータと任意の戻り値の型を持つことができ、シグネチャではなく名前で呼び出すことができた。新しいMQL4では、すべての定義済みの関数が厳密に呼び出し形式に対応する必要があります。言い換えれば、正確にパラメータや戻り値の型のセットを定義している必要があります。

現在、変数名は特殊文字とポイントを含めることはできず、新しいMQL4言語のキーワードは、名前として使用することはできません。古いMQL4プログラムは、コンパイラのメッセージを従いうことで簡単にすべてのそのようなエラーを補正するために新しいコンパイラで再コンパイルすることができます。

優先順位のルールは現在のC言語の標準と一致します。よくわからない場合は、明らかに信頼性を高めるために優先順位を示すため古いMQL4アプリに括弧を挿入することができます。

現在、すべての式が計算され、チェックが実行される古いMQL4のバージョンとは違って、短縮された条件チェックが論理演算に使用されている。下記のような論理「AND」を使用した2つの条件のチェックがあるとします。

if(condition1 && condition2)
{
// some block of statements
}

もし、式condition1がfalseの場合、「false && true」は依然として「false」に等しいので、式condition2の計算は行われません。

ArrayCopyRates()は動作が変更されました。double[][6]配列への仮想コピーの代わりに、現在はMqlRates[]配列への仮想コピーを実行します。double[][6]配列へのコピーは互換性のためそのまま残っていますが、そのコピーは実際であって仮想ではありません。

ファイル操作では、同時に開くことのできるファイル数は現在64に達しています。古いMQL4では32でした。最近まで、ファイルは常にFILE_SHARE_READまたはFILE_SHARE_WRITEモードで開かれていました。現在、必要なオープンモードが明示的に指定されている必要があります。

関数の働き、変数の有効範囲、ローカル配列のメモリ開放についても変更されました。変更数が大きいので、以前のアプローチでのMQL4プログラム開発との互換性を最大限提供するため、新しく「#property strict」プロパティーが導入されました。MQLウィザードを使用して新しいMQL4アプリケーションを作成する場合、このプロパティは常にテンプレートに追加されます。

下記のように、DateTime型の文字列表現は、コンパイルモードによって異なります。

datetime date=D'2014.03.05 15:46:58';
string str="mydate="+date;
//--- str="mydate=1394034418" - 旧コンパイラ/新コンパイラ #property strictなし
//--- str="mydate=2014.03.05 15:46:58" - 新コンパイラ #property strictあり

下記の表は、旧MQL4・新MQL4(strict指定なし)・新MQL4(strict指定あり)の違いを含んでいます。

※strict指定の仕方
#property strict

コンパイラーによる違いの表

1.は、旧MQL4について
2.は、新MQL4(strict指定なし)について
3.は、新MQL4(strict指定あり)について

1.init(), start(), deinit()のエントリポイントは任意のパラメータと任意の戻り値の型を持ってもよい
2.init(), start(), deinit()は、互換性の為そのまま残っているが、新たなOnInit(), OnStart(), OnCalculate(), OnTick(), OnTimer(), OnChartEvent(), OnTester(), OnDeinit()は厳密に呼び出し形式に対応している必要がある
3.同上

1.事実上(予約語を除く)任意の変数名には、特殊文字やポイントなどが可能である
2.変数名は特殊文字や点を持つことはできません。予約語のリストが拡張されました。そのため、short, long, constなどのような広範囲にわたる単語が名前として使用することができません
3.同上

1.変数の有効範囲は(ネストされたブロック内でも)宣言からその関数の終わりまで
2.同上
3.変数の有効範囲は宣言からその変数を宣言したブロックの終わりまで

1.(グローバルでもローカルでも)全ての変数が0に暗黙的に初期化される
2.同上
3.グローバル変数のみ初期化されます。ローカル変数では、文字列のみ暗黙的に初期化される

1.ローカル配列はその関数を終えても開放されません
2.ローカル配列はその関数を終えると開放されます
3.ローカル配列は{}のブロックを終えると開放されます

1.範囲外配列の参照はクリティカルエラーを起こしません
2.同上、構造体とクラスについては重要なエラーなので除きます
3.範囲外配列の参照はプログラム停止のクリティカルエラーを起こします

1.構造体とクラスはありません
2.構造体とクラスが存在する。追加のデータ型が実装されている
3.同上

1.文字列はシングルバイトです。datetime型は32ビットの整数です。定義済みのボリュームの変数はdouble型です
2.文字列はUnicodeです。datetime型は64ビットの整数です。定義済みのボリュームの変数はlong型です
3.同上

1.ArrayCopyRates()は、double[][6]配列への仮想コピーが行われる
2.ArrayCopyRates()はMqlRates[]配列への仮想コピーが行われる。double[][6]配列へのコピーは互換性のためそのまま残っていますが、そのコピーは実際であって仮想ではありません
3.同上

1.関数は型を持っていても値を返さなくてもよい。こうするため、return(0)が自動的に関数の最後にコンパイラによって挿入されている
2.同上
3.任意の型の関数は値を返す必要があります

1.同時オープンファイル数は32
2.同時オープンファイル数は64
3.同上

1.ファイルは常にFILE_SHARE_READまたはFILE_SHARE_WRITEモードで開かれる
2.FILE_SHARE_READおよび/またはFILE_SHARE_WRITEを明示的に指定する必要があります
3.同上

※範囲外配列のエラーに特別な注意を払ってください - 多くの古いカスタムインジケータはチャート上で起動した際、新コンパイラのstrictモードではこのエラーが表示されます。原因を見つけて、それを排除することをお勧めします。
※※新しいMQL4とMQL5では、FILE_SHARE_READとFILE_SHARE_WRITEフラグがファイル共有使用モードを担当しています。

■ファイル構造の変更点

メタトレーダー4クライアントターミナルのビルド509以前のビルドでは、下記のように全てのMQL4アプリケーションが<ターミナルインストールフォルダ>\experts\ルートディレクトリのサブディレクトリに格納されていました。

・\experts - エキパートアドバイザー (取引ロボット)
・\experts\indicators - カスタムインジケータ
・\experts\scripts - スクリプト (チャート上で1回実行されるMQL4アプリケーション)
・\include - 他のプログラムに実装する MQH と MQ4 ファイルのソースコード
・\libraries - MQ4形式のソースコードと、それらからコンパイルされたEX4形式の実行可能ファイルのライブラリ。これらは他のMQL4プログラムによってそこに含まれる関数の動的呼び出しのために使用される
・\files - 特別な「ファイルのサンドボックス」。MQL4アプリケーションでは、このディレクトリ内のみファイル操作を実行することが許可されています。

新しいMQL4バージョンでは、ソースコードを格納するためのファイル構造が変更されました。現在、すべてのMQL4のアプリケーションは<data_folder>\ MQL4\ディレクトリの適切なフォルダに配置する必要があります。

・\Experts - エキパートアドバイザー (取引ロボット)
・\Indicators - カスタムインジケータ
・\Scripts - スクリプト (チャート上で1回実行されるMQL4アプリケーション)
・\Include - 他のプログラムに実装する MQH と MQ4 ファイルのソースコード
・\Libraries - MQ4形式のソースコードと、それらからコンパイルされたEX4形式の実行可能ファイルのライブラリ。これらは他のMQL4プログラムによってそこに含まれる関数の動的呼び出しのために使用される
・\Images - リソースに使用するための画像ファイル
・\Files - 特別な「ファイルのサンドボックス」。MQL4アプリケーションでは、このディレクトリ内のみファイル操作を実行することが許可されています。

ビルド509からさらに新しいバージョンにメタトレーダー4ターミナルを更新する際に、以前のバージョンの標準のルートディレクトリにある全てのMQ4, MQH, EX4ファイルは自動的にコピーされ、適切なフォルダに再配置されます。ユーザーによって追加されたサブフォルダ及びそこに含まれるファイルは(コピー)処理されません。必要に応じてそれらを手動で新しい場所に再配置する必要があります。

どのファイルやフォルダも、更新時に削除されません!使用されているファイルのパスを含むすべてのファイルコピー操作は、更新中はターミナルの実行記録で固定されている。

古いEX4ファイルの新しいバージョンへの自動再コンパイルは更新中には実行されません。ユーザーは、どのソースコードを新しいEX4バージョンにコンパイルされるべきかを自由に決定できます。すべての古いEX4は、新たなメタトレーダー4ターミナルで動作します。新しいコンパイラでコンパイルEX4ライブラリはまた、新しいバージョンでコンパイルされているEX4プログラムから呼び出すことができます。新しいコンパイラでコンパイルされたEX4ライブラリは、新しいバージョンでコンパイルされているEX4プログラムからのみ呼び出すことができます。

いくつかのケースでは、ソースファイルで(相対パスが変更されている場合)#includeでインクルードされているファイルのパスを編集する必要があるかもしれません。メタエディタのルートディレクトリは現在<data_folder>\MQL4\であることに注意してください。すべてのプログラムは、正しいサブディレクトリに配置する必要があります。

お使いのコンピュータ上でメタトレーダー4ターミナルの各コピー用のデータフォルダ(<data_folder>)は、ターミナルまたはMetaEditorの「ファイル」→「データフォルダを開く」で見つけることができます。

Viewing all 55 articles
Browse latest View live