記事"MetaTrader 5のマルチ通貨モードの実行"についてのディスカッション - ページ 5

 
Lazarev:

教えてください、

1. 他通貨のBidとAskのみが必要な場合、「スパイ」を使用するのが妥当でしょうか?

2.単なるアイデアなのですが、onChartEvent関数で、現在の通貨だけでなく、他の通貨からのイベントをチェックする可能性はないのでしょうか?

3.onTimerイベントでタイマーの値を1より小さく設定することは可能でしょうか?そうすることで、相場の値をより頻繁にダウンロードし、それに応じて最小時間だけ最後のティックの時間に遅れます。

4. あるいは、私の場合、"CHARTEVENT_CUSTOM+n "を使用して、他のグラフ上のマッシュの交差をチェックすることは可能ですか?

1.使用する。

2.オプションがあります。他の通貨からのイベントは、OnChartEvent()を持つEAが設定されているチャートに送られるべきです。

3.いいえ。

4.できる。

 

単純な「スパイ・インジケータ」SendEvent.mq5 を作成しました:

#property indicator_chart_window
#property indicator_plots 0
int OnInit()
  {
   return(0);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   EventChartCustom(0,1,0,0,_Symbol);
   return(rates_total);
  }

このインジケーターからイベントを受信し、取引操作を試みる簡単なExpert Advisorを作成しました(以下はその一部で、全文は添付ファイルにあります):

void OnChartEvent(const int id, // ChartEventイベント・ハンドラ
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)            // sparamには楽器の名前が入る
  {
      // イベントが発生した商品のディジット、ポイント、アスク、ビッドを要求する。
      if(!SymbolInfoInteger(sparam,SYMBOL_DIGITS,dig)) Print("SymbolInfoInteger(SYMBOL_DIGITS) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_POINT,p)) Print("SymbolInfoDouble(SYMBOL_POINT) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_BID,Bid)) Print("SymbolInfoDouble(SYMBOL_BID) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_ASK,Ask)) Print("SymbolInfoDouble(SYMBOL_ASK) ERROR!");
      d=(int)dig;
      if(1>0) // いつも買っている
        {
         q.action=TRADE_ACTION_DEAL; // MqlTradeRequest構造体を埋めて、取引操作を試みる。
         q.symbol=sparam; // sparamはツール名を含む
         q.volume=Lot;
         q.price=NormalizeDouble(Ask,d);
         q.sl=NormalizeDouble(Ask-p*StopLoss,d);
         q.tp=NormalizeDouble(Ask+p*TakeProfit,d);
         q.deviation=0;
         q.type=ORDER_TYPE_BUY;
         q.type_filling=ORDER_FILLING_FOK;
         // 現在のツールのプロパティをチェックする
         Print("Bid=",DoubleToString(Bid,8),", Ask=",DoubleToString(Ask,8),", Digits=",d,", Points=",DoubleToString(p,8));
         // 送信するトレード・リクエストの構造をチェックする。
         Print("q.action=",q.action,", q.symbol=",q.symbol,", q.volume=",q.volume,", q.price=",DoubleToString(q.price,d),", q.sl=",DoubleToString(q.sl,d),", q.tp=",DoubleToString(q.tp,d),", q.deviation=",q.deviation,", q.type=",q.type,", q.type_filling=",q.type_filling);
         Print(OrderCheck(q,ch));                                  // 取引操作が可能かどうかをチェックする
         Print("ch.retcode=",ch.retcode,", ch.comment=",ch.comment); // 結果
         Print("OrderSend:",OrderSend(q,s));                        // 取引操作を試みる
         Print("s.retcode=",s.retcode,", s.comment=",s.comment);     // 結果
        }
      if(0>0) // コンディションが改善されれば、販売する。
        {
         // аналогично для продажи
        }
     }
  }

Expert Advisorはインジケーターからイベントを受信しますが、テスター(ビジュアライゼーションの有無にかかわらず)では、取引操作を実行できません - エラー「Invalid Request」が返され、リターンコードは10013です。リアルタイムでは正常に動作します。Expert Advisorの取引操作をOnChartEvent()ではなくOnTick()から実行した場合も問題なく動作します。

CodeBaseの記事の著者が提供するExpert Advisorのテンプレートに トレード要求の送信を挿入してみましたが、トレード操作も機能しません(同じエラー)。

どなたか原因を教えてください。このスレッドで、 OnChartEvent()テスターで処理されないと 読みましたが、この場合、インジケーターから送信されたイベントはテスターで処理されますが、OnChartEvent() からテスターでトレード操作を実行することはできません。

ファイル:
ea.mq5  4 kb
SendEvent.mq5  1 kb
 
zdd:

単純な "indicator-spy "SendEvent.mq5を作成した:

このインジケーターからのイベントを受信し、取引操作を試みる簡単なExpert Advisorを作成しました(その一部を紹介します。全文は添付ファイルにあります):

Expert Advisorはインジケーターからイベントを受信しますが、テスター(ビジュアライゼーションの有無にかかわらず)では取引操作を実行できません - エラー「Invalid Request」が返され、リターンコードは10013です。リアルタイムでは正常に動作します。Expert Advisorの取引操作がOnChartEvent()ではなくOnTick()から実行された場合も問題なく動作します。

CodeBaseの記事の著者が提供するExpert Advisorテンプレートに トレードリクエストの送信を挿入してみたが、トレード操作も機能しない(同じエラー)。

どなたか原因を教えてください。このスレッドで、 OnChartEvent()テスターでは処理されないと 読みましたが、この場合、インジケーターから送信されたイベントはテスターで処理されますが、OnChartEvent() からテスターでトレード操作を実行することはできません。

