ゴゴジャンで実施しているMQLソースコードチェックの内容について記載します。
EAをご出品する際のチェックリストとして、ご利用いただければ幸いです。
EAチェック全体の流れは下記のとおりです。
※本チェックは、EAの成績について保証しているものではありませんので予めご了承ください
ここでは、ソースコード(mq4)の具体的なチェック内容について、記載します。
【例】
extern int MagicNumber = 123456;
input int MAGIC = 123456;
extern
またはinput
で検索して確認)OrdersTotal
で検索して確認)【例】
//-------- 新規ポジションのエントリー --------
// ポジションの数をカウントする
for(i=OrdersTotal()-1; i>=0; i--)
{
//オーダー選択(エラーを生じた場合、ループから抜け出す)
if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == false)
{
Print("OrderSelect returned the error of ", GetLastError() );
break;
}
//オーダー確認(通貨ペアが一致しない場合は、for文の先頭に戻る)
if (OrderSymbol() != Symbol()) continue;
//マジックナンバー確認(マジックナンバーが一致しない場合は、for文の先頭に戻る)
if (OrderMagicNumber() != MagicNumber) continue;
if (OrderType() == OP_BUY)
{
CountBuy = CountBuy + 1;
}
if (OrderType() == OP_SELL)
{
CountSell = CountSell + 1;
}
}
OrderSend
で検索して確認)【例】
if (countbuy=0)
if(OrderModify(ticket,OrderOpenPrice(),sl,tp,0))
{
lastTime=now;
entry_cnt++;
}
【修正後】
ticket=OrderSend(symbol,OP_BUY,Lots,Ask,Slippage,sl,tp,NULL,MagicNumber,0,Blue);
if(ticket>=0)
{
lastTime=now;
entry_cnt++;
}
【例】
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
【例】
bool closePosition(int magic, int type = -1) //決済処理を行う関数
{
int result_count = 0; //挑戦回数
int close_signal = 0; //0が成功,0以外が失敗
if(IsTradeAllowed() == true) {
for(int i = OrdersTotal() - 1; i >= 0; i--) {
if(OrderSelect(i, SELECT_BY_POS) == false) continue;
if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
if(type >= 0 && OrderType() != type) continue;
RefreshRates();
if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, ArrowColor[OrderType()]) == true) {
continue; //最初のクローズ処理(通常はここで成功する)
}else{ //ここから決済が失敗した場合の処理
result_count = 0;
for(int j = 0; j 0){
result_count++; //失敗した回数のカウンターを増やす
Print("[OrderClose Error] : ", err, " ", ErrorDescription(err));
}
}
if(result_count == RETRY_COUNT) { //カウンターが指定した挑戦回数に達した場合
close_signal++; //決済失敗のシグナルを出す
}
}
}
}
if(close_signal == 0) return(true); //成功したので関数を終了する
Alert("[OrderClose Error] : Close timeout. Check the experts log."); //失敗した場合にタイムアウトのエラーを出す
}
return(false); //アラートを出して終了する
}
決済条件に使用する変数が再起動で初期化される場合はNG
while
において、無限ループにならないこと(エラーハンドリングのパターンが網羅されていること)【良い例:タイムアウト処理が記述されている】
while(true)
{
int hoge; //処理上手くいった場合に1となる変数
//****ここで決済などの処理***//
if(hoge) return(true);
// タイムアウト処理
if (GetTickCount() - StartTime > 10 * 1000)
{
Alert("OrderSend timeout. Check the experts log.");
return(-1);
}
【悪い例:タイムアウト処理が記述されていない】
while(true)
{
int hoge; //処理上手くいった場合に1となる変数
//****ここで決済などの処理***//
if(hoge) return(true);
}
【その他のループ脱出例】
// リトライしても解消されないエラーなら、ループを脱出
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;
【NG例:証券会社(Gaitame)を指定している】
int OnInit()
{
if(IsTradeAllowed() == false) {
Alert("Enable the setting 'Allow live trading' in the Expert Properties!");
}
if(StringFind(TerminalInfoString(TERMINAL_COMPANY), "Gaitame") == -1) return(INIT_FAILED); //証券会社が"Gaitame"でない場合は初期化が失敗する
magic_array[0] = Magic1;
bars1 = getBars(Magic1);
return(INIT_SUCCEEDED);
}
http
で検索して確認)hst
,dll
で検索して確認)GlobalVariableSet
, GlobalVariableGet
)が使用されていないこと【例:商品ID 12345,商品名 GogoJungleEAの場合】
int ticket = OrderSend( ①, ②, ③, ④, ⑤, ⑥, ⑦, "12345:GogoJungle_EA", ⑨, ⑩, ⑪);
またEAつくーるで作成の場合は、基本項目「コメント」にて「商品ID:商品名」をご入力後コンパイルいただけますと可能でございます。
【例】
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
//#include
//int group_no = 11,group,a1=1; // グループ番号 0:使用しない
//bool PC_Check = true; // true: PC縛りを行う false: 行わない
//datetime PrevTime;
//string ServerURL0 = "http://reapseven.xsrv.jp/license";
//string ServerURL = "http://fxea.xsrv.jp/license"; // サーバーのURL
//string ServerURL2 = "http://fxea.xsrv.jp/license";
//int stp=-1;
//#import "shell32.dll"
//int ShellExecuteW(int hWnd, int lpVerb, string lpFile, string lpParameters, string lpDirectory, int nCmdShow);
//#import
//string DataPath = TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Libraries";
1の場合:ORDER_FILLING_FOK ※デフォルト
2の場合:ORDER_FILLING_IOC
【例】
int FillingMode=(int)SymbolInfoInteger(_Symbol,SYMBOL_FILLING_MODE);
if(FillingMode == 2){
request.type_filling = ORDER_FILLING_IOC;
}
PositionsTotal
で検索して確認)【例】
int pos = 0;
int posTotal=PositionsTotal();
for( int posIndex=0; posIndex<posTotal; posIndex++ )
{
const ulong ticket=PositionGetTicket(posIndex);
if(PositionSelectByTicket(ticket) &&
PositionGetString(POSITION_SYMBOL)==_Symbol &&
PositionGetInteger(POSITION_MAGIC)==Magic_Number)
{
pos++;
}
}
}
【例】
input int Magic_Number;
MqlTradeRequest request;
MqlTradeResult result;
request.action = TRADE_ACTION_DEAL;
request.magic = Magic_Number;
request.symbol = _Symbol;
request.volume = 0.1;
request.sl = stoploss;
request.tp = takeprofit;
request.position = 0;
OrderSend(request,result);
【例】
int posTotal=PositionsTotal();
for( int posIndex=0; posIndex<posTotal; posIndex++ )
{
const ulong ticket=PositionGetTicket(posIndex);
if(PositionSelectByTicket(ticket) &&
PositionGetString(POSITION_SYMBOL)==_Symbol &&
PositionGetInteger(POSITION_MAGIC)==Magic_Number)
{
MqlTradeRequest request;
MqlTradeResult result;
request.action = TRADE_ACTION_DEAL;
request.magic = Magic_Number;
request.symbol = _Symbol;
request.volume = 0.1;
request.sl = 0;
request.tp = 0;
request.position = ticket;
OrderSend(request,result);
}
}
}
ゴゴジャンでは、以上のようなソースチェックを、すべてのEAについて、実施しております。
運用上の不具合や新しい情報などございましたら、ご報告いただければ、幸いでございます。
ご報告いただいた内容に基づき、随時チェック項目をアップデートいたします。
みなさまの優秀なEAのご出品を心からお待ち申し上げております。
検索結果がありません。 |
検索結果がありません。 |