質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

2回答

998閲覧

自作EAで取引期間指定をしたい

doricyan999

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

2クリップ

投稿2020/01/30 17:36

下記の通りif文で取引期間を指定し、条件通りならOrderSend()関数で新規注文するように書いたつもりなのですが、バックテストをしてみるとまったくトレードをしてくれません。

試しにリアルタイムのデモトレードでEAを稼働させてみたら、OrdersTotal() == 0 の条件も無視
し、OrderModify()の指値&逆指値も無視して新規注文を連発します。

わかる方、ご教授お願い致します。

EAセッティング画面

MetaEditorのワーニングメッセージ

#property version "1.00" extern string coin = "EURJPY"; extern int magic02 = 2345; input double lots = 0.01; double Pips = 0; extern int tp = 100; extern double sl = 25; static int TicNum01; int OnInit() { Pips = AdjustPoint(Symbol()); return 0; } void OnTick() { bool TradeTime; if(StartTimeS() <= EndTimeS() && TimeCurrent() >= StartTimeS() && TimeCurrent() <= EndTimeS()) TradeTime = true; //ショート if(OrdersTotal() == 0 && TradeTime == true) { TicNum01 = OrderSend(coin,OP_SELL,lots,Bid,3,0,0,"Sell",magic02,0,Yellow); bool Modified01 = OrderModify(TicNum01,Bid,Bid + sl*Pips,Bid - tp*Pips,0,Yellow); } } double AdjustPoint(string Currency) { int Symbol_Digits = (int)MarketInfo(Currency,MODE_DIGITS); if(Symbol_Digits == 2 || Symbol_Digits == 3) { double Calculated_Point = 0.01; } else if(Symbol_Digits == 4 || Symbol_Digits == 5) { Calculated_Point = 0.0001; } return(Calculated_Point); } int StartTimeS() { (Year() == 2019 && Month() == 3 && Day() == 11 && Hour() == 15 && Minute() == 30); return 0; } int EndTimeS() { (Year() == 2019 && Month() == 6 && Day() == 15 && Hour() == 20 && Minute() == 30); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

MQL4言語の詳細は存じませんが、C言語ベースと言うことなのでそれから考えると、自作されたStartTimeS関数もEndTimeS関数も以下のようになっていて、常に0を返すのではないでしょうか。それでは意味が無いように思います。

MQL4

1{ 2 (Year() == 2019 && Month() == 3 && Day() == 11 && Hour() == 15 && Minute() == 30); 3 4 return 0; 5}

StartTimeSEndTimeS0を返すとして、TimeCurrentとやらはMQL4においては最後の既知のサーバー時間を返すそうですから、そこから考えると

MQL4

1if(StartTimeS() <= EndTimeS() && TimeCurrent() >= StartTimeS() && TimeCurrent() <= EndTimeS()) TradeTime = true;

の部分は以下のように置き換えられます。

MQL4

1if (0 <= 0 && 最後のサーバー時間 >= 0 && 最後のサーバー時間 <= 0) { 2 TradeTime = true; 3}

最後のサーバー時間 <= 0は有り得ないので偽(false)となるでしょうから、TradeTime = true;が実行されることは無いと思います。あと気付いたところでは、AdjustPoint関数で

MQL4

1if(Symbol_Digits == 2 || Symbol_Digits == 3) 2 { 3 double Calculated_Point = 0.01; 4 }

のようにコーディングされています。if文のカッコの中でCalculated_Point変数を再定義しています。これではreturnで返すCalculated_Point変数に作用しないはずです。

MQL4言語(≒C言語)の文法に照らし、コードを再確認されることをお勧めします。
※「具体的にどう直したら良いのか?」と聞かれると、質問者さんのトレードの出来に関わってしまいそうなので、回答は控えさせてください。

投稿2020/01/31 02:39

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

doricyan999

2020/01/31 11:29

関数を下記のように書き換えてワーニングメッセージは消えましたが、バックテスト&リアルタイムデモトレードともに機能しませんでした。 ``` int StartTimeS(int a, int b, int c, int d, int e) { return Year() == a && Month() == b && Day() == c && Hour() == d && Minute() == e; } int EndTimeS(int a, int b, int c, int d, int e) { return Year() == a && Month() == b && Day() == c && Hour() == d && Minute() == e; } ``` 下記は外に書いた変数 ``` extern int sy = 2020; extern int sm = 1; extern int sd = 2; extern int sh = 15; extern int sf = 30; extern int ly = 2020; extern int lm = 2; extern int ld = 2; extern int lh = 15; extern int lf = 30; ``` if文に加えた引数 ``` StartTimeS(sy, sm, sd, sh, sf) EndTimeS(ly, lm, ld, lh, lf) ``` コメントで出力してみたら ``` Comment("サーバータイム : " + TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES) + "\n"+ "関数タイム : " + TimeToStr(StartTimeS(sy, sm, sd, sh, sf),TIME_DATE|TIME_MINUTES)); ``` 関数タイムは初期値の1970.01.01 00:00になってました。
k-4

2021/02/01 11:46

この記述はif文を省略されているのですかね? return Year() == a && Month() == b && Day() == c && Hour() == d && Minute() == e; return false && false && false && false && false; と同じ意味になると思いますが。。。 なので、結果は0を返すと思います。
guest

0

トレード時間に制限を付けたいだけなら、string型に変換して比較でも行けますよ。
下記のコードは検証してないですが。。。

strDate = TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);

if(strDate > "2021.01.01 00:00")
{
Alert("test");
}

あと、TimeCurrentはサーバ時刻なので、
配置されている国によっては手元の時計とは時差があるかもなのでご注意ください。

投稿2021/02/01 11:00

k-4

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問