....
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]; //объявляем массив для значений таймфреймовexternint Период_RSI=14; //внешняя переменная: период RSI+externint Применить_к=PRICE_CLOSE; //внешняя переменная: цена, для к-й рассчитывается RSI+externint Сдвиг=0; //внешняя переменная: сдвиг относительно текущего графика RSI+externdouble Сигма=2.0; //внешняя переменная: количество стандартных отклонений для расчета лент Боллинджера по RSI+externint МА=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+
} //конец forfor(i=0;i<=Bars;i++) //цикл по подсчету количества данных внутри ЛБ
{ //начало forint sum; //техническая переменные: сумма данных, к-е находятся внутри ЛБ if(Buf_rsi[i]>Buf_down_line[i]&&Buf_rsi[i]<Buf_up_line[i])sum++; //если значение RSI+ > НЛБ и значение RSI+ < НЛБ, то переменная sum увеличиваестся на 1 (т.о.)
} //конец for//+------------------------------------------------------------------------------------- 11 --
例えば、PeriodSMAで単純移動平均を計算する必要があります。SMAを計算するには、最後のPeriodSMAバーの値を追加し、PeriodSMAで割ります。Bars-1、Bars-2、...、Bars-PeriodSMA+1の番号を持つバーでは、計算に必要な量のバーがないため、動作しないことは明らかです(左端のバーはBars-1のインデックスを持っています)。そのため、チャートの最後のバーではなく、Bars-PeriodSMAの指標を持つバーから計算を開始する必要があります。
なぜ、任意の値ではなく、この値を書くのだろうか。このように計算開始をずらすことで、計算の正しさを損なうことなく、最大限のバー量を計算することができるからだ。
しかし、これは最も単純なケースであることを心に留めておいてください。計算のために何本前のバーが必要なのか、このシフトはどこから来るのか、コードからすぐにはわからないことがあります。まあ、コードを書いた開発者に聞くのが一番でしょうけど。しかし、一般的には、普遍的な方法があります - ちょうどコードを見て、バーの最大インデックスがプログラム操作中に価格データとインデックスバッファのデータを使用して取得することができるもの、通常はすでにこの段階で明らかになる...
分かりやすい説明ありがとうございました
それと、念のためですが、機械的に0を追加した場合、このような端末でもTPやSLは機能するのでしょうか?
もちろん、そうでしょう。
そのための外部変数であり、任意の値を設定するためのものです。
しかし、アドバイスされたことを初期化モジュールに配置する方が簡単です。
この形でもいい。
変数は自動的に調整されます。その他の必要な場合は、乗数 "decimal" を使用してください。
Спасибо за разъяснения!
И просто чтобы уточнить, если я механическим путем добавлю 0, то TP и SL будут работать в данном типе терминалов?
prorab:
もちろん、そうなります。そのための外部変数であり、任意の値を設定するためのものです。
でも、アドバイスされたことを初期化モジュールに入れるのは、まだ簡単です。
この形でもいい。
変数は自動的に調整されます。その他の必要な場合は、乗数 "decimal" を使用してください。
このタスクは明確にする必要があります。
こんにちは...
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に収まりません!!)。
すべてのコードを表示する
4Mb以上のコードをここにダンプする方法があれば教えてください(または部分的にここにダンプ?
Buf_std_devが インジケータバッファ(8つのうちの1つ)でない場合、宣言時にそのサイズ、または任意のサイズ(将来的に(サイズを)変更する予定がある場合)を指定する必要があります。
そうですね、そうではなくて...。もしよろしければ、もう2つほど質問をさせてください。
1.これにバッファ(配列Buf_std_dev )を割り当てれば、インジケータウィンドウにも表示されるということでしょうか。
バッファを割り当てない場合、(私の理解が正しければ)次のような状況が発生します:100本のバーのサイズを指定したと仮定してください。そして、新しいバーが現れたら(例えばBars=101の場合)、指定した最後の100本のバーに対してのみ計算を行います(つまり、最も古いバーである101は破棄されます)。つまり、履歴を読み込む際、配列のサイズは 常に100本のバーだけ(または他の値、宣言時に指定します)に等しくなるのでしょうか?