エラー、バグ、質問 - ページ 936

 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);

   if(prev_calculated<rates_total)
     {
      for(i=0;i<rates_total;i++)
     // for(i=prev_calculated-1;i<rates_total;i++)
        {
         CopyRates(symbol1,0,time[i],1,rates1);
         CopyRates(symbol2,0,time[i],1,rates2);
         ind1[i]=mass_of_symbol1*rates1[0].close-mass_of_symbol2*rates2[0].close;
        }
     }



//--- return value of prev_calculated for next call
   return(rates_total);
 

インジケータSpread_of_symbolsの上記のコード...私はそれが速く動作するようにそれを書き換えることにしました...とコードが登場し、以下を参照してください...データがコピーされていない...あなたはコード内の1から0にデータをコピーする場合、指標は非常に高速ですが、範囲外のエラーが発生します...何がコードで間違っているか以下をご覧ください...?

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);
   
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) 
      to_copy++;   
     }
   if(CopyRates(symbol1,0,0,to_copy,rates1)<=0)
     {
      Print("Данные по первому символу не скопированы, ошибка  ",GetLastError());
      return(0);
     }
   if(CopyRates(symbol2,0,0,to_copy,rates2)<=0)
     {
      Print("Данные по второму символу не скопированы, ошибка ",GetLastError());
      return(0);
     }
   if(prev_calculated<rates_total)
     {
     int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
   for(int i=limit;i<rates_total;i++)
        {
         ind1[i]=mass_of_symbol1*rates1[i].close-mass_of_symbol2*rates2[i].close;
        }
     }
   return(rates_total);
  }
 
FinEngineer:
MQL5 Reference Guide / タイムシリーズとインジケータへのアクセス / データアクセスの整理を参照してください。
 
FinEngineer: が、out of rangeのエラーが出てしまう...以下のコードのどこがおかしいのか...?
to_copyとlimitの値が互いに一致するかどうかを確認する。
 
可視化モードでは、2つのシンボルで取引している場合、同時に取引を終了すると、Expert Advisorを実行しているシンボルのデータのみが履歴に表示されます。もう一方のシンボルからのデータは、さらに取引を開始した後に履歴タブに表示されます。そのため、取引タブと 履歴タブの データが異なる時期があります。
 
JF 0 Trades 19:31:10 '***': キャンセルオーダー #3694236 buy stop 1.10 AUDJPY.m at 95.679<br / translate="no">DS 0 Trades 19:31:10 '***': キャンセルオーダー #3694238 buy limit 1.10 AUDJPY.m at 93.876をキャンセルしました。
DH 0 トレード 19:31:10 '***': キャンセルオーダー #3694237 買いストップ 0.36 AUDJPY.m at 95.679
FI 0 トレード 19:31:10 '***': キャンセルオーダー #3694239 買い指値 0.36 AUDJPY.m at 93.876
FP 0 トレード 19:31:10 '***': キャンセルオーダー #3694236 買いストップ 1.10 AUDJPY.m at 95.679 done
QE 0トレード 19:31:11 '***': キャンセルオーダー #3694238 買い指値 1.10 AUDJPY.m at 93.876 完了しました。
CG 0 トレード 19:31:11 '***': キャンセルオーダー #3694237 買いストップ 0.36 AUDJPY.m at 95.679 done.
OL 0 トレード 19:31:11 '***': キャンセルオーダー #3694239 買い指値 0.36 AUDJPY.m at 93.876 完了しました。

ログによると、4つの保留中の注文が、すぐに削除されたようだ。しかし、onTradeTransactionでは、15秒程度で応答があり、この間にティックが来ていた。

KH 0 prp5 (EURUSD.m,M1) 19:31:23 TS=6 cancel sl _ OnTrade PENDING id=84 m=3 b/s=SELL Err=Bidが完了しました。
***

JG 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete tp _ OnTrade PENDING id=85 m=3 b/s=SELL Err=Bid completed
***
RL 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete sl _ OnTrade PENDING id=86 m=3 b/s=SELL Err=Bid completed
***

HK 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete tp _ OnTrade PENDING id=87 m=3 b/s=SELL Err=注文が成立しました。

しかし、ここにも不思議なことがある。

IE 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 =O= Deal close/reverse price=95.648 m=3 b/s=SELL ...==>OrderSendAsyncの前の時間。
ES 0 prp5 (EURUSD.m,M1) 19:31:29 TS=6 case 8(real) m=3 b/s=SELL Err=Order placed ==>After OrderSendAsync、3秒は長すぎるようです。

追伸:Expertの実行に遅れがあったようですが、OnTradeTransactionのパケットがどのくらいキューに残るのかが気になりますね。

 
fyords:

参考文献より

MQL5リファレンス /標準ライブラリ/ パネルやダイアログを作成するためのクラス / CWnd / StateFlagsSet

どのような特性ですか?

StateFlagsプロパティではなく、状態を設定します。状態を変化させるグループ方式。個々の状態フラグを変更する上記の方法だけです。

別途ご使用ください。

 

データアクセス組織」を見て、データを汲み上げるサンプルスクリプトを見て、すべてを理解した上で、次のような疑問が生まれました。

1.なぜ、このコードをOnInit関数に書いて、開始時にインジケータが自分の履歴をダウンロードして時系列を準備するようにできないのでしょうか?Expert Advisorにそのようなチェックを書き込むことはできますか?

2.このチェックはどれくらいの頻度で行えばよいのでしょうか。Expert Advisorに1、indicatorsに2?コピーする履歴や時系列を一度だけ用意すれば、今後、コピー時のエラーは発生しないのでしょうか?それとも、履歴や時系列の準備ができたかどうか、その都度、あるいは時々、確認しなければならないのでしょうか?

3.このチェックは、複数のタイムフレームやシンボルを使用するインジケーターやExpert Advisorにのみ必要ですか、それとも全てに必要ですか?

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
スワップ処理は非同期であり、インジケータはデータを待つことができない。そのため、initeで問い合わせを行い、待機やスローダウンは一切行わず、oncalculateで空き状況やカウントを確認することだけが可能である。

注意 - インジケータは待機やループの権利を持たず、そうでなければ後続のインジケータの計算を停止させます。
 
Renat:
スワップ処理は非同期であり、インジケータはデータを待つことができない。そのため、initeで問い合わせを行い、決して待ったり遅くしたりせず、oncalculateでだけ空き状況やカウントを確認することができます。注意:インジケータは待機やループの権利を持たず、そうでなければ後続のインジケータの計算を停止させます。

1 では、どこにデータをページングすればいいのか?通貨ペアのバスケット、多くのシンボルでインジケータを作りたい場合...それぞれについて、データのチェックと入れ替えが必要なのですが、インジケータからスクリプトを実行すればいいのでしょうか。なぜ、ある指標が後続の指標の計算を殺してしまうのでしょうか?次の指標では、BarsCalculated(indicator1_Handle)で前の指標の計算のチェックを使い、計算させてデータをダウンロードすればいいのですが、間違っているでしょうか?

2 別の種類の質問ですが、関数内でインジケータ・ハンドルを宣言すると、カウントが始まるのでしょうか?それとも、コピーするコマンドを出す前にカウントが始まってしまうのでしょうか?