私の頭の中に魚を持ってきてみてください。もちろん、ロジックは完全ではなく、非常に間抜けなものですが、あなたが必要としているものと非常に似ているようです。

テスターでもデモでも、少なくともマーケットからのポジションはオープンします。

なぜかわからないが(私はそれを理解するのがあまりに怠惰だ)、あなたの例はどんな状況でも私に10013を与えた。

追記

標準的なオブジェクト(CAccountInfoやCTradeなど)にバインドしたほうがよいでしょう。しかし、もしあなたがすべてを自分で書く忍耐力があるのなら、私はそれだけでうれしいです。

ところで、スパイの実装そのものは、この記事から引用するか、変更可能なコピーを作成するのがよいでしょう(たとえば、この年「(long)_Period」を、イベントを送信した日付やその他の有用な情報に置き換えることをお勧めします)。あなたの変形は、どういうわけかかなり「生」である。

ファイル:
DemoEA.mq5  20 kb
 
Interesting:

私の魚が動くかどうか試してみてください。ロジックは不完全で非常に難解ですが、あなたが必要としているものと非常に似ているようです。

ありがとう。構造体MqlTradeRequestと MqlTradeResultを グローバル レベルで宣言すれば、うまくいきます!
 
記事をどうもありがとう!
 

EURUSD、EURGBP、GBPUSDの3つのペアの価格を取得しようとしています。ストラテジーテスターで"All ticks "または "Open prices only "を選択すると、すべてうまくいきます。しかし、"Every tick based on real ticks "を選択すると、なぜか1つの商品で1分間に複数の "New Bar "イベントが発生します。

繰り返しになりますが、例えば2016.07.15から2016.07.19までの間隔を選択することができます。以下はログの例で、7分目、9分目を見てください:

2016.07.15 00:05:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333

2016.07.15 00:05:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119

2016.07.15 00:05:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33399

2016.07.15 00:06:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8334

2016.07.15 00:06:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119

2016.07.15 00:06:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33382

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33381

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33384

2016.07.15 00:08:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83329

2016.07.15 00:08:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11167

2016.07.15 00:08:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394

2016.07.15 00:09:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327

2016.07.15 00:09:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166

2016.07.15 00:09:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33396

2016.07.15 00:09:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327

2016.07.15 00:09:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166

All ticks based on real ticks" モードを選択した場合のこの動作の理由は何ですか?
 
ooparadise:

EURUSD、EURGBP、GBPUSDの3つのペアの価格を取得しようとしています。ストラテジーテスターで"All ticks "または "Open prices only "を選択すると、すべてうまくいきます。しかし、"Every tick based on real ticks "を選択すると、なぜか1つの商品で1分間に複数の "New Bar "イベントが発生します。

繰り返しになりますが、例えば2016.07.15から2016.07.19までの間隔を選択することができます。以下はログの例で、7分目、9分目を見てください:

All ticks based on real ticks" モードを選択したときのこの動作の理由は何ですか?

どのように "New bar "イベントをキャッチしますか?ビルド1375では、ティック到着の精度がミリ秒に改善されました:

テスター:ミリ秒精度の時間のサポートを追加しました。以前のストラテジー・テスターでは、時間精度は1秒でした。

  • EventSetMillisecondTimer関数とSleep関数がストラテジーテスターでより正確に動作するようになりました。
  • 多通貨エキスパートアドバイザーのテストにおけるティック送信の精度が向上しました。以前は、1秒間に複数のティックが配置されている場合(分足のティックボリュームが60以上)、すべてのティックに同じ時間が割り当てられていました。単通貨のExpert Advisorをテストする場合は、ティックがExpert Advisorに順次渡されるだけなので、あまり問題にはなりません。しかし、複数のペアでテストする場合は、どのペアのティックが最初に来たかを知ることが重要です。以前は、各シンボルのティックが順次 Expert Advisor に送信されていました:まず、あるシンボルのすべてのティックが 1 秒間送信され、次に別のシンボルのすべてのティックが送信されます。

    実際のティックでテストする場合、ミリ秒は元のティックデータから取得されます。ティックを生成する際、ミリ秒はティック・ボリュームに従ってスペルアウトされます。例えば、1秒間に3回のティックがある場合、000、333、666ミリ秒が割り当てられます。
 

私は、記事に書かれている方法で新しいバーを キャッチします。つまり、インジケータはこのように「新しいバー」イベントを送信します(前の時間分、時間、日、月と比較して):

   double price_current=price[rates_total-1];

   TimeCurrent(time);

   if(prev_calculated==0)

     {

      EventCustom(CHARTEVENT_INIT,price_current);

      prev_time=time; 

      return(rates_total);

     }

//--- new tick

   if((flag_event & CHARTEVENT_TICK)!=0) EventCustom(CHARTEVENT_TICK,price_current);       


//--- check change time

   if(time.min==prev_time.min && 

      time.hour==prev_time.hour && 

      time.day==prev_time.day &&

      time.mon==prev_time.mon) return(rates_total);


//--- new minute

   if((flag_event & CHARTEVENT_NEWBAR_M1)!=0) EventCustom(CHARTEVENT_NEWBAR_M1,price_current); 

更新:ビルド1375をインストールすると、この問題は解決しました。

 

この大きな記事をありがとう。EventChartCustomのことはこれまで知りませんでした。私は他のチャート・イベントを試していましたが、それらは人間の行動によるイベントしか考慮していませんでした。これは多くのことを解決してくれます。

ちなみに、私はMQL4で仕事をしていますが、98%同じでした。

乾杯

 

本当にありがとう。本当にありがとう!