ゴゴジャンで実施しているMQL4コードチェックの内容について記載します。
EAをご出品する際のチェックリストとして、ご利用いただければ幸いです。
EAチェック全体の流れは下記のとおりです。
※本チェックは、EAの成績について保証しているものではありませんので予めご了承ください
ここでは、ソースコード(mq4)の具体的なチェック内容について、記載します。
extern
の記述は input
でもよい)extern int MagicNumber = 123456;
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-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(NULL,OP_BUY,lot,Ask,Slippage,0,0,Com,MagicNumber,0,Blue);
3-3.通貨ペアの設定確認
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);
}
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)) ){
下記は決済時のチケットが変わるパターンのため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);
}
無限ループ処理の場合はNG
決済条件に使用する変数が再起動で初期化される場合はNG
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;
hst
,dll
で検索して確認)GlobalVariableSet
, GlobalVariableGet
)が使用されていないこと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>
ゴゴジャンでは、以上のようなソースチェックを、すべてのEAについて、実施しております。
運用上の不具合や新しい情報などございましたら、ご報告いただければ、幸いでございます。
ご報告いただいた内容に基づき、随時チェック項目をアップデートいたします。
みなさまの優秀なEAのご出品を心からお待ち申し上げております。
検索結果がありません。 |
検索結果がありません。 |