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

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


前回【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への移植の関連記事

タグ

2009年10月24日|コメント (41)

カテゴリー:MQL5

コメント (41)

はじめまして。
すばらしいブログいつも楽しみにしています。
こちらのブログで勉強させていただき、私も自作EAに挑戦し早1年、
ようやく使えそうなものが出来てきました。
しかし・・・
121証券のデモ口座でバックテストを重ねてきたのですが、
バックテストでは問題なくオーダーが出て、売買されるにもかかわらず、
ライブトレーディング(これもデモ口座です)でEAを走らせると
売買条件に一致しているにもかかわらず、ENTRY/EXITともに
全くオーダーがでないという現象となり困っております。
もちろんニコちゃんマークは笑っておりますし、
次の日に前日(でるべきところで出なかった日)のバックテストをしてみると、
バックテスト上では問題なく条件どおりのポイントで売買される結果となります。

お忙しいところ申し訳ありませんが、
何か御情報、もしくはアドバイスございましたら頂きたくお願い申し上げます。

投稿者:Dap |2009年10月24日 20:06

Dapさん

こんにちわ。
約定の問題かもしれません^^;
操作履歴にエラーメッセージなどは、
ございますでしょうか?

投稿者:慶次 |2009年10月25日 08:08

早速のコメントありがとうございます。
操作履歴ですが、この土日でMT4を一度閉じて(プログラム終了)しまったため、
問題となった木、金あたりの履歴が消えてしまいました。
まず操作履歴を確認するべきでしたね。
明日以降またEAをライブで走らせて確認してみます。
それまでに"約定の問題"について自分なりに調べて見たいと思いますが、
たとえばどのような問題だとご推測されるでしょうか。
対応としてはSlippage(現状は3)の設定調整等でしょうか。
お忙しいところ申し訳ありません。

投稿者:Dap |2009年10月25日 11:01

Dapさん

操作履歴は、MT4フォルダ内のlogsフォルダ、
Experts履歴は、Expertsフォルダ内のlogsフォルダで
確認できますよ^^

投稿者:慶次 |2009年10月25日 11:10

ご回答ありがとうございます。
お恥ずかしい・・・確かにlogは残っておりますね。
調べた結果、別のEAがENTRY/EXITともに先回りしていたようです。
このEAは本来使いたいEA(今回不具合かと思っていたEA)を元に
売買部分をコメントアウトしてインジケータとして使うようにしていたつもりで
影響はないと思っていたのですが、処理が不完全であったのかもしれません。
もう少し調べてみます。
とりあえず、今回使いたいEA以外は削除して明日以降再度試してみます。

行き詰った状態から慶次さんの一言で光が見えてきました。
本当にありがとうございます。

投稿者:Dap |2009年10月25日 12:33

Dapさん

logsファイルは、気づき難いですよね^^;
EAごとにマジックナンバーを違うものにすることで、
解決できるかもです^^;

投稿者:慶次 |2009年10月25日 12:46

はじめまして、いつも拝見させて頂いている、”これから”というものです。
C言語を独学で勉強し、MQL4も独学で勉強してやっとまともなEAができるようになって
きたのにMQL5・・・・・。(悲)かなり違うみたいですね。

不躾で申し訳ありませんが、初心者の私に是非ご教授お願いしたいです。

invalid integer number as parameter 7 for i Custom function
この様なエラーがでるのですが、どうすればまともに・・・・。
お願いします(;一_一)

投稿者:これから |2009年10月28日 01:21

これからさん

こんにちわ。
エラーは、どのタイミングでドコに表示されますでしょうか^^;

投稿者:慶次 |2009年10月28日 10:12

慶次さんお返事ありがとうございます。
えっとですね、テスト時の操作履歴の所ですね。
これとしか言い表せないのですが、すいません。

ちゃんと売買は行っているのですが、凄い数で上記のエラーが出てきます。
そのエラーの中に、たまに売買している表記が見えます。

投稿者:これから |2009年10月28日 12:23

これからさん

EA内で、iCustom関数のカッコ内に正しくパラメータが入力されているか、
確認できますか?^^;

投稿者:慶次 |2009年10月28日 13:23

open chart で確認したところ、icustom設定通りの場所で売買しているのは
確認できているのですが。カッコ内(symbol, timeframe,インディケーター名 ,インディケーターのパラメーター ,Bufferの数値 , 何本前の足)ですよね?
合っているとおもうのですが。  

投稿者:これから |2009年10月28日 14:04

ここからさん

