MT4インジケータの最適化絡みの記事で、読者さんから依頼があった簡単なコードを公開しておきます。
このEAは使用している時間足が3個経過した時点で決済する仕組みになっています。
3個という部分をパラメータにすることでコード修正の影響が少なくなり、さらに最適化も可能になります。
ここから開発範囲を広げていけるか、止まってしまうのかはあなた次第です(´・ω・`)
//+------------------------------------------------------------------+ //| ParameterOptimization.mq4 | //| Copyright (C)2015 FX取引に関するあれこれ All Rights Reserved. | //| http://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "Copyright (C) 2015 FX取引に関するあれこれ All Rights Reserved." #property link "http://fxtrading.greeds.net" /*▼EAのパラメータ▼*/ input double TP =100; input double SL =100; input double Lots =0.1; /*▲EAのパラメータ▲*/ /*▼インジケーターのパラメータ▼*/ extern int InpCCIPeriod=14; extern int test_InpCCIPeriod=200; /*▲インジケーターのパラメータ▲*/ //+------------------------------------------------------------------+ //|メイン | //+------------------------------------------------------------------+ void OnTick(void) { int cnt,total; if(Bars<100) { Print("bars less than 100"); return; } if(TP<10) { Print("TakeProfit less than 10"); return; } /*▼最適化したいインジケータからデータを取得▼*/ double out0_0 = iCustom(NULL,0,"CCI",InpCCIPeriod,0,1); double out0_1 = iCustom(NULL,0,"CCI",InpCCIPeriod,0,2); double out1_0 = iCustom(NULL,0,"CCI",test_InpCCIPeriod,0,1); double out1_1 = iCustom(NULL,0,"CCI",test_InpCCIPeriod,0,2); /*▲最適化したいインジケータからデータを取得▲*/ total=OrdersTotal(); if(total<1) { if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ",AccountFreeMargin()); return; } /*買いエントリー*/ if(out0_0<out1_0 && out0_1>out1_1) { EntryL(); } /*売りエントリー*/ if(out0_0>out1_0 && out0_1<out1_1) { EntryS(); } } for(cnt=0;cnt<total;cnt++) { if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderType()<=OP_SELL && // check for opened position OrderSymbol()==Symbol()) // check for symbol { if(OrderType()==OP_BUY) { /*買い決済*/ if(TimeCurrent()-OrderOpenTime()>=(Period()*3)*60) { SettlementL(); return; } } else // go to short position { /*売り決済*/ if(TimeCurrent()-OrderOpenTime()>=(Period()*3)*60) { SettlementS(); return; } } } } } void EntryL() { int ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-TP*Point,Ask+TP*Point,"macd sample",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else { Print("Error opening BUY order : ",GetLastError()); } return; } void EntryS() { int ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TP*Point,Bid-TP*Point,"macd sample",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else { Print("Error opening SELL order : ",GetLastError()); } return; } void SettlementL() { if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) { Print("OrderClose error ",GetLastError()); } return; } void SettlementS() { if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) { Print("OrderClose error ",GetLastError()); } return; }