intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
if(prev_calculated == 0) {
limit = rates_total - 1; //--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
}
else limit = rates_total - prev_calculated + 1;
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
}
return(rates_total);
for(i = limit; i >= 0; i--) { //--- В этом цикле основные вычисления. Таким образом обрабатываться будет только "свежая" информация
Buffer[i] = close[i];
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.if(limit>1)
// если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории// если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,// при подгрузке истории и на первом запуске - перерасчёт всей истории
{
limit=rates_total-1;
// здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
}
//--- Расчёт индикатораfor(int i=limit; i>=0 && !IsStopped(); i--)
{
// необходимые действия по расчёту индикатора
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
クラスインスタンスの配列を作成する方法は?
ClassName* className[] を作り、それにArrayResizeを かけたが、メソッドに アクセス できない。
インスタンスを配列に集めたいクラスは、CObjectを継承している必要があります。
そして、オブジェクトのリスト(配列)CArrayObjを作成し、そこにオブジェクトを追加していくだけというシンプルなものです。
インジケーターテンプレートという言葉とあなたの名前で検索しても何も出てきませんし、その戦争と平和の巻についてはすでにここに書かれていますね。
投稿の中から、どんな言葉の組み合わせでもいいので、思い浮かべてみてください。
えーと、インジケーターのテンプレートの件ですが、もしかしたらごっちゃになっていたかもしれませんね~、トロールのテンプレートが掲載されていました。
エディタでインジケータ・テンプレートを作成し、必要な数の入力変数と描画するバッファを追加する、という風にしましょう。
次に、具体的なタスクからやるべきことを分解します。
悪いというなら、どうすれば良くなるのか教えてほしい。OnInitに計算を移動させる?
Fair rebuke )) ここで、公開されたコードの変形版です。
そのようにやってみてください。OnInitには何も動かす必要はありません。
Fair rebuke )) ここで、公開されたコードの変形版です。
このようにしてみてください。OnInitには何も動かす必要はありません。
私はこのようなコードをここで公開していません。)
私は他の構文を使っています。その方がシンプルでわかりやすいからです。
OnInit()で転送する必要があります。なぜ、各ティックでインジケーターバッファに配列を割り当てる 必要があるのでしょうか?
私はこのようなコードをここで公開していません。)
私は、よりシンプルでわかりやすい他の構文を使っています。
私のものなんだから、これ以上シンプルにできるわけがない。)))(少なくとも、私はまた、私のテンプレートにコメントを持っているLimit = rates_total - 1;//---インディケータの 最初の呼び出し またはタイムフレームの変更または履歴からデータのロード)と書式の私のスタイル - for(){の 近くに1つの中括弧。
自分でインジケータを書くには、上記のテンプレートに少なくとも終値を追加して最初のインジケータを取得し、この終値からMAHを作成することを学びます。
私はこのようなコードをここで公開していません。)
よりシンプルに、よりクリアにと、構図を使い分けています。
OnInit()には何もコピーする必要はありません。なぜ、各ティックでインジケータバッファに配列を割り当てる 必要があるのでしょうか?
あなたのコードではありません。私の同僚が出版したものだが、誰がどこで出版したかは思い出せない。何もOnInitに移動させるべきではないと書いたのはこのコードのことで、ソースコードのことではありません。よくわからないままでした。
また、どのような構造がおすすめでしょうか?これはとてもシンプルなことのように思います。
あ、この作品の作者がいる ))))先行する。ちなみに、私もこのスタイルで、1行に1つ開きの中括弧を付けて書式設定しています。あ、スニペットの作者はここです )))先行する。ちなみに、私もこのスタイルで、1行に1つ開きの中括弧を付けて整形しています。
インジケーターの作成 ウィザードを実行し、線の種類と色を選択し、必要に応じて入力を追加します。
で、以上でインジケータの準備は完了です。あとはテンプレートの OnCalculate() からボディをコピーして、計算を書き 込んでください。
1分で最初のインジケータを書くことができます、コード "Hello word I indicator!- 示しました :)
ZS: ちなみに、この形でMT4からMT5へインジケータを移行することができます。主なポイントは、インジケータのバッファを正しく設定することで、MT5ではバッファの下のアレイをインデックスするクリープがあります...。は,通常の配列 )))) のインデックスを持つ単なる配列です.MT4ではインジケータバッファのインデックスに慣れるのが大変でしたが、今は逆に慣れてしまってMT5に乗り換えるのは無理です ))))これはあなたのコードではありません。同僚の一人が出版したものだが、どこの誰かは覚えていない。何もOnInitに移動させるべきではないと言ったのはこのコードのことで、ソースコードのことではありません。よくわからないままでした。
また、どのような構造がおすすめでしょうか?こちらはとてもシンプルな印象です。
あ、この作品の作者がいる ))))先行する。ええ、インジケーターテンプレートコードは何に適していますか?ウィザードを実行してインジケーターを作成し、線の種類と色を選択し、必要に応じて入力を追加します。
これで、インジケーターの準備が整いました。次に、 OnCalculate()テンプレートから本文をコピーして、計算を記述します。
1分で最初のインジケーターを書くことができます。上のコードは「HellowordIインジケーター!!!」です。私が見せた:)
PS:ちなみに、この形式では、インジケーターをMT4からMT5に転送できます。主なことは、インジケーターバッファーを正しく設定することです。MT5では、バッファーのインデックス配列を使用すると、単なる配列であるという恐怖があります。通常の配列では))))インデックス付け.. ..以前はMT4のインジケーターバッファーのインデックス付けに慣れるのは困難でしたが、今では逆にそれに慣れてMT5に切り替えることは不可能です))))複雑なことは何もありません。クロスプラットフォームインジケーターの例(クラスを使用)ですが、テンプレートを引き出すことができます-クラスとその後エラーを発生させる余分なものをすべて削除します-クロスプラットフォームテンプレートは残ります。
このインジケーターは、変更なしで両方のプラットフォームで同じように機能します。必要な拡張子を付けてコンパイルするだけです。コードを2つの部分に分割する必要がありました-クラスとインジケーター自体(すべてが1つのリストに含まれていました)
クラス:
指標となる。