MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1929

 
という疑問が湧いてきました。開いているウィンドウの数とそのIDを知る方法。最初のウィンドウ、現在のウィンドウ、次のウィンドウのIDしか取得できないことがわかりました。合計を取得することはできず、最初の非エクステンションのみで、次のウィンドウがないことをどう理解すればよいのか、正しく理解しています。
 
Valeriy Yastremskiy #:
という疑問が湧いてきました。開いているウィンドウの数とそのIDを知る方法。最初のウィンドウ、現在のウィンドウ、次のウィンドウのIDしか取得できないことがわかりました。合計を取得することはできず、最初の非エクステンションのみで、次のウィンドウがないことをどう理解すればよいのか、正しく理解しています。
    long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol)
        break;
      currChart=ChartNext(currChart);
      if(currChart==-1) break;
      i++;
    }
    symb=ChartSymbol(currChart);
 
Vitaly Muzichenko #:

すべてのオープンポジションでウィンドウが開いていることを前提とすることはできません。したがって、アルゴリズムは、必要なシンボルを持つウィンドウを探し、それがない場合は、ウィンドウを開き、状況を描画する必要があります。つまり、レベル、そしてどのSLで変更が発生したかを探し、レベルの削除または色の変更を行います。

 
Valeriy Yastremskiy #:

すべてのオープンポジションでウィンドウが開いていることを前提とすることはできません。したがって、アルゴリズムは、必要なシンボルがあるウィンドウを探し、それがない場合は、ウィンドウを開いて状況を描画する必要があります。つまり、レベル、そしてどのSLで変更が発生したかを探し、削除またはレベルの色を変更します。

フラグを立て、開いている窓があれば描画し、開いていなければスキップする。開いている/閉じていないでは、開く意味も描く意味もない

    long currChart=ChartFirst();
    int i=0;
    flag=false;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol) {
        flag=true;
        break;
      }
      currChart=ChartNext(currChart);
      if(currChart==-1) break;
      i++;
    }
    if(flag) {
    symb=ChartSymbol(currChart);
    ...
 
Vitaly Muzichenko #:

開いている窓があればフラグを立てて描画し、開いていない窓があればスキップする。開閉がわからないと、開閉して描画する意味がない

シンボルが開いていない場合に新たに開くかどうかは、お客様次第です。私にとっては、オープニングでお客様の状況をより詳しく知ることができます。検索から、探しているシンボルのウィンドウIDが必要です。次に、探しているウィンドウに描画 します。

int FcurrChartSimbol(symbol){   
long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol)
      return(currChart);
      currChart=ChartNext(currChart);i++;
      if(currChart==-1)return(-1);
      
    }}

Zyが訂正しました。これは関数です)))

 
Valeriy Yastremskiy #:

シンボルが開いていない場合、新たに開くかどうかは、お客様の判断によります。私にとっては、オープニングの方がお客様の状況を包括的に説明できるのです。検索から、探しているシンボルのウィンドウIDが必要です。次に、探しているウィンドウに描画 します。


Zyが訂正しました。機能である))

最適には、グローバルに見えるオープンチャートの配列を埋めてから、その配列で作業します。

int FcurrChartSimbol(symbol) {   
   long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      i++;
      mass[i-1]=currChart;
      currChart=ChartNext(currChart);
      if(currChart==-1)
        break;
    }
   return(i); // количество графиков
}

次に、例えばポジション数が変更された場合など、フィリングを更新するイベント時に実行します。

int OT=OrderTotal();
if(OT != pOT) {
 FcurrChartSimbol(symbol);
 pOT=OT;
}

これにより、無駄なループを走らせる必要がなくなり、負荷が軽減されます

 
Vitaly Muzichenko #:

最適には、グローバルに見える配列にオープンチャートを記入し、その配列で作業します。

次に、例えばポジションの数が変わったときなど、フィリングを更新するイベントで実行します。

これにより、負荷が軽減され、無駄なループが不要になります。

何か見落としているのかもしれませんが、なぜSYMBOL_SELECTとSYMBOL_VISIBLEを使ってチャートが開いているかどうかを判断しないのか理解できません

注文を通すときに、チェックをする

    if(!SymbolInfoInteger(Order_Symbol, SYMBOL_SELECT) || !SymbolInfoInteger(Order_Symbol, SYMBOL_VISIBLE))
      SymbolSelect(Order_Symbol, true);
 
Alexey Viktorov #:

何か見落としているのかもしれませんが、なぜSYMBOL_SELECTとSYMBOL_VISIBLEでチャートの開きを判断しないのか理解できません

オーダーを通し、チェックを行う

これは別のオペラのもので、オープンチャートではなく、マーケットウォッチに 関係するものです。それとも、そうなのか?

追伸:オープンポジションがある場合、マーケットウォッチの シンボルはとにかく表示 されます。
 
Vitaly Muzichenko #:

それは別のスレッドのもので、オープンチャートではなく、マーケットウォッチに 関係するものです。それとも、そうなのか?

追伸:オープンポジションがある場合、マーケットウォッチの シンボルはとにかく表示 されます。

SYMBOL_SELECT はい、しかし SYMBOL_VISIBLE は必要ありません。

そうそう、オープンチャートでなくてもいいというのは、私も同感です。

 
Vitaly Muzichenko #:

最適には、グローバルに見える配列にオープンチャートを記入し、その配列で作業します。

次に、例えばポジションの数が変わったときなど、フィリングを更新するイベントで実行します。

これで負荷が軽減され、無駄なループを回す必要がない

その理屈は理解できない。ポジションを開く、SLを変更する、ポジションを閉じるなどのイベントが数シンボル分モニターされます。ポジションをオープンすると、指定されたシンボルのウィンドウが開いているかどうか(ウィンドウIDを探す)、開いている場合はレベルを描き、SLトロールを監視します。そうでない場合は、必要なシンボルとタイムフレームでウィンドウを開き、レベルを描画するか、ウィンドウを開かないかのどちらかになります。修正のイベントは、必要なシンボルウィンドウを見つけ、レベルはすでに描かれており、レベルの色を変更したり、削除して再度レベルを描画します。

一般的に、クライアントの影響を排除するために、作業の開始時に、ポジションと窓を分析し、ポジションが開いているシンボルと窓が開いていないシンボルを分析する必要があります。