「Spreaded_Score_Type1_ver001.mq4」のその後2 [EA作成]
「Spreaded_Score_Type1_ver001.mq4」ですが、「Spreaded_Score_Type1_ver002.mq4」とヴァージョンが進み、下のようにとりあえず完成しました。ただし、テストしましたが、まだまだ多くの調整・変更が必要です。今後は調整していく様子を書いてみたいと思います。
予定通りでないところは、前回も書きましたが「レジスタンス」のところをとりあえずカットして作成しています。 それ以外はシンプルに書いて動くところまでこぎつけました。まだ、動くだけの状態ですので、テストを繰り返しながら作りこんでいかないと売り買い収支がプラスにならないことでしょう。でも、新しい考え方で作れたのは大きな進歩だと思っています。「なんだ、こんなのだったら簡単に作れるし、もっと上手に書けるよ。」という方もいっぱいいらっしゃるとは思いますが、初心者レベルのプログラムですので長い目で見てやってください。
下記の3つのブロックとそれにまつわる最初のパラメータ・宣言部分以外(売り買い動作部分)は、他のEAからパクってます。
- Variable(テクニカル計算)
- Point(テクニカル荷重配分ポイント計算)
- Signal(シグナル発生条件)
//+------------------------------------------------------------------+
//| Spreaded_Score_Type1_ver002.mq4 |
//| Littlecub |
//| http://littlecubonbackst.blog.so-net.ne.jp/ |
//+------------------------------------------------------------------+
#property copyright "Littlecub"
#property link "http://littlecubonbackst.blog.so-net.ne.jp/"
//---取引基本パラメータ
extern int MagicNumber = 20121213; //作成日をマジックナンバーとする
extern double Lots = 0.01; //初期値:0.01(最低ロット1000通貨単位)
extern int Slippage = 1; //初期値:1pips
extern int StopLoss = 30; //初期値:30pips(Min値)
extern int TakeProfit = 30; //初期値:30pips(Min値)
extern int TrailingStop = 30; //初期値:30pips(Min値)
//---テクニカル期間パラメータ
extern int TimeFrameMA = 60; //初期値:60minute トレンド
extern int TimeFrameBB = 60; //初期値:60minute トレンド
extern int TimeFramePSAR = 60; //初期値:60minute トレンド
extern int TimeFramePIVOT = 60; //初期値:60minute レジスタンス
extern int TimeFrameSandR = 60; //初期値:60minute レジスタンス
//---テクニカル荷重配分パラメータ(トータル100%)
extern int P_Stoch = 15; //初期値:15% シグナル
extern int P_RSI= 15; //初期値:15% シグナル
extern int P_MACD = 10; //初期値:10% シグナル
extern int P_MA = 20; //初期値:20% トレンド
extern int P_BB = 20; //初期値:20% トレンド
extern int P_PSAR = 20; //初期値:20% トレンド
//---シグナル発生閾値パラメータ(MIN-100~MAX100ポイント)
extern int P_Signal_buy = 50; //初期値:50ポイント
extern int P_Signal_sell = -50; //初期値:-50ポイント
//---機能使用スイッチパラメータ
extern bool UseStopLoss = False; //初期値:False
extern bool UseTakeProfit = False; //初期値:False
extern bool UseTrailingStop = True; //初期値:True
extern bool SignalMail = False; //初期値:False
extern bool EachTickMode = True; //初期値:True
extern bool ReverseSignal = False; //初期値:False
extern bool PositionClose = False; //初期値:False
extern bool ManyPosition = False; //初期値:False
//---外部宣言
#define SIGNAL_NONE 0
#define SIGNAL_BUY 1
#define SIGNAL_SELL 2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init() {
BarCount = Bars;
if (EachTickMode) Current = 0; else Current = 1;
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start() { //プログラムスタート
int Order = SIGNAL_NONE;
int Total, Ticket;
double StopLossLevel, TakeProfitLevel;
if (EachTickMode && Bars != BarCount) TickCheck = False;
Total = OrdersTotal();
Order = SIGNAL_NONE;
//+------------------------------------------------------------------+
//| Variable //テクニカル計算 |
//+------------------------------------------------------------------+
//---Signal 1 Stochstics
double St_Signal1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,1);
double St_Signal0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);
double St_Main1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,1);
double St_Main0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0);
//---Signal 2 RSI
double RSI0 = iRSI(NULL,0,14,PRICE_CLOSE,0);
//---Signal 3 MACD
double Macd_Signal1 = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
double Macd_Signal0 = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
double Macd_Main1 = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
double Macd_Main0 = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
//---Trend 1 MA
double MA_05 = iMA(NULL,TimeFrameMA, 5,0,MODE_EMA,PRICE_CLOSE,0);
double MA_10 = iMA(NULL,TimeFrameMA,10,0,MODE_EMA,PRICE_CLOSE,0);
double MA_25 = iMA(NULL,TimeFrameMA,25,0,MODE_EMA,PRICE_CLOSE,0);
double MA_50 = iMA(NULL,TimeFrameMA,50,0,MODE_EMA,PRICE_CLOSE,0);
double MA_75 = iMA(NULL,TimeFrameMA,75,0,MODE_EMA,PRICE_CLOSE,0);
//---Trend 2 Bollinger Bands
double BB_Main=iBands(NULL,TimeFrameBB,21,0,0,PRICE_CLOSE,MODE_MAIN,0);
double BB_U1=iBands(NULL,TimeFrameBB,21,1,0,PRICE_CLOSE,MODE_UPPER,0);
double BB_L1=iBands(NULL,TimeFrameBB,21,1,0,PRICE_CLOSE,MODE_LOWER,0);
double BB_U2=iBands(NULL,TimeFrameBB,21,2,0,PRICE_CLOSE,MODE_UPPER,0);
double BB_L2=iBands(NULL,TimeFrameBB,21,2,0,PRICE_CLOSE,MODE_LOWER,0);
double BB_U3=iBands(NULL,TimeFrameBB,21,3,0,PRICE_CLOSE,MODE_UPPER,0);
double BB_L3=iBands(NULL,TimeFrameBB,21,3,0,PRICE_CLOSE,MODE_LOWER,0);
//---Trend 3 Parabolic SAR
double PSAR=iSAR(NULL,TimeFramePSAR,0.02,0.2,0);
//+------------------------------------------------------------------+
//| Point //テクニカル荷重配分ポイント計算 |
//+------------------------------------------------------------------+
//---Signal 1 Stochstics
double Signal1 = 0;
if (St_Signal1 >= St_Main1 && St_Signal0 < St_Main0)
Signal1 = P_Stoch * 1; //BuySignal
if (St_Signal1 <= St_Main1 && St_Signal0 > St_Main0)
Signal1 = P_Stoch * (0-1); //SellSignal
//---Signal 2 RSI
double Signal2 = 0;
if (RSI0 < 25) Signal2 = P_RSI * (25 - RSI0) / 25; //BuySignal
if (RSI0 > 75) Signal2 = P_RSI * (75 - RSI0) / 25; //SellSignal
//---Signal 3 MACD
double Signal3 = 0;
if (Macd_Signal1 >= Macd_Main1 && Macd_Signal0 < Macd_Main0)
Signal3 = P_MACD * 1; //BuySignal
if (Macd_Signal1 <= Macd_Main1 && Macd_Signal0 > Macd_Main0)
Signal3 = P_MACD * (0-1); //SellSignal
//---Trend 1 MA
double Trend1 = 0;
double Trend11 = 0;
double Trend12 = 0;
double Trend13 = 0;
double Trend14 = 0;
if (MA_05 > MA_10) Trend11 = P_MA * 1 / 4; else Trend11 = P_MA * (0-1) / 4;
if (MA_10 > MA_25) Trend12 = P_MA * 1 / 4; else Trend12 = P_MA * (0-1) / 4;
if (MA_25 > MA_50) Trend13 = P_MA * 1 / 4; else Trend13 = P_MA * (0-1) / 4;
if (MA_50 > MA_75) Trend14 = P_MA * 1 / 4; else Trend14 = P_MA * (0-1) / 4;
Trend1 = Trend11 + Trend12 + Trend13 +Trend14; //Signal
//---Trend 2 Bollinger Bands
double Trend2 = 0;
if (Close[0] < BB_Main)
Trend2 = P_BB * (BB_L2 - Close[0]) / (BB_L2 - BB_L3); //BuySignal
if (Close[0] > BB_Main)
Trend2 = P_BB * (BB_U2 - Close[0]) / (BB_U3 - BB_U2); //SellSignal
//---Trend 3 Parabolic SAR
double Trend3 = 0;
if (Close[0] < PSAR) Trend3 = P_PSAR; //BuySignal
if (Close[0] > PSAR) Trend3 = P_PSAR * (0-1); //SellSignal
//+------------------------------------------------------------------+
//| Signal //シグナル発生条件 |
//+------------------------------------------------------------------+
double Signal = Signal1 + Signal2 + Signal3 + Trend1 + Trend2 + Trend3;
Print ("Signal Point is ", Signal);
//---Buy Signal
if (Signal > P_Signal_buy) Order = SIGNAL_BUY; //BuySignal
//---Sell Signal
if (Signal < P_Signal_sell) Order = SIGNAL_SELL; //SellSignal
//+------------------------------------------------------------------+
//| Check Position Exit&Trailing Stop
//+------------------------------------------------------------------+
bool IsTrade = True;
for (int i=0;i<Total;i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {
IsTrade = ManyPosition;
if (OrderType() == OP_BUY) {
//Exit Buy
if (PositionClose) {
if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
if (!EachTickMode) BarCount = Bars;
IsTrade = True;
continue;
}
}
//Trailing Stop
if(UseTrailingStop && TrailingStop > 0) {
if(Bid - OrderOpenPrice() > Point * TrailingStop) {
if(OrderStopLoss() < Bid - Point * TrailingStop) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, Yellow);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
}
else {
//Exit Sell
if (PositionClose) {
if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
if (!EachTickMode) BarCount = Bars;
IsTrade = True;
continue;
}
}
//Trailing Stop
if (UseTrailingStop && TrailingStop > 0) {
if ((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
if ((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, Yellow);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Order
//+------------------------------------------------------------------+
//Check free margin
if (AccountFreeMargin() < (1000 * Lots)) {
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
else {
//Buy
if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(IsTrade) {
if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
Print("BUY order opened : ", OrderOpenPrice());
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
}
else {
Print("Error opening BUY order : ", GetLastError());
}
}
if (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
return(0);
}
}
//Sell
if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(IsTrade) {
if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
Print("SELL order opened : ", OrderOpenPrice());
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
}
else {
Print("Error opening SELL order : ", GetLastError());
}
}
if (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
return(0);
}
}
if (!EachTickMode) BarCount = Bars;
return(0);
}
}
//+------------------------------------------------------------------+
コメント 0