[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 3. - ページ 632

 
alsu:

例えば、PeriodSMAで単純移動平均を計算する必要があります。SMAを計算するには、最後のPeriodSMAバーの値を追加し、PeriodSMAで割ります。Bars-1、Bars-2、...、Bars-PeriodSMA+1の番号を持つバーでは、計算に必要な量のバーがないため、動作しないことは明らかです(左端のバーはBars-1のインデックスを持っています)。そのため、チャートの最後のバーではなく、Bars-PeriodSMAの指標を持つバーから計算を開始する必要があります。

なぜ、任意の値ではなく、この値を書くのだろうか。このように計算開始をずらすことで、計算の正しさを損なうことなく、最大限のバー量を計算することができるからだ。

しかし、これは最も単純なケースであることを心に留めておいてください。計算のために何本前のバーが必要なのか、このシフトはどこから来るのか、コードからすぐにはわからないことがあります。まあ、コードを書いた開発者に聞くのが一番でしょうけど。しかし、一般的には、普遍的な方法があります - ちょうどコードを見て、バーの最大インデックスがプログラム操作中に価格データとインデックスバッファのデータを使用して取得することができるもの、通常はすでにこの段階で明らかになる...

今、すべてがうまくいっている。アレクセイさん、対応ありがとうございました。
 
skyjet:


分かりやすい説明ありがとうございました

それと、念のためですが、機械的に0を追加した場合、このような端末でもTPやSLは機能するのでしょうか?


もちろん、そうでしょう。
そのための外部変数であり、任意の値を設定するためのものです。

しかし、アドバイスされたことを初期化モジュールに配置する方が簡単です。
この形でもいい。
// для терминала с 5 знаками
if (Digits == 3 || Digits == 5) {
   decimal = 10; // Определяет кол-во пунктов в четвертом(втором) знаке
   STOPLOSS *= decimal;
   TAKEPROFIT *= decimal;
   slippage *= decimal; // прочие целочисленные переменные в пунктах
} else decimal = 1;
変数は自動的に調整されます。その他の必要な場合は、乗数 "decimal" を使用してください。
 
skyjet:


Спасибо за разъяснения!

И просто чтобы уточнить, если я механическим путем добавлю 0, то TP и SL будут работать в данном типе терминалов?

prorab:

もちろん、そうなります。
そのための外部変数であり、任意の値を設定するためのものです。

でも、アドバイスされたことを初期化モジュールに入れるのは、まだ簡単です。
この形でもいい。
変数は自動的に調整されます。その他の必要な場合は、乗数 "decimal" を使用してください。

このタスクは明確にする必要があります。

  • 入力パラメーター(STPOLOSS、TAKEPROFITなど)は、4桁の数字を意識 して入力する必要があります!!!!
 

こんにちは...

SOS!!!良い人たち、助けてーーーー私はプログラミング全般(独学です)、特にMQLについては 初心者です。シンプルなインジケーター:RSI+ボリンジャーバンドを一人で書いてみました。しかし、ここで困ったことに、配列Buf_std_devの 要素数を明示的に 指定しない 場合(つまり、配列宣言行は次のようになります:double Buf_std_dev[] )、クライアントターミナルウィンドウ(CT)にこのインジケータを表示すると、次のような絵が表示されるのです。

写真の説明

a) 最上部にはCT 付属のインジケーターセットで利用できるRSIが あり、このRSIの ウィンドウにボリンジャーバンドがドラッグ ドロップ)されている状態です。

b) 一番下にあるのはRSIで、これは私がプログラムしたものです。

コンパイラは、エラーや警告を検出 しません。

 

一方、配列Buf_std_devを 宣言するときに、その中の要素数を明示的に 指定すると(つまり、配列宣言行は次のようになります:double Buf_std_dev[5502], ここで 5502は、変数 Barsで 得られるバーの数 )、すべてが正常に戻ります(2つの指標の比較から分かるように、すべての値は同じです)。

2枚目の写真のように、画像を保存するために何をすべきか、しかし配列Buf_std_devの 要素数を設定しないように明示的に教えてください。

P.S. 回答よろしくお願いします。

 
すべてのコードを表示する
 

コードを添付します(一部のパーツを除いたもので、4MBに収まりません!!)。