そのインディケータを稼動させた時にエラーがない場合は、
iCustom関数でカッコ内に入れるデータが間違っている可能性があります。
カッコ内の左から7個目(1個目は通貨ペア名・・・)の部分に、
間違ったデータ型を入れていないか確かめてください。
(例えば、整数を入れる必要があるけど、文字列がはいっているなど)

投稿者:慶次 |2009年10月28日 16:09

慶次さん、これからです。
とりあえずカッコ内を見直してみて、いじくってみたら、なんとエラーでなくなりました。
本当に迷惑かけてすいませんでした。
これからも是非ともご教授お願いします。
ありがとうございました。

投稿者:これから |2009年10月28日 19:22

こんばんは、これから、です。先日は大変お世話になりました。
また初心者的で申し訳ないのですが、もしよろしければご教授ください。
tp、slを例えば、100、50と設定してバックテストした場合、
なぜか、利確は108、損切りは54とズレがでます。なぜなのでしょうか?

投稿者:これ |2009年11月 4日 23:40

これからさん

こんにちわ^^

tp,slを成行にして、Modelling qualityが低い場合に
よくあります^^;

投稿者:慶次 |2009年11月 5日 14:22

10/24に自作EAの不具合について質問させていただいたDapです。
なかなかシグナル条件のそろわないEAなもんで(苦笑)検証に難航しておりました。
ようやく昨日分バックテストをしてみるとやはりシグナルが発生しているにもかかわらず、
ライブでは何の反応もしていないことがわかりました。
自作EAに関するログのみ抜粋すると、

07:39:58 『EA名』 GBPJPY,M5: loaded successfully
07:39:58 『EA名』 GBPJPY,M5 inputs: MagicNumber=0;・・・
07:39:58 『EA名』 GBPJPY,M5: initialized
07:51:39 『EA名』 GBPJPY,M5: deinitialized
07:51:39 『EA名』 GBPJPY,M5: uninit reason 4
07:51:39 『EA名』 GBPJPY,M5: removed
07:51:48 『EA名』 GBPJPY,M5: deinitialized
07:51:48 『EA名』 GBPJPY,M5: uninit reason 4
07:51:48 『EA名』 GBPJPY,M5: removed
07:52:31 『EA名』 GBPJPY,M5: loaded successfully
07:52:31 『EA名』 GBPJPY,M5 inputs: MagicNumber=0;・・・
07:52:47 『EA名』 GBPJPY,M5: initialized
(この間自作EAに関する記載なし)
23:46:01 『EA名』 GBPJPY,M5: loaded successfully
23:46:01 『EA名』 GBPJPY,M5 inputs: MagicNumber=0;・・・
23:46:01 『EA名』 GBPJPY,M5: initialized

となっています。
シグナル発生は12:40頃なのですがこれについてはなんの記録もありません。
uninit reason 4が怪しく思われるので海外フォーラム等調べましたが、
reason 4についてはあまり資料が無くわかりませんでした。
申し訳ありませんが、何かヒントがございましたらよろしくお願いいたします。

投稿者:Dap |2009年11月 7日 12:41

Dapさん

こんにちわ!
uninit reason 4は、チャートが閉じられたときに記述されるもののようですね・・・。
お心当たりはありますでしょうか?^^;

投稿者:慶次 |2009年11月 8日 11:08

こんばんわ! (^-^)

いつも、お世話になっております。


以前から、MT4のことで気になっていたことを
お聞きしたいのですが。


テスターで、EAのバックテストを行いますと、
操作履歴に、ログが出力されると思います。

EAで、カスタムインジケータを実行する毎に、
ログが毎回出力され、それがスピード低下にも
繋がっているのですが、どうにか、ログのなかに、
カスタムインジケータのログを表示しないようにすることは、
可能でしょうか。

<m(__)m>

投稿者:マーサー |2009年11月 8日 19:37

ご回答ありがとうございます。
PCの電源制御(無操作状態が続くとスタンバイする等)もしておらず、
チャートは24時間開きっぱなしなんです。
チャートが閉じられたときの記述ですか。
何でだろう・・・

投稿者:Dap |2009年11月 8日 22:20

MetaTrader5のブログからくぐってきました。
とても参考になります。
益々のご健闘をお祈りしております。

投稿者:bighope |2009年11月 8日 22:59

こんにちわ!

