投稿カレンダー

2019年9月
« 5月    
 1
2345678
9101112131415
16171819202122
23242526272829
30  

太陽活動

FXFTでMT4を動かすことにする

 「一寸先は闇」とはよく言ったもので、為替も大きな流れは予想できますが、少し先を予想することはできません。

 MT4のエキスパートアドバイザーは、プログラムを動かして自動で為替の売買を行ってくれる、かしこい機能です。いつかはディープラーニングを応用したいと考えていますが、今回は単純な法則でデモ口座による取引を行っています。

 相場のトレンドを感じ取って、それに追随するアルゴリズムです。これに、各相場の癖をパラメータとして準備するというものです。

 下にプログラムの一部を公表します。(アルゴリズムの部分は全て晒しています。)現在、このプログラムをFXFTで動かして検証しています。

//+——————————————————————+
//| MA2CrossBSVer102.mq4
//| Copyright (c) 2016, BlueSeed
//| http://seed.fam.cx
//+——————————————————————+
#property copyright “Copyright (c) 2016, BlueSeed”
#property link “http://seed.fam.cx”

// マイライブラリー
#include <BSLib.mqh>

// マジックナンバー
#define MAGIC 20160723
#define COMMENT “MA2CrossBSV102”

// 外部パラメータ
extern bool Auto = true;

extern double Lots = 0.1;
extern int Slippage = 3;

// エントリー関数
extern int FastMAPeriod = 20; // 短期SMAの期間
extern int SlowMAPeriod = 40; // 長期SMAの期間
extern int TrendMAPeriod = 900; // トレンドSMAの期間

extern int TakeProfit =500; // 利益幅
extern int StopLoss = 1000; // ストップロス
extern int ShiftP = 1; // 

extern int CheckTick =200; // 売買時のチェック期間
extern double CheckRate =0.6; // チェック期間内のでの売買の厳しさ

datetime WaitTime;
int AutoLots;
double FinalLots;

color ArrowColor[6] = {Blue, Red, Blue, Red, Blue, Red};

int EntrySignal(int magic)
{
// オープンポジションの計算
double pos = MyCurrentOrders(MY_OPENPOS, magic);

// 移動平均の計算
double fastSMA1 = iMA(NULL, 0, FastMAPeriod, 0, MODE_LWMA, PRICE_CLOSE, 1);
double fastSMA2 = iMA(NULL, 0, FastMAPeriod, 0, MODE_LWMA, PRICE_CLOSE, 2);
double slowSMA1 = iMA(NULL, 0, SlowMAPeriod, 0, MODE_LWMA, PRICE_CLOSE, 1);
double slowSMA2 = iMA(NULL, 0, SlowMAPeriod, 0, MODE_LWMA, PRICE_CLOSE, 2);
double TrendSMA1 = iMA(NULL, 0, TrendMAPeriod, 0, MODE_LWMA, PRICE_CLOSE, 1);
double TrendSMA2 = iMA(NULL, 0, TrendMAPeriod, 0, MODE_LWMA, PRICE_CLOSE, 2);

int ret = 0;
// 買いシグナル
if(pos <= 0 && TrendSMA1>Ask && slowSMA1 > slowSMA2 && TrendSMA1> TrendSMA2 ) ret |=1;
// if(pos <= 0 && fastSMA1>Ask && slowSMA1 > slowSMA2 && TrendSMA1> TrendSMA2 && High[iHighest(NULL, 0, MODE_HIGH, CheckTick, 1)]+Low[iHighest(NULL, 0, MODE_LOW, CheckTick, 1)]>Ask*2 ) ret |=1;
if(pos <= 0 && fastSMA1>Ask && High[iHighest(NULL, 0, MODE_HIGH, CheckTick, 1)]*(1-CheckRate)+Low[iHighest(NULL, 0, MODE_LOW, CheckTick, 1)]*CheckRate>Ask && TrendSMA1> TrendSMA2) ret |=1;
// if(pos <= 0 && fastSMA1 > fastSMA2 && slowSMA1 > slowSMA2 && slowSMA1>Ask && TrendSMA1> TrendSMA2) ret |=1;

// 買いCloseシグナル
if(pos > 0 && High[iHighest(NULL, 0, MODE_HIGH, CheckTick, 1)]*CheckRate+Low[iHighest(NULL, 0, MODE_LOW, CheckTick, 1)]*(1-CheckRate)<Bid && TrendSMA1< TrendSMA2) ret |=2;
// if(MyCurrentOrders(MY_BUYPOS, magic)> 0 && fastSMA2 > fastSMA1 && fastSMA1<=Ask) ret |=2;
// if(MyCurrentOrders(MY_BUYPOS, magic)> 0 && slowSMA1>fastSMA1 && fastSMA1<=Ask) ret |=2;

// 売りシグナル
if(pos >= 0 && TrendSMA1<Bid && slowSMA1 < slowSMA2 && TrendSMA1< TrendSMA2 ) ret |=4;
if(pos >= 0 && fastSMA1<Bid && High[iHighest(NULL, 0, MODE_HIGH, CheckTick, 1)]*CheckRate+Low[iHighest(NULL, 0, MODE_LOW, CheckTick, 1)]*(1-CheckRate)<Bid && TrendSMA1< TrendSMA2) ret |=4;
// if(pos >= 0 && fastSMA1 < fastSMA2 && slowSMA1 < slowSMA2 && slowSMA1<Bid && TrendSMA1< TrendSMA2 ) ret |=4;

// 売りCloseシグナル
if(pos < 0 && High[iHighest(NULL, 0, MODE_HIGH, CheckTick, 1)]*(1-CheckRate)+Low[iHighest(NULL, 0, MODE_LOW, CheckTick, 1)]*CheckRate>Ask && TrendSMA1> TrendSMA2) ret |=8;
// if(MyCurrentOrders(MY_SELLPOS, magic)<0 && fastSMA2 < fastSMA1 && slowSMA1>=Bid ) ret|=8;
// if(MyCurrentOrders(MY_SELLPOS, magic)<0 && slowSMA1<fastSMA1 && slowSMA1>=Bid ) ret |=8;
// if(slowSMA1<fastSMA1 ) ret |=8;

return(ret);
}