....
double Buf_rsi[];                                                       //открываем индикаторный массив для значений RSI+
double Buf_ma[];                                                        //открываем индикаторный массив для значений скользящей средней по RSI+
double Buf_up_line[];                                                   //открываем индикаторный массив для значений ВЛБ по RSI+
double Buf_down_line[];                                                 //открываем индикаторный массив для значений НЛБ по RSI+
double Buf_std_dev[5498];                                               //открываем массив для хранения данных по стандартному отклонению  

string timeframe[9];                                                    //объявляем массив для значений таймфреймов
extern int Период_RSI=14;                                               //внешняя переменная: период RSI+
extern int Применить_к=PRICE_CLOSE;                                     //внешняя переменная: цена, для к-й рассчитывается RSI+
extern int Сдвиг=0;                                                     //внешняя переменная: сдвиг относительно текущего графика RSI+
extern double Сигма=2.0;                                                //внешняя переменная: количество стандартных отклонений для расчета лент Боллинджера по RSI+
extern int МА=21;                                                       //внешняя переменная: период скользящей средней для расчета лент Боллинджера по RSI+
....
   if(Bars<=Период_RSI) return(0);                                      //если баров на графике меньше, чем период RSI+, то выходим
//+-------------------------------------------------------------------------------------- 9 --
   int counted_bars=IndicatorCounted();                                 //количество посчитанных баров
   int i;                                                               //техническая переменные: счетчики

   int limit=Bars-counted_bars;                                         //индекс первого непосчитанного по массиву Buf_ma (т.к. этот массив НЕ является массивом таймсерией)
   if(counted_bars<0)limit--;                                           //если значение переменной counted_bars больше 0, то увеличиваем на 1 значение переменной limit
//+-------------------------------- Рассчет линий индикатора ---------------------------- 10 --
   for(i=0;i<=limit;i++)Buf_rsi[i]=iRSI(NULL,0,Период_RSI,Применить_к,i);//рассчет значения RSI+ на i-ом баре      
   for(i=0;i<=limit;i++)                                                //цикл по рассчету линий на основе RSI+     
       {                                                                //начало for
        Buf_std_dev[i]=iStdDevOnArray(Buf_rsi,Bars,МА,Сдвиг,MODE_SMA,i);//рассчитываем стандатное отклонение по массиву RSI+
        Buf_ma[i]=iMAOnArray(Buf_rsi,Bars,МА,Сдвиг,MODE_SMA,i);         //рассчет значения MA по RSI+ на i-ом баре
        Buf_up_line[i]=Buf_ma[i]+Сигма*Buf_std_dev[i];                  //рассчет значения ВЛБ по RSI+
        Buf_down_line[i]=Buf_ma[i]-Сигма*Buf_std_dev[i];                //рассчет значения НЛБ по RSI+
       }                                                                //конец for
   for(i=0;i<=Bars;i++)                                                 //цикл по подсчету количества данных внутри ЛБ
      {                                                                 //начало for
       int sum;                                                         //техническая переменные: сумма данных, к-е находятся внутри ЛБ 
       if(Buf_rsi[i]>Buf_down_line[i]&&Buf_rsi[i]<Buf_up_line[i])sum++; //если значение RSI+ > НЛБ и значение RSI+ < НЛБ, то переменная sum увеличиваестся на 1 (т.о.)
      }                                                                 //конец for
//+------------------------------------------------------------------------------------- 11 --
 
FAQ:
すべてのコードを表示する

4Mb以上のコードをここにダンプする方法があれば教えてください(または部分的にここにダンプ?
 

Buf_std_devが インジケータバッファ(8つのうちの1つ)でない場合、宣言時にそのサイズ、または任意のサイズ(将来的に(サイズを)変更する予定がある場合)を指定する必要があります。

 

そうですね、そうではなくて...。もしよろしければ、もう2つほど質問をさせてください。

1.これにバッファ(配列Buf_std_dev )を割り当てれば、インジケータウィンドウにも表示されるということでしょうか。

バッファを割り当てない場合、(私の理解が正しければ)次のような状況が発生します:100本のバーのサイズを指定したと仮定してください。そして、新しいバーが現れたら(例えばBars=101の場合)、指定した最後の100本のバーに対してのみ計算を行います(つまり、最も古いバーである101は破棄されます)。つまり、履歴を読み込む際、配列のサイズは 常に100本のバーだけ(または他の値、宣言時に指定します)に等しくなるのでしょうか?

理由: