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

 
Urain:

これは特筆すべき提案 です。

もっとも、普通の論理からすれば、右手で左耳を掻くようなものですが(でも、それはあなた次第ではなく、開発者次第)。

なぜ、非ネイティブの楽器のデータを呼び出すことができるのか?

それでもカスタム指標を 作成し、必要なシンボルから呼び出す必要がある場合は、一般的に、結論は私が買う頭を考えることです。

このような呼び出しの可能性は必要であり、開発者はインデックスを書くときにそのようなアプローチを想定できなかったに違いない。

つまり、ユーザーのインジケーターのパラメーターにツール表示があることです(彼らの意見では、本来あるべきiCustom()パラメーターにはありません)。


追記

iCustom()の優先順位は、当初は機械的な取引に与えられていたようで、実際には、いくつかの瞬間が考慮され、いくつかのアクションがExpert Advisorで実行され、その後、iCustom()がカスタムインジケータ用に呼び出されることを想定しているようです。

そうでなければ、インディのコードを実装するプログラマーにすべての作業と責任がかかってしまいます(あまりに派手なインディは、システム全体のブレーキやクラッシュにつながる可能性があるので、致命的なエラーや結果につながる可能性があります)。

 
Urain:

注目に値する提案 です。

EURのインジケーターはJPYのデータで準備万端といいつつも(例えば円の履歴だけでは物足りず)

この長さのデータはないし、何を教えてくれるんだろう ? 同じ曲なのに。

エラーやボトルネックをネイティブツールで処理する方がはるかに簡単で、Expert Advisorやデータ要求インジケータでの呼び出しの前後に予備チェックと最終チェックが行われます。

2つ目の方法があると仮定すると、私の視点からは根本的に間違っている。このロジックでは、インジケータに1つ以上の関数を作成し(電卓から呼び出されます)、その中で必要なものをすべて計算し、結果を電卓に返す必要があります。

追記

しかし、ここで問題なのは、任意のシンボルのバーの本数を 計算することができることです。しかし、それ以外のことはどうでしょうか?

 
Prival:

バグです。説明ATSは常にマーケットにある(ダブルロット0.2によるロールオーバー)。

テストモード全チックすべてが正常です。

テストモードで、価格を開くことによって、同じ作品。

なぜか2つの取引に分かれてしまう。表示方法のせいかもしれないが、おかしい。

オープニング コマンドとクロージングコマンドを並べ替える。この順序であるべきです

- しゅうしょくぐち

- じょうをおさえる

- オープンポジション

そうすると、クローズポジションとオープンポジションが同じバー上にあることになります。

 
gpwr:

オープニングコマンドとクロージングコマンドを並べ替える。順番は以下のようにします。

- しゅうしょくぐち

- じょうをおさえる

- オープンポジション

そうすれば、クローズとオープンが同じバー上になります。

0.1の買い相場であれば、0.2の売りを建てます。この操作の結果は、2回の取引ではなく、1回の取引で0.1.1となるはずです。

開発者の方々は、私の言っていることを理解してくれたのだと思います。

 

このようなコードを書きました。

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property indicator_label1  "I1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "I2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         I1Buffer[];
double         I2Buffer[];
int OnInit()
  {
   SetIndexBuffer(0,I1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,I2Buffer,INDICATOR_DATA);
   return(0);
  }

int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
   string Symbol_1="EURUSD",Symbol_2="GBPUSD";
   if(rates_total<1) return(0);
   double Arr1[],Arr2[];
   int end,rez0,rez1;
   end=MathMin((int)SeriesInfoInteger(Symbol_1,0,SERIES_BARS_COUNT)-1,(int)SeriesInfoInteger(Symbol_2,0,SERIES_BARS_COUNT)-1);
   end=MathMin(end,rates_total-prev_calculated+1);
   rez0=CopyClose(Symbol_1,PERIOD_CURRENT, 0,end, Arr1);
   if(rez0==-1){Print("Ошибка копирования ",Symbol_1," ",GetLastError()); return(0);}
   rez1=CopyClose(Symbol_2,PERIOD_CURRENT, 0,end, Arr2);
   if(rez1==-1){Print("Ошибка копирования ",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez0){Print("Ошибка Синхронизации"); return(0);}
  
   ArraySetAsSeries(Arr1,true);
   ArraySetAsSeries(Arr2,true);
     
   int li=rates_total-1;  
   for(int i=0;i<end;i++)
     {      
      I1Buffer[li]=Arr1[i]+0.26;
      I2Buffer[li]=Arr2[i];
      li--;
     }
   return(rates_total);
  }

問題なく動作しているようですが、すべてを考慮に入れているかどうかはわかりません。
もしそうなら、ここにバリエーションがあります。
正しくない場合は、修正してください。

 

さて、質問があります。

Expert Advisorからインジケータを呼び出すと、値が一致しないのはなぜですか?

例:インジケータが1.5123、EAが1.5117を取得

読み方が分からないので、見逃さないように使ってみました。

static int Handle;
int bars;
void OnInit()
  {
   Handle=iCustom(NULL,0,"proverka");
  }

void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   double buf1[],buf2[];    
   if(CopyBuffer(Handle,0,0,2,buf1)<0 || CopyBuffer(Handle,1,0,2,buf2)<0)Alert("Ошибка копирования значений индикаторных буферов ",GetLastError(),"!!");
   Print("Время "+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),"   буф1-",buf1[0],"   буф2-",buf2[0]);
  }

と画像

そして、最初のバッファ、実行中の楽器が一致する。

ファイル:
prover.mq5  1 kb
proverka.mq5  2 kb
 
ddd06:

さて、質問があります。

Expert Advisorからインジケータを呼び出すと、値が一致しないのはなぜですか?

例:インジケータが1.5123、EAが1.5117を取得

以下は、添付ファイルと重複していますが、EAのコードです。

そして、インジケーターの前の値を見るのです。正確には1.5117ではないでしょうか。現在(最後)の値をインデックス 1 で取る。または配列の代入 SetAsSeries(bufX,true)
 
stringo:
そして、前回のインジケーターの値を見るわけです。
1.512380 - 現在 1.512310 - 以前
 
ddd06:

こんなコードを書きました

問題なく動作しているようですが、すべてを考慮しているかはわかりません。
もしそうなら、こんなバリエーションもありますよ。
正しくない場合は、修正してください。

そうそう、私の作り直したバージョンでは、配列の長さのチェックも行っているのですが、いつものようにシリーズの方向性に迷ってしまいました。

で、描画は進むのですが、配列の長さがグラフの長さより短いので、端から真ん中(あたり)まで描画されてしまうことが判明しました。

だから、レンダリングがないという印象があったんです。

総じて、この場では長い間、混乱が続くのではないかと思っています。

というのも、同じ問題がmql4.comの訪問者にもあり、現在はこちらでダウンロードされているからです。

 
Urain:

そうなんです。

それは素晴らしいことです。コードがシンプルでローカルなので、ベースとして使えると思います。

EAに関する質問 -サービスデスクに手紙を 出すべきですか?

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.