【MQL4&MQL5】複数通貨ペア同時エントリーEAの無料ソースコード

 こんにちわ、WANです('ω')
 この記事では1つのEAで複数通貨ペアに注文を出すナンピンEAの作り方をご紹介致します。MQL4とMQL5どちらも公開しますが、どちらも同じコードとなりますのでMQL4のEAのみDL可能にしておきますね!

 MQL5で動作させるには今は販売を停止したMQL5へのコンバーター「Includer」が必要ですが、この記事で期間限定で再販します。EA開発者独自でこういったコンバーターを準備しているとお聞きしますが、これまで世に出てるものはごく少数ですので公開する機会は大変貴重です('ω')

 稼働に関して注意していただきたいことが、MT4の仕様上バックテストはできません。リアル稼働はできます。

■EAダウンロード
 こちらのEAをダウンロードしてエディターで開いて続きを見てください。

※こちらのEAはご自由にお使いください。もしこの機会にMQL勉強したい方はWANのEA教室(1回1時間5,000円)まで('ω')

■プロパティ部分
#ifdef __MQL5__
#endif
で挟むとこの間はMQL5でしか読み込まなくなります。
MQL5でコンパイルすることでIncluder_note.mqhというファイルを読み込んでMQL4→MQL5へ変換となります。このファイルが有料

#ifdef __MQL5__//このコードをMT5で稼働させるためのコンバーター(有料)
#include <Includer_note.mqh>
#endif

■パラメーター
トレードする通貨ペア名をカンマ区切りで入力します。
サフィックスとは通貨ペア名の後ろについてる付随文字のことです。
USDJPYmという通貨ペア名の場合はサフィックスにmと入力してください。

input string TradeSymbol = "USDJPY,EURJPY,EURUSD,GBPUSD,GBPJPY,EURGBP,AUDUSD,AUDJPY";//トレードする通貨
input string Suffix = "";//通貨の付随文字

■内部グローバル変数
Mult:PipsとPointの変換に使用する数字
SymbolArray:カンマ区切りで入力した通貨ペア名をカンマ区切りで分解してこの配列に格納します
_symbol _digits _point _tick:MQLで最初から用意されている変数The predefined Variablesの代わりにこの変数を使います。これがミソ

//内部グローバル変数
int Mult = 10;//1.0pipsが何pointか pipsとpointの変換に使用
int SymbolSize;//通貨の数
string SymbolArray[];//通貨を格納する配列
string _symbol;//_Symbolの代替え
int _digits;//_Digitsの代替え
double _point;//_Pointの代替え
MqlTick _tick;//Ask Bidの代替え

■OnInit
パラメーターで入力したカンマ区切りの通貨ペア名をStringSplit関数でカンマ区切りでSymbolArray配列に格納。できあがった配列の数がSymbolSizeに代入。この関数めっちゃ便利!

//通貨をカンマ区切りで配列に格納
   SymbolSize = StringSplit(TradeSymbol, ',', SymbolArray);

■OnTick
 for文で通貨ペア名を変えてぐるぐるさせます。
 まずはSymbolArray配列から通貨ペア名を作成。
 次にiClose関数で作成した通貨ペア名の存在確認をします。このiClose関数を実行することでチャートがダウンロードされて使用可能に。値が取得できなければ0が返ってきますので、その時はエラーということで次の通貨ペア名へ
 正常に値が取得出来たら、ファイル全体で使用するであろう基本の_point _digitsの値を取得。この変数があるのでドル円とユロルみたいに桁が違う通貨ペアも操作可能になります。
 AskやBidもEAが挿入された通貨ペアの情報になるのでSymbolInfoTick関数で_tickを更新。それぞれ_tick.askと_tick.bidとして使用します。

   for(int i = 0 ; i < SymbolSize ; i++)
     {
      //通貨ペアを作成
      _symbol = SymbolArray[i] + Suffix;

      //通貨ペアの呼び出しと、値取得の確認
      double close0 = iClose(_symbol, PERIOD_CURRENT, 0);
      if(close0 == 0 || _symbol == "")
         continue;

      //通貨ペアの情報取得
      _point = MarketInfo(_symbol, MODE_POINT);
      _digits = (int)MarketInfo(_symbol, MODE_DIGITS);
      SymbolInfoTick(_symbol, _tick);

      //スプレッドフィルター
      int sp = (int)MarketInfo(_symbol, MODE_SPREAD);
      if(sp > Spread)
         continue;

      //ナンピンロジック
      NanpinLogic(MAGIC);

      //新規エントリー
      int signal = EntrySignal();
      if(signal != 0)
         OS(signal, EntryLots, StopLoss, TakeProfit, MAGIC);
     }

