初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 563

 
Василий:
はい、MQL 5について質問しているのですが? はい、現在のシンボルのデータにアクセスする必要があります。EAコードに必要なデータです。ですから、例えば、現在のバーの前のバーの終値を 知る必要があります。
CopyTimeの例を ご覧ください。
 
Karputov Vladimir:
CopyTimeの例を ご覧ください。
了解です、何とかしてみます。ありがとうございました。
 
Василий:
はい、MQL5について質問しています。 はい、現在のシンボルのデータにアクセスする必要があります。Expert Advisorのコードに必要なデータです。例えば、現在のバーの前のバーの終値を 知る必要があります。

少しはドキュメントを読んだらどうなんだ。

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

以下は終値とインジケータバッファを取得する例です。

ENUM_ORDER_TYPE indicator_01()
  {
   double ma[2];
   double close[2];
   static int h_ma=INVALID_HANDLE;
   if(Bars(_Symbol,PERIOD_CURRENT)<ma_period+1)return(WRONG_VALUE);
   if(h_ma==INVALID_HANDLE || h_ma==0)
     {
      h_ma=iMA(_Symbol,_Period,ma_period,ma_shift,ma_method,ma_price);
      return(WRONG_VALUE);
     }
   if(CopyBuffer(h_ma,0,1,2,ma)<2) return(WRONG_VALUE);
   if(CopyClose(_Symbol,PERIOD_CURRENT,1,2,close)<2) return(WRONG_VALUE);

   if(close[1]>ma[1]&&close[0]<ma[0])return(ORDER_TYPE_BUY);
   if(close[1]<ma[1]&&close[0]>ma[0])return(ORDER_TYPE_SELL);

   return(WRONG_VALUE);
  }
 
Sergey Gritsay:

...

以下は、終値とインジケータ・バッファを取得する例です。

悪い例です。MQL5では、インジケータ・ハンドルを格納する変数は、「ヘッダー」つまりグローバル変数の 領域で宣言されなければならず、ハンドルはOnInit()で取得されなければなりません。そして、その時だけ、プログラムのどこからでもデータを取得できるように、インジケーターのハンドルを参照することができます。
 

皆さん、こんにちは。

OnTradeイベントを使って、テスターで取引履歴のデータを取得しています。

  for(int i=0;i<HistoryDealsTotal();i++){
       ulong deal_ticket=HistoryDealGetTicket(i);
       Print("ticket=",deal_ticket);
       Print("price=",HistoryDealGetDouble(deal_ticket,DEAL_PRICE));
       Print("time=",TimeToString(HistoryDealGetInteger(deal_ticket,DEAL_TIME)));

そして、過去ログにはこんなものが出てきます。

0 22:58:16.487 Core 1 2016.04.01 00:00 シンボル期間GBPUSDの現時点での端末履歴のバー数=7729本
JR 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ロット0.01でトレード 0を試行。
EL 0 22:58:16.487 Core 1 2016.04.01 03:00:00 成り行き買い 0.01 GBPUSD sl: 1.43033 tp: 1.44034 (1.43646 / 1.43654 / 1.43646)
GO 0 22:58:16.487 Core 1 2016.04.01 03:00:00 deal #2 buy 0.01 GBPUSD at 1.43654 done (based on order #2)
GE 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ディール実行 [#2 buy 0.01 GBPUSD at 1.43654].
NK 0 22:58:16.487 Core 1 2016.04.01 03:00:00 order performed buy 0.01 at 1.43654 [#2 buy 0.01 GBPUSD at 1.43654 ]です。
HI 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ticket=1
HM 0 22:58:16.487 Core 1 2016.04.01 03:00:00 price=0.0
HH 0 22:58:16.487 Core 1 2016.04.01 03:00:00 time=2016.04.01 00:00
CR 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ticket=2
ID 0 22:58:16.487 Core 1 2016.04.01 03:00:00 price=1.43654
OP 0 22:58:16.487 Core 1 2016.04.01 03:00:00 time=2016.04.01 03:00

価格ゼロの最初の取引はどこから来るのか?しないのです :-)

私はそれをしない:-)説明plz。

Z.P.わかったような気がします。最初の取引では、10Kの利益がある。どうしたらいいのかわからないが、やはり不思議である。なぜ?

そして、もうひとつの疑問があります。取引(1.43654での買い)はまだ始まっていない。歴史の中でどのように登場したのでしょうか。

MQL4のように、クローズしたトレードのデータのみを配列で取得する必要があります。どうすればいいのか?

追伸:DEAL_ENTRY_OUTで フィルタリングする

 
Alexandr Saprykin:
端末の再インストールは試されましたか?
はい、ありがとうございます。それだけが救いでした。
 
Karputov Vladimir:
悪い例です。MQL5でインジケータ・ハンドルを格納する変数は、「ヘッダー」-プログラムのグローバル変数 領域-で宣言する必要があり、OnInit()でハンドルを取得します。そして、その時だけ、プログラムのどこからでもデータを取得できるように、インジケーターのハンドルを参照することができます。

OnInit()関数は一度だけ実行され、初回からインジケータが作成される保証は100%ないので、ハンドルの取得についてはあまり同意できません。変数を宣言するのは正しいかもしれませんが、以下のドキュメントにstatic変数を使ったバリアントより悪いことが書いてあるかどうか知りたいのです。

static キーワードで宣言されたローカル変数は、関数が存在する限り、その値を保持します。その後、関数を呼び出すたびに、これらのローカル変数には、前回の呼び出し時に持っていた値が格納されます。

 
<br /> translate="no">。

DEAL_ENTRY_OUTで 絞り込む

 
Sergey Gritsay:

OnInit()関数は一度だけ実行され、初回からインジケータが作成される保証は100%ないので、ハンドルの取得についてはあまり同意できません。変数の宣言については正しいかもしれませんが、スタティック変数のオプションがどの程度悪いのか、ドキュメントで知りたいのです

...

インジケータ・ハンドル作成 時のOnInit()で確認することにします。インジケータ・ハンドルが作成されていない場合、onOnit() でINIT_FAILED を返します。つまり、インジケータ・ハンドルは一度だけ、OnInit()の中だけで作成されるのです。これは「4」ではなく、プログラムの隅々までごちゃごちゃと迷走し、ハンドルを宣言しているのです。
 
Karputov Vladimir:
このため、OnInit()では、インジケータ・ハンドルが作成 されているかどうかをチェックします。インジケータ・ハンドルが作成されていない場合、OnOnit()はINIT_FAILEDを 返す必要があります。つまり、インジケータ・ハンドルは一度だけ、OnInit()の中だけで作成されるのです。これは「4」ではない。プログラムの隅々まで、ごちゃごちゃと彷徨い、ハンドルを宣言しているわけではない。
私は、そこまで断定的なことは言いません。クローゼットの中がごちゃごちゃしているのではなく、頭の中がごちゃごちゃしているのだ(C)
理由: