どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 501

 

皆さん、こんにちは。

新ビルドでのインジケーターの始まりについてコメントください。サイクルスタート(正しいやり方)に興味がある。以下はBolingerBandsのコードです。疑問のある箇所にはコメントをお願いします//どんな意味があり、何のために あるのか?

これまでのチュートリアルでは、すべてが同じで、https://book.mql4.com/ru/samples/icustom

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[])
  {
   int i,pos;
//---
   if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)    //что это значит ?
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtMovingBuffer,false);                //что это значит ?
   ArraySetAsSeries(ExtUpperBuffer,false);                 //что это значит ?
   ArraySetAsSeries(ExtLowerBuffer,false);                 //что это значит ?
   ArraySetAsSeries(ExtStdDevBuffer,false);                //что это значит ?
   ArraySetAsSeries(close,false);
//--- initial zero
   if(prev_calculated<1)                                  //что это значит ?
     {
      for(i=0; i<InpBandsPeriod; i++)                      //что это значит ?
        {
         ExtMovingBuffer[i]=EMPTY_VALUE;                   //что это значит ?
         ExtUpperBuffer[i]=EMPTY_VALUE;                    //что это значит ?
         ExtLowerBuffer[i]=EMPTY_VALUE;                    //что это значит ?
        }
     }
//--- starting calculation
   if(prev_calculated>1)                                   //что это значит ?
      pos=prev_calculated-1;                               //что это значит ?
   else                                                    //что это значит ?
      pos=0;//что это значит ?
//--- main cycle
   for(i=pos; i<rates_total && !IsStopped(); i++)          //что это значит ?
     {
      //--- 
      
      //код индикатора в цикле
      
      //---
     }
//---- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
 

そして、ドキュメントを読む?理解しがたい表現を踏んで、魔法のF1キーを押すか、ホームページで読むか。

https://docs.mql4.com/ru/array/arraysetasseries

https://docs.mql4.com/ru/basis/function/events#oncalculate

 

皆さん、こんにちは。状況がつかめないので、助けてください。

私のコードでは、buf0は 画面に描画される必要があり、buf1は 描画されず、さらなる配列処理と別のバッファ(例えばbuf2)への出力のためにカウントされます。 buf1 を文字列で隠している。

SetIndexBuffer(0,Buf0)を設定。

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1)を設定します。

SetIndexBuffer(1,Buf1)を設定。

SetIndexStyle (1,DRAW_NONE); // この の線を隠したい

しかし、インジケータを設定すると、計算の違いからオフセットが発生してしまう...。

質問: この差をなくして、buf0が 正常に描画されるようにする方法はありますか?
ファイル:
testbuf.mq4  2 kb
 
clubsmi:

皆さん、こんにちは。現状が把握できないので、助けてください。

私のコードでは、buf0は 画面に描画される必要があり、buf1は 描画されず、さらなる配列処理と別のバッファ(例えばbuf2)への出力のためにカウントされます。 buf1 を文字列で隠している。

SetIndexBuffer(0,Buf0)を設定。

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1)を設定します。

SetIndexBuffer(1,Buf1)を設定。

SetIndexStyle (1,DRAW_NONE); // この の線を隠したい

しかし、インジケータを設定すると、計算の違いからオフセットが発生してしまう...。

質問: この差をなくして、buf0が 正常に描画されるようにする方法はありますか?

INDICATOR_DATAとINDICATOR_CALCULATIONについてお読みください。

そしてその前に#property indicator_buffers と IndicatorBuffers(10); 10 は私のインジケータからで、ME 509 ビルドのようにバッファの数に制限がないことを示すために削除していません。

 
F1を押すことが多いのですが、弱小プログラマーにはよくわからないことがあります。例:ArraySetAsSeries -> 指定された動的配列オブジェクトに AS_SERIESフラグを設定し、配列要素は時系列で インデックス化されます。

パラメータ

array[]

[in][out] 設定する数値の配列。

フラグ

[in] 配列のインデックス付けの方向。

戻り値

成功した場合はtrueを、そうでない場合はfalseを返す。

しかし、何を与え、どのようになるのか for(i=0; i<InpBandsPeriod; i++) and for(i=InpBandsPeriod; i<0; i--) .trueとfalseはループに反映されるのでしょうか。build 5xxでは存在しませんでした。 ArraySetAsSeries を使わなくても可能かもしれませんが、その場合、デフォルトはどうなるのでしょうあるいは、そうでないかもしれません。

 

AlexeyVikのおかげで、解決しました...

509ビルドの古いmql4言語はいつまで使えるのか、新しいビルドから急いで言語を習得する必要があるのか、どなたか教えてください。

 
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

kimの機能が使えない...。

if(IsNewBar()==true)
{
if(ExistPositions(NULL,-1,44444,-1)==false)
           {
       
                  trade=true;
                         
            if(trade!=false)
              {
                    
                        OpenPosition(Symbol(),OP_BUY,0.1,Ask-sl*Point,Ask+tp*Point,44444);

                        trade=false;
                       }
                   
      }
  }            
       }   

ウィザードでこれ以上ポジションがなければポジションが開く はずなのですが・・・・・・私との新しいバーごとに開いてしまうのです・・・・・。

 
Zver4991:


kimの機能が使えない...。

ウィザードでこれ以上ポジションがなければポジションが開くはずなのですが・・・・・・私との新しいバーごとに開いてしまうのです・・・・・・。


この ot -open time(0- any open time)を見て、あなたはどう思いますか?

 
gince:


この ot - open time(0 - any open time)を見て、あなたはどう 思いますか?

そして、なぜ

trade=true;if(trade!=false) .......
                          

がない場合は、オープン

 
gince:


この otを 見る - オープニングタイム( 0 - 任意のオープニングタイム)、そしてあなた?


ということは、そのようなマジックを使って、何時オープンしてもオープンポジションが ないことを確認する必要がありますね...マジックの単純な制限...乾杯

if(ExistPositions(NULL,-1,44444,-1)==false)// このマジックナンバーのオープンポジションがない場合、チェックします......。

......または多分私は理解していない......私はポジションが開いたときに気にしないので、私は-1を持っている......とにかくそれは新しいバーで、古いものが閉じられたときにのみ開かれます...条件がこの魔法の数字でオープンポジションがない場合のみ開くことができると指定されているからです。

をさらに簡単にすると、ポジションを開いて、閉じるまで待つ...ということです。閉じてからまた開くと、確かにこのマジシャンのポジションをすべてのバーで開くべきではありません... - 再び、このマジシャンのオープンポジションがないかどうかを確認する条件です。