MT4で自作ライブラリ


MT4で自作ライブラリ

MT4で自作ライブラリを作成する。


環境


  • OANDA-MetaTrader 4.00 Build 1170

  • MetaEditor 5.00 Build 1966


サンプルコード

自作ライブラリのヘッダファイルを「mylib.mqh」、ライブラリのファイルを「mylib.mq4」として作成する場合を例とする。

①MT4のメニューバーで「ツール」をクリックする。

②「メタエディター」をクリックする。

メタエディターが起動する。

③メタエディターのツールバーで「新規作成」ボタンをクリックする。

④「MQL4 ウィザードへようこそ」で「インクルード」を選択する。

⑤「次へ」ボタンをクリックする。

⑥「インクルードの一般プロパティ」で「名前」に「Include\mylib」と入力する。

拡張子は付けない。付けると拡張子も含めて名前にされてしまう。

⑦「著作者」を無記入にする。

⑧「リンク」を無記入にする。

⑨「完了」ボタンをクリックする。

「mylib.mqh」ファイルの編集画面になる。

⑩「mylib.mqh」ファイルのコードを以下のコードに置き換える。

#include <stderror.mqh>

#include <stdlib.mqh>

#import "mylib.ex4"

void EMail(int BuyEntry, int BuyExit, int SellEntry, int SellExit, string strategy);
double iHLBand(string symbol, int timeframe, string mode, int period, int shift);
double iLevel(string symbol, int timeframe, string mode, int period,int shift);
double iTrendDuration(string symbol, int timeframe, int period, int shift);
double iZScore(string symbol, int timeframe, int period, int shift);
double Profit(void);
int ToPeriod(int minute);
void Trade(int BuyEntry, int BuyExit, int SellEntry, int SellExit, double lots, double slippage, int magic, double MaxSpread, double MaxLoss);

#import

⑪メタエディターのツールバーで「現在のファイルを保存」ボタンをクリックする。

⑫メタエディターのツールバーで「新規作成」ボタンをクリックする。

⑬「MQL4 ウィザードへようこそ」で「ライブラリ」を選択する。

⑭「次へ」ボタンをクリックする。

⑮「ライブラリの一般プロパティ」で「名前」に「Libraries\mylib」と入力する。

やはり拡張子は付けない。付けると拡張子も含めて名前にされてしまう。

⑯「著作者」を無記入にする。

⑰「リンク」を無記入にする。

⑱「完了」ボタンをクリックする。

「mylib.mq4」ファイルの編集画面になる。

⑲「mylib.mq4」ファイルのコードを以下のコードに置き換える。

#property library

#include <mylib.mqh>

#define EPS 0.00001

void EMail(int BuyEntry, int BuyExit, int SellEntry, int SellExit, string strategy) {
bool res;
static int BuyEntrySendMail = 0;
static int BuyExitSendMail = 0;
static int SellEntrySendMail = 0;
static int SellExitSendMail = 0;

// BuyExit
if (BuyExit==1 && BuyExitSendMail==0 && BuyEntrySendMail==1) {
res = SendMail(strategy, "Type:BuyExit\nSymol:" + Symbol() + "\nPrice:" + Bid);
BuyExitSendMail = 1;
BuyEntrySendMail = 0;
}
// SellExit
if (SellExit==1 && SellExitSendMail==0 && SellEntrySendMail==1) {
res = SendMail(strategy, "Type:SellExit\n" + "Symol:" + Symbol() + "\n" + "Price:" + Ask);
SellExitSendMail = 1;
SellEntrySendMail = 0;
}
// BuyEntry
if (BuyEntry==1 && BuyEntrySendMail==0) {
res = SendMail(strategy, "Type:BuyEntry\n" + "Symol:" + Symbol() + "\n" + "Price:" + Ask);
BuyEntrySendMail = 1;
BuyExitSendMail = 0;
}
// SellEntry
if (SellEntry==1 && SellEntrySendMail==0) {
res = SendMail(strategy, "Type:SellEntry\n" + "Symol:" + Symbol() + "\n" + "Price:" + Bid);
SellEntrySendMail = 1;
SellExitSendMail = 0;
}
}

