MQL4コードチェック項目

MetaTrader 4
GogoJungle
2020/04/11 18:30
610

MQL4コードチェック項目について

ゴゴジャンで実施しているMQL4コードチェックの内容について記載します。
EAをご出品する際のチェックリストとして、ご利用いただければ幸いです。


EAチェック全体の流れは下記のとおりです。

  1. ソースコード(mq4)をチェック
  2. Strategy Testerでバックテストを実施してチェック
  3. デモ口座で運用してチェック

※本チェックは、EAの成績について保証しているものではありませんので予めご了承ください


ここでは、ソースコード(mq4)の具体的なチェック内容について、記載します。

1.パラメータ管理

1-1.マジックナンバーの設定確認

  • パラメーターにより任意の値に設定変更が可能であること(下記 extern の記述は input でもよい)
extern int MagicNumber = 123456;

1-2.マジックナンバーの変更確認(バージョンアップ時)

  • 前回とマジックナンバーが同じであること

2.ポジション管理

2-1.ポジションカウント処理の確認

  • 通貨ペアとマジックナンバーを判定して、ポジション数がカウントされていること(OrdersTotal で検索して確認)
int CalculateCurrentOrdersBuy() {
   int cnt=0; 
   for(int i=0;i<OrdersTotal();i++) {   
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicNumber) continue;     
      if(OrderType()==OP_BUY) {
         cnt++;
      }
   }
   return(cnt);
}      

3.エントリー処理

3-1.最大ポジション数の確認

  • 前提条件として、現在の保有ポジション数と最大ポジション数を比較・判定していること(OrderSend で検索して確認)
if (countbuy<MaxPos) { 
   int ticket = -1;
   ticket=OrderSend(NULL,OP_BUY,lot,Ask,Slippage,0,0,Com,MagicNumber,0,Blue);

3-2.マジックナンバーの設定確認

  • エントリーをする際に(OrderSend関数内に)マジックナンバー(1-1.で指定しているもの)が設定されていること
OrderSend(NULL,OP_BUY,lot,Ask,Slippage,0,0,Com,MagicNumber,0,Blue);

3-3.通貨ペアの設定確認

  • エントリーをする際に(OrderSend関数内に)通貨ペアが Symbol() または NULL であること
    (固定の場合は、USDJPYm, USDJPY_ など、ブローカーによる文字が考慮されていること)
OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,0,0,Com,MagicNumber,0,Blue);

3-4.ストップロスの設定確認(OrderCloseによるロジック決済がない場合:SL, TPのみ決済の場合)

  • ストップロスの設定がエントリー時に設定されていること

下記は、OrderModify が失敗したら二度とSL, TPが設定されないためNG

if( EntryPosition == 1 ) //買いの場合のエントリ条件
{
	 res=OrderSend(Symbol(),OP_BUY,Lots ,Ask,SLP,0,0,"TrendLogic",MAGIC,0,Red);
	 if (OrderSelect(res,SELECT_BY_TICKET)==true)
	 {
		 if (Buy_stoploss!=0) SL=OrderOpenPrice()-Buy_stoploss*AdjustPoint(Symbol());
		 if (Buy_takeprofit!=0) TP=OrderOpenPrice()+Buy_takeprofit*AdjustPoint(Symbol());
	 }
	 Modified=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Red);
}
else if(EntryPosition == -1 ) //---- 売りエントリ
{
	 res=OrderSend(Symbol(),OP_SELL,Lots,Bid,SLP,0,0,"TrendLogic",MAGIC,0,White);
	 if(OrderSelect(res,SELECT_BY_TICKET)==true)
	 {
		 if(Sell_stoploss!=0) SL=OrderOpenPrice()+Sell_stoploss*AdjustPoint(Symbol());
		 if(Sell_takeprofit!=0) TP=OrderOpenPrice()-Sell_takeprofit*AdjustPoint(Symbol());
	 }
	 Modified=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,White);
}

4.決済処理

