Last Updated on 2021-01-18 by toshiikuo
以前記事に書いた、初めて作ったEAのバックテスト結果が散々だったので、売りと買いを逆にしたら最強のEAが完成するのではないかと思いやってみた。
初めて作ったEAのバックテスト結果
初めて作ったEAのバックテスト結果がこちら。確実に金を減らしていきます。
売りと買いを逆にしたEAのバックテスト結果
そして、売りと買いを逆にしたEAのバックテスト結果がこちら。
結果も完全にひっくり返したような形になっている。当たり前と言えば当たり前か。
売りと買いを逆にしたEAのソースコード
売りと買いを逆にしたEAのソースコードはこちら。ご自由にどうぞ。投資は自己責任で。
//+------------------------------------------------------------------+
//| My_First_EA.mq5 |
//| Copyright 2010, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#include<Trade\Trade.mqh>
CTrade trade;
//--- input parameters
input int StartHour=1;
input datetime StartTime=D'2020.01.02 06:00:00';
input int CloseHour=23;
input datetime CloseTime=D'2020.01.02 06:00:00';
input int endtime;
input int EA_Magic=104190;
input double Lot=0.01; // Lots to Trade
input double step=0.05;
//--- Other parameters
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- set MagicNumber for your orders identification
trade.SetExpertMagicNumber(EA_Magic);
//--- set available slippage in points when buying/selling
int deviation=10;
trade.SetDeviationInPoints(deviation);
//--- order filling mode, the mode allowed by the server should be used
trade.SetTypeFilling(ORDER_FILLING_RETURN);
//--- logging mode: it would be better not to declare this method at all, the class will set the best mode on its own
trade.LogLevel(1);
//--- what function is to be used for trading: true - OrderSendAsync(), false - OrderSend()
trade.SetAsyncMode(true);
//---
return(0);
}
void OnTick()
{
MqlTick latest_price; // To be used for getting recent/latest price quotes
MqlTradeRequest mrequest; // To be used for sending our trade requests
MqlTradeResult mresult; // To be used to get our trade results
MqlRates mrate[]; // To be used to store the prices, volumes and spread of each bar
ZeroMemory(mrequest); // Initialization of mrequest structure
datetime ct=TimeCurrent();
MqlDateTime mqlct;
TimeToStruct(ct,mqlct);
int cthour=mqlct.hour;
MqlDateTime mqlst;
mqlst=mqlct;
mqlst.hour=StartHour;
mqlst.min=0;
mqlst.sec=0;
datetime StartTime=StructToTime(mqlst);
MqlDateTime mqlet;
mqlet=mqlct;
mqlet.hour=CloseHour;
mqlet.min=0;
mqlet.sec=0;
datetime CloseTime=StructToTime(mqlet);
//--- Get the last price quote using the MQL5 MqlTick Structure
if(!SymbolInfoTick(_Symbol,latest_price))
{
Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
return;
}
//--- Get the details of the latest 3 bars
if(CopyRates(_Symbol,_Period,0,3,mrate)<0)
{
Alert("Error copying rates/history data - error:",GetLastError(),"!!");
ResetLastError();
return;
}
//---入力された時間の値段を取得
MqlRates rates[];
CopyRates(_Symbol,_Period,StartTime,1,rates);
ArrayPrint(rates);
double openrate=NormalizeDouble(rates[0].open,_Digits);
//---現在の値段を取得
MqlTick CurrentTick;
SymbolInfoTick(_Symbol,CurrentTick);
double CurrentRate=NormalizeDouble(CurrentTick.bid,_Digits);
//---差
double diff = CurrentRate-openrate;
//---エントリー
bool isdealtime = (StartTime<=ct && ct<CloseTime);
if(isdealtime){
int x;
for(x=1;diff<=-step*x;x++){
if(PositionsTotal()<x){
ZeroMemory(mrequest);
mrequest.action = TRADE_ACTION_DEAL; // immediate order execution
mrequest.symbol = _Symbol; // currency pair
mrequest.volume = Lot; // number of lots to trade
mrequest.magic = EA_Magic; // Order Magic Number
mrequest.type_filling = ORDER_FILLING_FOK; // Order execution type
mrequest.deviation=100; // Deviation from current price
mrequest.sl = NormalizeDouble(openrate,_Digits); // Take Profit
mrequest.price = NormalizeDouble(latest_price.bid,_Digits); // latest ask price
mrequest.type = ORDER_TYPE_SELL; // Buy Order
//--- send order
OrderSend(mrequest,mresult);
// get the result code
if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
{
Alert("A Buy order has been successfully placed with Ticket#:",mresult.order,"!!");
}
else
{
Alert("The Buy order request could not be completed -error:",GetLastError());
ResetLastError();
return;
}
}
}
for(x=1;diff>=step*x;x++){
if(PositionsTotal()<x){
ZeroMemory(mrequest);
mrequest.action = TRADE_ACTION_DEAL; // immediate order execution
mrequest.symbol = _Symbol; // currency pair
mrequest.volume = Lot; // number of lots to trade
mrequest.magic = EA_Magic; // Order Magic Number
mrequest.type_filling = ORDER_FILLING_FOK; // Order execution type
mrequest.deviation=100; // Deviation from current price
mrequest.sl = NormalizeDouble(openrate,_Digits); // Take Profit
mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // latest bid price
mrequest.type = ORDER_TYPE_BUY; // Buy Order
//--- send order
OrderSend(mrequest,mresult);
// get the result code
if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
{
Alert("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
}
else
{
Alert("The Sell order request could not be completed -error:",GetLastError());
ResetLastError();
return;
}
}
}
}
//---時間決済
if(mqlct.hour==mqlet.hour){
trade.PositionClose(Symbol());
}
return;
}
//+------------------------------------------------------------------+
テストYoutubeライブ配信
フォワードテスト、バックテストをYoutubeでライブ配信しています。チャンネル登録よろしく。
https://www.youtube.com/channel/UCYAV2u8C8ch4SzEni5FeMMQ/featured
まとめ
売買を反対にしたことで逆張りのEAからトレンドフォローのEAになった。
トレンドフォローのほうが良いということかも。
次はトレンドフォローのEAを作ってみよう。
私が使っている口座
MT5でスプレッド、手数料を最小限に抑えるためには、
TradeViewのMT5のILC口座をTariTaliというキャッシュバックサイトから口座開設するのがベストです。(私調べ)余談
以前記事に書いた、初めて作ったEAのバックテスト結果はこちら。
こんな感じで投資に関する記事を書いているのでよかったら。
ピンバック: FXの自動売買のためにMT5のEAを作ってみたので内容をまとめる。【ソースコードあり】 - Akinai Life
ピンバック: 自分で作ったEAを最大期間でバックテストをしたら驚きの結果だった。 - Akinai Life