作者へ ありがとう!
MT4ユーザーは、少なくともウィザードのためにMT5をインストールするだろう。ほんの一部です。
今、この記事はプログラマーの好奇心を満たしている。しかし、ユーザーではない。
マーケティングには、MT4でウィザードを機能させるために何を押せばよいかをステップ・バイ・ステップで説明する、別のレベルの記事が必要である。
そうすれば、ユーザーはこのビジネスでの経験を他のユーザーと共有し始めるだろう。あるいは、私はマーケティングについて何も理解していない。
作者へ ありがとう!
MT4ユーザーは、少なくともウィザードのためにMT5をインストールするだろう。ほんの一部です。
今、この記事はプログラマーの好奇心を満たしている。しかし、ユーザーではない。
マーケティングには、MT4でウィザードを機能させるために何を押せばよいかをステップ・バイ・ステップで説明する 、別のレベルの記事が必要である。
そうすれば、ユーザーはこのビジネスでの経験を他のユーザーと共有し始めるだろう。あるいは、私はマーケティングについて何も理解していません。
書くことは問題ない。しかし、記事になる可能性は低い。実際、この情報はすでに記事の中にあり、2、3段落で済む。
正確を期すため、このウィザードはMT4では動作しない ことを指摘しておきたい。このようなウィザードはMT5でのみ利用可能である。生成されたExpert Advisorは 動作するはずですが、おそらくすべてではありません。
比較のために、Tick Data Suite(互換性:MT4ビルド940~1052)のトライアルをお勧めします。
MT5テスターで「by real ticks」モードを選択する。それを保存し、TDS経由でMT4-テスターに送ります。
すると、両方のテスターの相場が100%一致し、取引だけでなくスピードでも比較できるようになります。
そうすれば、EAの変換/作成を双方向で比較することができます。
SB経由でMT4→MT5にコンバートした結果、kodobaseにEAが公開されるような現象があります。
そのような作者がセルフチェックのために利用できる記事のようだ。変換が正しければ、MT5Bridge経由で逆変換してもMT4オリジナルと同じ結果になるはずです。
SB経由でMT4→MT5にコンバートした結果、kodobaseにEAが公開されるような現象があります。
そのような作者がセルフチェックのために利用できる記事のようだ。変換が正しければ、MT5Bridge経由で逆変換しても、MT4オリジナルと同じ結果が得られるはずです。
fxsaber, 2017.05.08 15:12
MT5Bridge 経由であなたのコードを MT4に変換しました。MT4build1072
EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:07.645 (total time 0:00:08.362)
EURUSD,M1: 1865415 tick events (7292 bars, 1865515 bar states) processed in 0:00:03.744 (total time 0:00:04.493)
変換後の結果は同じです!スピードは半分に落ちました。
私のMT5 EA(標準インジケーターの代わりにCExpertSignalの 独自実装で生成されたもの)は、MT4上で問題なくコンパイルされ、テストされました!
しかし今、私はExpert Advisorをリアルに送信し、それが全く取引しないことが判明しました。エラーも何も表示されません。ただ取引しないのです。Trade.mqhのbool CTrade::FillingCheck(const string symbol)という関数です。
このチェックは成行注文に対して行われます。
// シンボルで可能な充填ポリシーのタイプを取得する uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE); // もう一度実行モードをチェックする if(exec == SYMBOL_TRADE_EXECUTION_MARKET) { // MARKET実行モード用 // 分析順序 if(m_request.action != TRADE_ACTION_PENDING) { // 即座に実行する場合 // 必要な充填ポリシーがサポートされている場合、それをリクエストに追加する。 if(m_type_filling == ORDER_FILLING_FOK && (filling & SYMBOL_FILLING_FOK) != 0) { m_request.type_filling = m_type_filling; return(true); } if(m_type_filling == ORDER_FILLING_IOC && (filling & SYMBOL_FILLING_IOC) != 0) { m_request.type_filling = m_type_filling; return(true); } // 充填ポリシーが間違っている。 m_result.retcode = TRADE_RETCODE_INVALID_FILL; return(false); } return(true); }
私の場合、m_type_fillingとfillingの両方がゼロに等しいので、関数はfalseを返します。
コードのロジックではfillingがゼロに等しくなることはないはずですが、ヘルプによるとSymbolInfoInteger(symbol, SYMBOL_FILLING_MODE)はMT4ではサポートされていません。そのため、テスターではなぜかチェックが通り、実際の取引でもブローカーによっては通るかもしれません。今のところ、すべてのコードをスキップして関数からtrueを返すように関数を変更しただけです。
このチェックは成行注文で機能します。
私の場合、m_type_filling と filling の両方がゼロに等しいので、関数は false を返します。
コードのロジックでは filling はゼロに等しくないはずですが、ヘルプによると SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE) は MT4 ではサポートされていません。そのため、テスターではなぜかチェックが通り、実際の取引でもブローカーによっては通るかもしれません。今のところ、すべてのコードをスキップして関数からtrueを返すように関数を変更しただけです。
メッセージをありがとう。これは知らなかった。このメソッドは変更しないでおきます。どうやら、注文 および/または商品のタイプに応じて、すべてのフィリング変数を特定の定数に設定する必要があるようです(おそらく、これはAPIを通じてどのような方法でも引き出すことはできず、テスターはいくつかのデフォルトを使用しています)。MT4が内部的にどのようにフィリングを選択するのかご存知の方がいらっしゃいましたら、ぜひ教えてください。
MT4が内部的にどのようにフィリングを選択しているかご存知の方がいらっしゃいましたら、教えてください。
fxsaber, 2017.02.25 16:12
ENUM_ORDER_TYPE_FILLING GetFilling( const string Symb, const uint Type = ORDER_FILLING_FOK )
{
const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE);
const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE);
return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
(((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
(ENUM_ORDER_TYPE_FILLING)Type);
}
ありがとうございます。MT4用のSymbolInfoInteger(symbol, SYMBOL_FILLING_MODE)のアナログを得るために、このコードを少し修正することができます。この関数はENUM_ORDER_TYPE_FILLINGではなく、(SYMBOL_FILLING_FOK | SYMBOL_FILLING_IOC)を返すべきです。
ORDER_FILLING_FOK = 0、ORDER_FILLING_IOC = 1、SYMBOL_FILLING_FOK = 1、SYMBOL_FILLING_IOC = 2なので、結果を1だけインクリメントすればよい。
//ファンクションは、MT4 の SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE)としてシンボルの充填モードを返します。 //Parameter Type - オーダー充填タイプ uint GetSymbolFilling( const string Symb, const uint Type = ORDER_FILLING_FOK ) { const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(Symb, SYMBOL_TRADE_EXEMODE); const int FillingMode = (int)::SymbolInfoInteger(Symb, SYMBOL_FILLING_MODE); return ((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ? (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ? ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) : (ENUM_ORDER_TYPE_FILLING)Type) + 1; }
そして関数bool CTrade::FillingCheck(const string symbol)のコードを呼び出します。
uint filling = GetSymbolFilling(symbol, m_type_filling); //の代わりに //uint filling = (uint)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
しかし実際には、これは動作させるための単なるコード調整です。このようなことはせず、正しい解決策を見つける方がよいでしょう。
Stanislav Korotkyさん、こんにちは。
あなたの記事はとても興味深く、既製のMT5 EAをMT4で動作させる方法について、あなたの指示に従おうとしました。
しかし、以下のようなエラーが発生しました。
あなたの指示に従った後に私がしたことはMQL5ソースファイルとMQL5プログラムを コピーし、Expertフォルダのメインディレクトリに貼り付けました。
というものでした。
MQL5で生成したEAをMT4で動作させるにはどうすればよいでしょうか?
以下は添付のエラー画像です。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事 MetaTrader 4でMQL5ウィザードの既製エキスパートアドバイザーが機能 はパブリッシュされました:
本稿ではMetaTrader 4のためのMetaTrader 5取引環境の簡単なエミュレータについてお話しします。このエミュレータは標準ライブラリの取引クラスの移行と調整を実装するものです。その結果、MetaTrader 5ウィザードで生成されたエキスパートアドバイザーは、そのままMetaTrader 4でコンパイルして実行することができます
EURUSD M15チャートでは、決済逆指値や決済指値の設定のしかた含めて、エキスパートアドバイザーの取引は良好に見えます。
MetaTrader 4のでMetaTrader 5ウィザードからのEAの作業を示すチャートウィンドウ
作者: Stanislav Korotky