4-1.マジックナンバーの確認

  • 前提条件として、マジックナンバー、通貨ペアを判定していること
for( i=OrdersTotal()-1; i>=0; i-- ){
  if( OrderSelect(i, SELECT_BY_POS) == true ){
    if( OrderType() == OP_BUY && OrderMagicNumber() == Magic && OrderSymbol() == Symbol() ){
      if( !(OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Green)) ){

4-2.決済対象チケットの確認

  • マジックナンバー、通貨ペア判定後、決済対象のチケットが変化しないこと(OrderSelectが実施されないこと)

下記は決済時のチケットが変わるパターンのためNG

for( i=OrdersTotal()-1; i>=0; i-- ){
  if( OrderSelect(i, SELECT_BY_POS) == true ){
    if( OrderType() == OP_BUY && OrderMagicNumber() == Magic && OrderSymbol() == Symbol() ){
      OrderTicketChange();
      if( !(OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Green)) ){
void OrderTicketChange()
  {
   OrderSelect(3, SELECT_BY_POS);   
  }

4-3.リトライ処理の確認

  • 1度決済が失敗しても、決済判定および処理が、ティック毎に再度行われること(決済失敗が考慮されていること)

無限ループ処理の場合はNG

4-4.決済条件の確認

  • MT4を再起動すると、ロジックに影響のある条件処理となっていないこと

決済条件に使用する変数が再起動で初期化される場合はNG

5.例外処理

5-1.エラーハンドリングの確認

  • ループ処理 while において、無限ループにならないこと(エラーハンドリングのパターンが網羅されていること)
while(true)
{
   // タイムアウト処理
   if (GetTickCount() - StartTime > 10 * 1000)
   {
      Alert("OrderSend timeout. Check the experts log.");
      
      return(-1);
   }
// リトライしても解消されないエラーなら、ループを脱出
if(err == ERR_INVALID_PRICE) break;
if(err == ERR_INVALID_STOPS) break;
if(err == ERR_LONGS_NOT_ALLOWED) break;
if(err == ERR_SHORTS_NOT_ALLOWED) break;
if(err == ERR_NOT_ENOUGH_MONEY) break;
if(err == ERR_TRADE_TOO_MANY_ORDERS) break;

6.取引制限

6-1.取引制限の確認

  • 複数の証券会社で動作すること(ブローカー、コース、口座番号、ファイル名の縛りがないこと)

7.外部処理

7-1.外部通信の確認

  • 外部通信が行われていないこと(http で検索して確認)

7-2.外部ファイルの確認

  • バックテストの成績を最適化する目的で使用していないこと(hst,dll で検索して確認)

7-3.グローバル変数の確認

  • グローバル変数(GlobalVariableSet, GlobalVariableGet)が使用されていないこと
    (使用する場合は、グローバル変数の特性を理解した上で、問題なく実装されていること)

8.著作権

8-1.デコンパイルの確認

  • デコンパイルされたコードでないこと
double Gda_280[30];
int G_digits_192=0;
double G_point_196=0.0;
int Gi_204;
double Gd_208;
double Gd_216;
double Gd_224;
  • 暗号化されているコードの場合も、解読困難のため、著作権の問題を確認
int  2516972921474835825095 ;
int  919926175214748358129332 ;
int OnInit()
{
    158651616521474836452710  =  945331452214748360523750 ();
    1821361779214748361111350 ( 158651616521474836452710 );
  • ライセンス関連の記述がないこと
#include <License.mqh>

8-2.利用規約違反の確認

  • 複数アカウントで、類似のソースをアップしていないこと(複数アカウントによる出品は、利用規約違反)

おわりに

ゴゴジャンでは、以上のようなソースチェックを、すべてのEAについて、実施しております。
運用上の不具合や新しい情報などございましたら、ご報告いただければ、幸いでございます。

ご報告いただいた内容に基づき、随時チェック項目をアップデートいたします。

みなさまの優秀なEAのご出品を心からお待ち申し上げております。

コメント

関連項目

検索結果がありません。