// スタート関数
int start()
{
int i=0, ticket = 0, type=0,err;
double sl,tp;
Comment(Symbol( )+”test comment”);
string sym=Symbol( );

if (Auto==true){
if (“USDJPY-cd”==Symbol( )){
switch(Period( )){
case PERIOD_M1:
FastMAPeriod = 20; // 短期SMAの期間
SlowMAPeriod = 40; // 長期SMAの期間
TrendMAPeriod = 900; // トレンドSMAの期間

TakeProfit =500; // 利益幅
StopLoss = 1000; // ストップロス
ShiftP = 1; // 

CheckTick =200; //売買時のチェック期間
CheckRate =0.6; //チェック期間内のでの売買の厳しさ
Comment(Symbol( )+” : M1 : “+”Auto trade on”);
break;

default:
break;
}
}

if (“GBPUSD-cd”==Symbol( )){
switch(Period( )){
case PERIOD_M1:
FastMAPeriod = 160; // 短期SMAの期間
SlowMAPeriod = 200; // 長期SMAの期間
TrendMAPeriod = 900; //トレンドSMAの期間

TakeProfit =1400; //利益幅
StopLoss = 900; //ストップロス
ShiftP = 1; // 

CheckTick =160; //売買時のチェック期間
CheckRate =0.9; //チェック期間内のでの売買の厳しさ
Comment(Symbol( )+” : M1 : “+”Auto trade on”);
break;

default:
break;
}
}

}

}

// エントリーシグナル
int sig_entry = EntrySignal(MAGIC);
AutoLots=AccountMargin( )/50000;
if (AutoLots<1)AutoLots=1;
if(Auto!=true)AutoLots=Lots*100;
FinalLots=AutoLots/100.0;

// 買い注文
if((sig_entry &1)==1 && WaitTime+60<TimeCurrent( ))
{
MyOrderClose(Slippage, MAGIC);
MyOrderSend(OP_BUY, FinalLots, Ask, Slippage, Bid-StopLoss*Point, Bid+TakeProfit*Point, COMMENT, MAGIC);
WaitTime=TimeCurrent( );
}

// 買い注文Close
if((sig_entry &2)==2 )
{
MyOrderClose(Slippage, MAGIC);
WaitTime=TimeCurrent( );
}

// 売り注文
if((sig_entry &4)==4 && WaitTime+60<TimeCurrent( ))
{
MyOrderClose(Slippage, MAGIC);
MyOrderSend(OP_SELL, FinalLots, Bid, Slippage, Ask+StopLoss*Point, Ask-TakeProfit*Point, COMMENT, MAGIC);
WaitTime=TimeCurrent( );
}

// 売り注文Close
if((sig_entry &8)==8)
{
MyOrderClose(Slippage, MAGIC);
WaitTime=TimeCurrent( );
}

//Modify Orders

for(i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS) == false) break;
if(OrderSymbol() != Symbol() || OrderMagicNumber() != MAGIC) continue;
type = OrderType();

sl=StopLoss*Point;
tp=TakeProfit*Point;

// sl = NormalizeDouble(sl, Digits)+OrderOpenPrice( );
// tp = NormalizeDouble(tp, Digits)+OrderOpenPrice( );

// sl = OrderStopLoss();
// tp = OrderTakeProfit();

if(IsTradeAllowed() == true){

if(type == OP_BUY && sl!=0 && tp!=0) {
ticket = OrderTicket();
sl=iMA(NULL, 0, TrendMAPeriod, 0, MODE_LWMA, PRICE_CLOSE, 1)-sl;
if (sl<OrderStopLoss()) sl=OrderStopLoss();
tp=iMA(NULL, 0, TrendMAPeriod, 0, MODE_LWMA, PRICE_CLOSE, 1)+tp;
if (tp<OrderTakeProfit()) tp=OrderTakeProfit();
}
if(type == OP_SELL && sl!=0 && tp!=0) {
ticket = OrderTicket();
sl=iMA(NULL, 0, TrendMAPeriod, 0, MODE_LWMA, PRICE_CLOSE, 1)+sl;
if (sl>OrderStopLoss()) sl=OrderStopLoss();
tp=iMA(NULL, 0, TrendMAPeriod, 0, MODE_LWMA, PRICE_CLOSE, 1)-tp;
if (tp>OrderTakeProfit()) tp=OrderTakeProfit();
}

if(OrderModify(ticket, 0, sl, tp, 0, ArrowColor[type]) == true) return(true);
err = GetLastError();
Print(“[OrderModifyError] : “, err, ” “, ErrorDescription(err));
if(err == ERR_NO_RESULT) break;
if(err == ERR_INVALID_STOPS) break;
}

}
return(0);
}

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>