>マーサーさん
ティック毎にカスタムインディケータを読み込むログが記載される件ですね。
http://www.dr-ea.com/meta-blog/ea-sakusei/indicators-ea3.html
内のBBands_Stops_EAでも同様でしょうか?
何か、解決方法があったような気がしますが、ちょっと忘れてしましました^^;
スミマセン・・・。思い出しましたら報告いたします。
また、コードをいじって解決しましたらご報告いただけますでしょうか^^;
よろしくお願いいたします。

>Dapさん
あまり参考にならなくて、すみませんm(_ _;)m
また、何かわかり次第報告いたします。

>bighopeさん
ありがとうございます。
MT5についてですが、もう少しバージョンアップをしてから本格的に
いじってみようと思ってます^^;

投稿者:慶次 |2009年11月 9日 12:53

度々恐縮です。 <m(__)m> 


BBands_Stops_EA では、icustomのログ表示はありませんでした。


1点考えられることとしましては、

EAの実行している時間足と、異なる時間足で icustomを
呼び出したときに、


・・・・・ loaded successfully
・・・・・ removed


の2行をログに、繰り返し表示しているように思いました。


もし、お心当たりがありましたら、
宜しくお願い致します。

<m(__)m>

投稿者:マーサー |2009年11月 9日 16:26

マーサーさん

呼び出し先の時間足のデータはございますでしょうか?
チャートを開いて確認してみていただけますでしょか^^;

投稿者:匿名 |2009年11月 9日 16:36

いつも、御親切に、ありがとうございます。
(^_^;)

ヒストリカルセンターからダウンロードしたデータを
使用していました。

1分足のデータを、period_converterのスクリプトで
各時間足ごとに作成し直して、EAを実行していました。


Strategy Testerで実行した時は、

・・・・・ loaded successfully
・・・・・ removed

と表示されますが、


Expert Advisors でデモ運用しますと、

・・・・・ initialized
・・・・・ loaded successfully

がtick毎に、繰り返し表示されました。


度々恐縮ですが、宜しくお願い致します。

投稿者:マーサー |2009年11月 9日 17:29

マーサーさん

コメントありがとうございます^^

そうですか・・・。
iCustom関数の括弧内には、性格に入力されてますでしょうか?
また、文字列のパラメータ部分にNULLを入れるとそのような現象が
起こるようです。

投稿者:慶次 |2009年11月 9日 17:45

いえいえ、ありがとうございました。
もう少し調査してみます。

投稿者:Dap |2009年11月 9日 19:29

本当に、いつもお世話になりっぱなしで。
(^-^)

もう少し調べてみます。

ありがとうございました!

投稿者:マーサー |2009年11月 9日 20:34

慶次さん

お陰さまで、インジケータの件は何とかなりました。

いつも、本当に、ありがとうございました! 


ところで。
慶次さんは、トレード中に
「 context is busy 」というメッセージが表示されたことは
ありますか。

ODLを使用しているのですが、時々、表示されてトレードできないことが
あるんです。

IsTradeAllowed でトレード可能かを確認するのが良いのか。

何か、根本的な解決方法があればと思いまして、
もし、御存知でしたら、宜しくお願い致します。

(^-^)

投稿者:マーサー |2009年11月17日 00:03

マーサーさん

コメントありがとうございます^^

context is busyは、トレードの状況がビジー状態の時に表示されるようです。
IsTradeContextBusy()を使うとtrueが返ります。

MT4を再起動するとビジー状態がなくなったりします^^;

投稿者:慶次 |2009年11月17日 01:00

早速のコメント、ありがとうございます。

なるほど。
ということは、IsTradeAllowed()では、
OrderSend、OrderModify、OrderClose、OrderDelete
全て不可能ということで、


IsTradeContextBusy()では、
OrderSend のみ不可能ということで宜しいのでしょうか。

(^-^)

投稿者:マーサー |2009年11月17日 15:33

マーサーさん

こんにちわ!

IsTradeContextBusy()がtrueの時もやはりオーダーに関することが
不可能な気がします^^;
詳しく分かり次第また連絡いたしますね^^;

投稿者:慶次 |2009年11月17日 16:48

コメント、ありがとうございます。
(^-^)


全てのオーダーが不可能になりますと、
何も処理を行いたくない時は、始めに

if (IsTradeAllowed()==false || IsTradeContextBusy()==true){
return(0);
}

を記述した方が、宜しいのでしょうか。


慶次さんは、何か特別な処理を行っていますか。
m(__)m

投稿者:マーサー |2009年11月19日 16:26

マーサーさん

こんにちわ^^

