-
スレッド
-
お世話になります。
EA作成講座のRSIをもとに掲示板にありました仕掛け時間を実装したのですが
関数の返し方がを理解できておらずうまくいきません。
ご教示いただけましたら助かります。
内容といたしましては、仕掛け時間がオンならエントリー時間に制限をかける、オフなら時間制限なしといった内容となります。
ファイル添付できませんでしたので下記にコードを張り付けておきます。
よろしくお願いいたします。
//+——————————————————————+
//| ProjectName |
//| Copyright 2018, CompanyName |
//| http://www.companyname.net |
//+——————————————————————+
#property copyright “Copyright 2018, MetaQuotes Software Corp.”
#property link “https://www.mql5.com”
#property version “1.00”
#property strict
input int MAGICMA = 23498721; // マジックナンバー
input double Lots =0.01; // 1ロット十万通貨単位
input int LossCut=10 ; // 損切(pips)
input int TakeProfit = 20; // 利確(pips)
input int Slippage = 4; // エントリー見送りスリッページ
input double MaxSpread = 5; // エントリー見送りスプレッド
input int RSIPeriod=14; // RSI期間
input int RSIUP = 80; // RSI上の線
input int RSIDOWN = 20; // RSI下の線
input bool UseShikake = true;
input string EntryStartHour2 = “3”;
input string EntryStartMinute2 = “0”;
input string EntryEndHour2 = “8”;
input string EntryEndMinute2 = “0”;
double dPoint;
double dSpread;
//+——————————————————————+
//| |
//+——————————————————————+
int OnInit()
{
Print(TimeIfCheck(EntryStartHour2, EntryStartMinute2,EntryEndHour2, EntryEndMinute2));
dPoint = Point * 10;
return(INIT_SUCCEEDED);
}
//+——————————————————————+
//| |
//+——————————————————————+
void OnTick()
{
dSpread = (Ask – Bid) / dPoint;
if(CalculateCurrentOrders()==0 && dSpread < MaxSpread)
CheckForOpen();//ポジションを持っていなければポジションを得る
}
//+——————————————————————+
void CheckForOpen()
{
int res;
if(iRSI(Symbol(),0,RSIPeriod,0,0) >= RSIUP && TimeIfCheck() == true )//open[0]が現在のバーの始値
{
res=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Bid + LossCut * dPoint, Ask – TakeProfit * dPoint, “”, MAGICMA, 0, Red);//戻り値はチケット番号
if(res < 0)
Print(“Error OrderSend :”,GetLastError());
}
if(iRSI(Symbol(),0,RSIPeriod,0,0) <= RSIDOWN)
{
res=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Ask – LossCut * dPoint, Bid + TakeProfit * dPoint,””, MAGICMA, 0, Red);//戻り値はチケット番号
if(res < 0)
Print(“Error OrderSend :”,GetLastError());
}
}
//+——————————————————————+
//| |
//+——————————————————————+
int CalculateCurrentOrders()
{
int positions = 0;
//—
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
positions++;
}
}
return positions;
}
//+——————————————————————+
//| |
//+——————————————————————+
bool TimeIfCheck(string startTime,string startMinute, string endTime,string endMinute)
{
if(!UseShikake)
return false;
int iTime_ts = (int)startTime;
int iTime_ms = (int)startMinute;
int iTime_te = (int)endTime;
int iTime_me = (int)endMinute;
datetime ParTime = TimeCurrent();
if(iTime_ts < iTime_te || (iTime_ts == iTime_te && iTime_ms <= iTime_me))
{
if(TimeHour(ParTime) > iTime_ts || (TimeHour(ParTime) == iTime_ts && TimeMinute(ParTime) >= iTime_ms))
{
if(TimeHour(ParTime) < iTime_te || (TimeHour(ParTime) == iTime_te && TimeMinute(ParTime) <= iTime_me))
{
return(true);
}
}
}
else
{
if((TimeHour(ParTime) > iTime_ts || (TimeHour(ParTime) == iTime_ts && TimeMinute(ParTime) >= iTime_ms)) || (TimeHour(ParTime) < iTime_te || (TimeHour(ParTime) == iTime_te && TimeMinute(ParTime) <= iTime_me)))
{
return(true);
}
}
return(false);
}
//+——————————————————————+
返信にはログインが必要です。