■新規エントリー
 このコードではRSIの逆張りをします。
 コンバーターを使うとインジケーターの初期化時に値を取得できずに0で返ってきますので0の時はエントリーさせないようにしてください。

   double RSI = iRSI(_symbol, PERIOD_CURRENT, 14, PRICE_CLOSE, 0);//うまく値を取得できなかった場合0が返ってくるため注意

//RSI30以下でBUY
   if(RSI != 0 && RSI <= 30)
      sig = 1;

//RSI70以上でSELL
   if(RSI != 0 && RSI >= 70)
      sig = -1;

■オーダー送信関数
 引数で受け取ったTP,SLはPipsのため_pointを使用して実数に直し利確と損切の値を作成、_digitsで四捨五入。ここで_pointや_digitsが本領発揮しました。

//+------------------------------------------------------------------+
//|  オーダー送信関数                                                   |
//+------------------------------------------------------------------+
bool OS(int sig, double lots, double sl, double tp, int magic)
  {
   if(!IsTradeAllowed() || !IsTradeAllowed(_symbol, _tick.time))//トレードが許可されているか、トレードできる時間帯か。MQL5では_tick.timeの代わりにTimeTradeServer()を使うと尚OK
      return(false);
   double price = 0;
   int type = -1;//OP_BUYが0 OP_SELLが1のため初期値は-1
   if(sig == 1)
     {
      type = OP_BUY;
      price = _tick.ask;
      if(sl > 0)
         sl = price - sl * _point * Mult;
      if(tp > 0)
         tp = price + tp * _point * Mult;
     }
   if(sig == -1)
     {
      type = OP_SELL;
      price = _tick.bid;
      if(sl > 0)
         sl = price + sl * _point * Mult;
      if(tp > 0)
         tp = price - tp * _point * Mult;
     }
   if(type >= 0 && price != 0)
     {
      price = NormalizeDouble(price, _digits);
      sl = NormalizeDouble(sl, _digits);
      tp = NormalizeDouble(tp, _digits);
      if(OrderSend(_symbol, type, LotsCal(lots), price, Slippage, sl, tp, EANAME, magic) != -1)
        {
         return(true);
        }
      Print("[OrderSendError] : ", _symbol, _LastError);
     }
   return(false);
  }

■その他
 他のロジックは今回のタイトルには関係ないので説明は省きますね。また、コード全体をわかりやすくするために、エラーに対する処置はしていませんのでご了承ください。

■コンバーター
 ダウンロードしたmq4と全く同じコードでMQL5でコンパイルするためにはこちらのコンバーターIncluerが必要です。是非この機会に購入お願いします('ω')


■Includerについて
コンバーターを使用することのメリット
①MT4用EA、MT5用EAの同時開発が可能
 同じコードで同時開発することで時短かつ不具合修正も容易。
②MT5のデバック機能が利用可能
 MT4ではストラテジーテスター実行中のデバックはログ出力がメインとなりますが、MT5ではブレークポイントを置いた任意の場所でテスターを停止することができたり、配列を一括参照できるなど、より高機能のデバックが可能です。原因不明エラーに数時間~数日悩まされることが少なくなります。