double iHLBand(string symbol, int timeframe, string mode, int period, int shift) {
double hband, lband, ret;
int highest, lowest;

highest = iHighest(symbol, timeframe, MODE_HIGH, period, shift);
lowest = iLowest(symbol, timeframe, MODE_LOW, period, shift);
if (mode == "high") {
ret = iHigh(symbol, timeframe, highest);
}
else if (mode == "low") {
ret = iLow(symbol, timeframe, lowest);
}
else {
hband = iHigh(symbol, timeframe, highest);
lband = iLow(symbol, timeframe, lowest);
ret = (hband+lband) / 2.0;
}

return ret;
}

double iLevel(string symbol, int timeframe, string mode, int period, int shift) {
double close, hband, lband, ret;

close = iClose(symbol, timeframe, shift);
if (mode == "high") {
hband = iHLBand(symbol, timeframe, "high", period, shift);
ret = (hband-close) / close * 100.0;
}
else {
lband = iHLBand(symbol, timeframe, "low", period, shift);
ret = (close-lband) / lband * 100.0;
}

return ret;
}

double iTrendDuration(string symbol, int timeframe, int period, int shift) {
double high, low, ma, ret;
int i;
double down = 0.0;
double up = 0.0;

for (i=period*2+shift-1; i>=shift; i--) {
high = iHigh(symbol, timeframe, i);
low = iLow(symbol, timeframe, i);
ma = iMA(symbol, timeframe, period, 0, MODE_SMA, PRICE_CLOSE, i);
if (low > ma) {
up += 1.0;
}
else {
up = 0.0;
}
if (high < ma) {
down += 1.0;
}
else {
down = 0.0;
}
}
ret = (up-down) / double(period);

return ret;
}

double iZScore(string symbol, int timeframe, int period, int shift) {
double close, ma, ret, std;

close = iClose(symbol, timeframe, shift);
ma = iMA(symbol, timeframe, period, 0, MODE_SMA, PRICE_CLOSE, shift);
std = iStdDev(symbol, timeframe, period, 0, MODE_SMA, PRICE_CLOSE, shift);
if (std < EPS) {
ret = 0.0;
}
else {
ret = (close-ma) / std;
}

return ret;
}

double Profit(void) {
static double balance_at_open = 0.0;
double balance_now, ret;

if ((Hour()==0 && Minute()==0) || balance_at_open<EPS) {
balance_at_open = AccountBalance();
}
balance_now = AccountBalance();
if (MathAbs(balance_at_open) > EPS) {
ret = (balance_now-balance_at_open) / balance_at_open * 100.0;
}
else {
ret = 0.0;
}

return ret;
}

int ToPeriod(int minute) {
int ret;
ret = int( minute / Period());
return ret;
}

void Trade(int BuyEntry, int BuyExit, int SellEntry, int SellExit, double lots, double slippage, int magic, double MaxSpread, double MaxLoss) {
int cnt, pos, ticket, total, TradingTime;
double AdjSpread, profit;
// exit
total = OrdersTotal();
for (cnt=0; cnt<total; cnt++) {
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {
continue;
}
if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderType() == OP_BUY) {
if (BuyExit == 1) {
if (!OrderClose(OrderTicket(), OrderLots(), Bid, slippage, Violet)) {
Print("OrderClose error ",GetLastError());
}
}
}
if (OrderType() == OP_SELL) {
if (SellExit == 1) {
if(!OrderClose(OrderTicket(), OrderLots(), Ask, slippage, Violet)) {
Print("OrderClose error ",GetLastError());
}
}
}
}
}
// entry
if (Close[0] > 50) {
AdjSpread = (Ask-Bid) * 100.0;
}
else {
AdjSpread = (Ask-Bid) * 10000.0;
}
profit = Profit();
if ((DayOfWeek()>=1 && DayOfWeek()<5) || (DayOfWeek()==5 && Hour()<16)){
TradingTime = 1;
}
else {
TradingTime = 0;
}
if (AdjSpread-MaxSpread<EPS && profit>-MaxLoss && TradingTime==1) {
total = OrdersTotal();
pos = 0;
for (cnt=0; cnt<total; cnt++) {
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {
continue;
}
if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
pos += 1;
}
}
if (pos==0) {
if (BuyEntry == 1) {
ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, 0, 0, "", magic, 0, Green);
}
else if (SellEntry == 1) {
ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, slippage, 0, 0, "", magic, 0, Red);
}
}
}
}

⑳メタエディターのツールバーで「コンパイル」ボタンをクリックする。