こんばんはっ!キリンです。
土曜日なんですが、脱サラすると関係なかったり・・・。
なんか実感が湧かない今日この頃です。
■実際のプログラム
■解説
ついにEA製作にまでこぎつけることができましたね。
今までの応用になりますので、しっかりご理解いただければと思います。
■実際のプログラム
//| MA_Trendacy.mq4 |
//| kirin |
//| http://ameblo.jp/ftlabo-kirin/ |
//+------------------------------------------------------------------+
#property copyright “kirin@ftlabo”
#property link “http://ameblo.jp/ftlabo-kirin/”
// マイライブラリー
#include
// マジックナンバー
#define MAGIC 2010610
#define COMMENT “MA_Trendacy”
// 外部パラメータ
extern double Lots = 0.1;
extern int Slippage = 3;
//移動平均期間
extern int MAPeriod = 5;
//移動平均の値の差による発注基準
extern double Diffarence1 = 0.3;
extern double Diffarence2 = -0.3;
//移動平均の差による損切り基準
extern double Diffarence3 = 0;
extern double Diffarence4 = 0;
//損切り・利食いポイント
extern int Slpips = 0;
extern int Tppips = 0;
// スタート関数
int start()
{
double SMA1 = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double SMA2 = iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
double b_pos = KirinCurrentOrders(OP_BUY, MAGIC);
double s_pos = KirinCurrentOrders(OP_SELL, MAGIC);
if(SMA1 – SMA2 > Diffarence1 && b_pos == 0) KirinOrderSend(OP_BUY, Lots, Ask, Slippage, Slpips, Tppips, COMMENT, MAGIC);
if(SMA1 – SMA2 < Diffarence2 && s_pos == 0) KirinOrderSend(OP_SELL, Lots, Bid, Slippage, Slpips, Tppips, COMMENT, MAGIC); if(SMA1 - SMA2 < Diffarence3 && b_pos != 0) KirinOrderClose(Slippage, MAGIC); if(SMA1 - SMA2 > Diffarence4 && s_pos != 0) KirinOrderClose(Slippage, MAGIC);
return(0);
}
color ArrowColor[6] = {Blue, Red, Blue, Red, Blue, Red};
bool KirinOrderSend(int type, double lots, double price, int slippage, double slpips, double tppips, string comment, int magic)
{
int mult=1;
if(Digits == 3 || Digits == 5) mult=10;
slippage *= mult;
if(type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP) mult*=-1;
double sl=0, tp=0;
if(slpips > 0) sl = price – slpips * Point * mult;
if(tppips > 0) tp = price + tppips * Point * mult;
price = NormalizeDouble(price, Digits);
sl = NormalizeDouble(sl, Digits);
tp = NormalizeDouble(tp, Digits);
int starttime = GetTickCount();
while(true)
{
if(GetTickCount() – starttime > 10*1000)
{
Alert(“OrderSend timeout. Check the experts log.”);
return(false);
}
if(IsTradeAllowed() == true)
{
RefreshRates();
if(OrderSend(Symbol(), type, lots, price, slippage, sl, tp, comment, magic, 0, ArrowColor[type]) != -1) return(true);
int err = GetLastError();
Print(“[OrderSendError] : “, err, ” “, ErrorDescription(err));
if(err == ERR_INVALID_PRICE) break;
if(err == ERR_INVALID_STOPS) break;
}
Sleep(100);
}
return(false);
}
// オープンポジションを決済する
bool KirinOrderClose(int slippage, int magic)
{
int ticket = 0;
for(int i=0; i
{
Alert(“OrderClose timeout. Check the experts log.”);
return(false);
}
if(IsTradeAllowed() == true)
{
RefreshRates();
if(OrderClose(ticket, OrderLots(), NormalizeDouble(OrderClosePrice(),Digits), slippage, ArrowColor[type]) == true) return(true);
int err = GetLastError();
Print(“[OrderCloseError] : “, err, ” “, ErrorDescription(err));
if(err == ERR_INVALID_PRICE) break;
}
Sleep(100);
}
return(false);
}
// 現在のポジションのロット数(+:買い -:売り)
double KirinCurrentOrders(int type, int magic)
{
double lots = 0.0;
for(int i=0; i
ガッツリ長いプログラム?になってしまいましたが、
すべては今までの復習で作成されています。
■解説
基本的にはクロス・ストレート円の1時間足以上に対応しています。
全体的なないようですが、SMA1で一本前の足の、SMA2で二本前の足の移動平均線の値を取得させ、
SMA1-SMA2とすることにより、移動平均の傾きを取得しています。
では、中身の解説です。
extern関数については説明は割愛します。
中身を見ていただくほうがご理解いただけると思います。
SMA1とSMA2をiMA関数を用いて計算しています。
これは、第17回[リンク]をご参照いただければと思います。
大事なのは、最後の引数が[ 1 ]と[ 2 ]である点ですね。
b_pos, s_posはdouble型で宣言し、KirinCurrentOrdersでの返り値を取得させます。
KirinCurrentOrdersでは、KirinOrderCloseのような構成になっています。
magicナンバーが一致するものを選び出し、
そこのOrderLotsを取得しています。
そして、if分を使って、MAの傾きと該当ポジションがないことを確かめて、ポジションを取ります。
また、同じような条件文で決済をさせています。
かなりわざと雑に説明しました。
今までの復習だからというのも一つの理由ですが、
ぜひ皆さんの今までの理解を深めるためにも、
どうしてこうなっているのかを考えてみていただきたいです。
コメントによる質問は受け付けておりますので、
お気軽にご利用いただければと思います。
お待ちしておりますね^^
本日もお読みいただき、まことにありがとうございます!
コメント
SECRET: 0
PASS:
// マイライブラリー
#include
がエラーに成りますが?
第35回 MAの傾きを使ったEA
コンパイルしたのですが、エラーメッセージがでました。
バージョンがちがうせいでしょうか?
何が悪いのでしょうか?
教えていただけないでしょうか