高速ストラテジーテスター
 MT5のストラテジーテスターはMT4より早く(1分OHCL分析で1年間が数秒で完了)、オプティマイズ(最適化)などが楽になります。またMT4のテスター結果を外部ソフトで解析することなく詳細な取引結果を得ることが可能です。
④多数の時間足
 MT5では2分足、2時間足など多数の時間足があるため詳細な時間足設定が可能です。

■インストール方法
本商品をDL後、DLしたファイル「includer.mqh」を「MQL5」→「include」のフォルダ下にコピペします。
※コンパイルするメタエディタが属するincludeフォルダ内にお願いします。

■変換原理・方法
①MQL言語の「条件付きコンパイル」を利用しています。
 詳しくはリファレンスのMQL5 リファレンス / 言語基礎 / プリプロセッサ / 条件付きコンパイル( #ifdef、#ifndef、#else、#endif ) を参照してください。
②ファイルの準備
 mq4のコードをmq5にコピペします。
③ソースコード冒頭に以下を記載
#ifdef __MQL5__
#include <includer.mqh>
#endif
 これでMQL5でコンパイルしたときのみincluderが使用されることになります。以下この原理を用いてMQL5でコンパイルしたときのみ特別な回路を回ります。
④OnInit()内に以下を記載
#ifdef __MQL5__
OnInit2();
#endif
 OnInit2()では口座がネッティングアカウントの場合アラートを出すようにしてあります。ネッティングアカウントでは両建てやナンピンができないためです。
 またMQL4独自の定義済み変数の準備をしています。
⑤OnTick()内に以下を記載
#ifdef __MQL5__
OnTick2();
#endif
 MQL4独自の定義済み変数を作成しています。テスター速度に大きく影響します。詳しくはコーディングの注意点③参照
⑥コンパイルをしてエラーが無いことを確認します。
 ※アイコンや他のライブラリーを使用している場合はMT5のフォルダに移行してください。
 ※すべての変換を保証するものではありません。ある程度の知識が必要です。

■コーディングの注意点
注意点や確認中のコードや変換できないコードはこちらになります。
イベント関数はinit(),start(),deinit()が使用不可です。その代わりにOnInit(),OnStart(),OnDeinit()、またOnCalculate(),OnTick()をご使用ください。詳しくはMQL公式を確認してください
待機注文系全般の使用不可(MQL4のOrdersTotal()がMQL5のOrdersTotal()と完全一致しているためPositionsTotal()との区別不可)
③MQL4独自の定義済み変数は使用しないことを推奨致します。「Close[],Open[],High[],Low[],Bars」を使用しない場合OnTick2()を使用する必要はございません。これらの変数は関数で代替え可能です。これらの定義済み変数を関数でコーティングし、OnTick2()を使用しないことで速度が本来のMT5の速度に近づき早くなります。
列挙型変数は数字で記載せずに列挙型でコーディングしてください。例)1時間→PERIOD_H1、適応価格→PRICE_CLOSEなど。
⑤ArrayBsearch()をMQL4の方法で使用するときは引数を省略しないで全部記入。MQL4MQL5では検索方法が違うため。
⑥MQL4の古い記述「Obsolete functions」で名称変更になっている部分は使用しない。

■作成したEAのお客様への提供&出品方法
コンパイル後の提供方法についてです。
①Includer.mqhの著作権は当方にございますため2次配布は禁止させていただきます。
②IncludeはLibrariesと違いコンパイル後の実行ファイル(ex5)は本商品無しで稼働可能です。ex5ファイルのみで提供してください。
③ゴゴジャンその他サイトへの出品は、ソースコードが必要なサイトに出品する際にのみIncluder添付を許可致します。
④Includerで変換された場合でも特別なロゴ等はつきません。
⑤変換されたファイルの動作につきましては予期なく起こるエラー等もございますので保証致しかねます。ご自身にてテスターなどでご確認のほどよろしくお願いします。
⑥ソフトウェアという性質上原則返品はお受けできません。

ここから先は

0字 / 1ファイル

¥ 20,000

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?