>全てのオーダーが不可能になりますと、
>何も処理を行いたくない時は、始めに
>if (IsTradeAllowed()==false || IsTradeContextBusy()==true){
>return(0);
>}
>を記述した方が、宜しいのでしょうか。

そうですね。そうすれば何も処理されません。
その場合は、Print()関数で処理しなかったことを残すといいかもです。

同一ティックでエントリタイミングがよく重なるEAを複数稼動させている場合は、
オーダー部分でつかって、Sleepして数回繰り返すといった感じにするとよいかもです^^;

投稿者:慶次 |2009年11月19日 18:48

慶次さん

いつも、ありがとうございます。
(^^)

オーダー直前にチェックして、数回Sleepしてみます。

毎度、お世話になりました。
m(__)m

投稿者:マーサー |2009年11月20日 00:56

こんばんは
先日の"uninit reason 4"の件ですが、試しにEAをMT4に最初から付属の
"MACD Sample"だけにしても結果は下記の如く変わりませんでした。
(もちろんチャートは閉じておりません)

18:51:00 MACD Sample EURJPY,M5: loaded successfully
18:51:00 MACD Sample EURJPY,M5 inputs: TakeProfit=50; Lots=0.1; TrailingStop=30; MACDOpenLevel=3; MACDCloseLevel=2; MATrendPeriod=26;
18:51:01 MACD Sample EURJPY,M5: uninit reason 4
18:51:01 MACD Sample EURJPY,M5: removed

自作EAの内容が原因ということではなさそうです。
御報告まで。

投稿者:Dap |2009年11月21日 19:01

いつも、お世話になりっぱなしで、
ありがとうございます。 (^-^)

今回は、ODLのことについてですが、
今年の8月から新サーバーになり、No Dealing Desk仕様に
変更されたのと同時に、成行注文時に、SL、TPの設定ができなくなりました。


先月からは、定期メンテナンスとして、毎日10分程度の
売買停止時間が発生するようになりました。。。


他のMT4が可能な業者でも、このような仕様になっているのでしょうか。。。

投稿者:マーサー |2009年12月 3日 13:27

マーサーさん

こんにちわ。
ODLの仕様は、ちょっとやりづらくなってきましたね^^;

投稿者:慶次 |2009年12月 3日 14:03

はじめまして。
いつも非常に勉強になるブログをありがとうございます!

メタトレーダーのEAの自作に挑戦しているのですが
うまく動作せず困っています。(注文が執行されない)。

EAの内容は、
ストップロスでポジションが無くなったあと、
5分間ウェイト時間をおいてから、
次の買いの条件になったら(BB下を割ったら)
買い注文を出す、というものです。

すいませんが何かヒントを教えてくださいませんでしょうか?
Sleep関数を使ってもうまくいきませんでした…

// ポジションチェック 無し
if(CurrentPosition == -1){
  
if (BarCount != Bars) {
BarCount = Bars;

if (WaitTime != 0)
WaitTime--;
}

  if(WaitTime <= 0)  {
    //買いサイン
     if(iClose(NULL,0,0) < iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,0)){
      //買いポジション
      Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(400*Point), "Buy", 0, 0, Blue);
     //ストップロスかかったとこでWaitTimeを5分にセットする
WaitTime = 5;
 }
  }
}

お忙しいところ大変申し訳ありませんがよろしくお願いいたします。

投稿者:よっしー |2009年12月11日 16:00

よっしーさん

連絡遅れてスミマセン^^;
変数の宣言で、ミスがあるかもです・・・。

投稿者:慶次 |2009年12月17日 12:08

はじめまして、、ブログ、大変重宝しております。。。

ここをみながらEA作成にいそしんでおります。。。

さて、少し教えてほしいのですが、、、

たとえば、10ピップス取ればトレードを停止して、
日本時間の9時からトレードを開始するようなプログラムをつくりたいのですが、、

どのようなプログラムをすればよいのか?教えていただけますでしょうか。。。

投稿者:ぴょんきち |2009年12月21日 23:28

ぴょんきちさん

こんにちわ!

1つは、OrderSelectのMODE_HISTORYで取引履歴から指定期間の獲得ピプスを取得する方法と
もう1つは、現在のポジションの獲得ピプスを取得して、そのポジションがなくなったとき
合計獲得ピプスに足して、指定時間にリセットするという方法があるかと思います。
(後者は、スリッページ分の誤差が出てしまいますね^^;)

そして、エントリの条件にその値を使った制限を設けるという感じですね^^

投稿者:慶次 |2009年12月22日 17:51

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。