//+------------------------------------------------------------------+//| 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);
}
//+------------------------------------------------------------------+
Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
最後の答えの後、絵はより明確になり、最も明白なのは、私はプログラマーになる運命にはないということです:-)
今までは、一番シンプルなリストから始めて、こんな感じになりました。
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.09999999999 2018.10.15 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999 2018.10.16 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00
何らかの理由で、どちらかのポイントから有効数字2桁の次元を超えるケースもある。
そして、これは計算のエラーもなく、チャートベースtmp1[i]=close[i]から価格値を出力しているだけで、このようになります。
直す方法、無視する方法はないのでしょうか?
そこから5に関係するものをすべて削除し、4のテンプレートを入手することができます。
これは、5点と4点の違いがわかる人が書けばいいのであって、間違いなく私ではありません :-)
4という数字はどこから来たのか、その神聖な意味とは?
これは、5点と4点の違いがわかる人が書けばいいのであって、間違いなく私ではありません :-)
4という数字はどこから来たのか、どんな神聖な意味を持っているのか。
確かに聞きもしないし、読みもしない...。していました。
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
MQL4初心者の質問、支援、アルゴリズムやコードに関するディスカッションなど。
アルチョム・トリシキン さん 2018.10.18 09:26
最後の答えの後、絵はより明確になり、最も明白なのは、私はプログラマーになる運命にはないということです:-)
今までは、一番シンプルなリストから始めて、こんな感じになりました。
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.0999999999 2018.10.15 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999 2018.10.16 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00
何らかの理由で、どちらかのポイントから有効数字2桁の次元を超えるケースもある。
そして、これは計算のエラーもなく、チャートベースtmp1[i]=close[i]から価格値を出力しているだけのことです。
直す方法、無視する方法はないのでしょうか?
大丈夫です。端数を表示するには、DoubleToString() を必要な精度で使用するだけです。この場合、必要な精度はDigits()でなければなりません。
最後の答えの後、絵はより明確になり、最も明白なのは、私はプログラマーになる運命にはないということです:-)
今までは、一番シンプルなリストから始めて、こんな感じになりました。
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.09999999999 2018.10.15 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999 2018.10.16 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00
2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00
何らかの理由で、どちらかのポイントから有効数字2桁の次元を超えるケースもある。
そして、これは計算のエラーもなく、チャートベースtmp1[i]=close[i]から価格値を出力しているだけのことです。
これを何らかの方法で打ち消すか、無視するか。
プログラムを書けるようになるには、誰もがそこからスタートします。たくさん読んで、自分なりのコードを書いてみることです。
実数の精度、仮数、メモリへの格納方法、ネットでググればわかるが、格納の原理はどこも同じだ。
美しい出力が必要な場合は DoubleToStr() を使用します。
これらは実数の一般的な値です。プログラムを書くことを学ぶことはできますし、誰もがそこから始めます - 多くの本を読み、自分自身のコードを書いてみる必要があります。
実数の精度、仮数、メモリへの格納方法、ネットでググればわかるが、格納の原理はどこも同じだ。
美しい出力が必要な場合は、DoubleToStr() を使用します。
互換性のある機能を利用できる場合は、それを提供したほうがよい。そうしないと、この叙事詩はまた繰り返されることになります。この場合DoubleToString()
同じ楽器でEAが動作しないようにするにはどうしたらよいでしょうか?
例えば、EAをeur/usdのウィンドウで動作させても、eur/usdの他のウィンドウで実行すると、何らかの警告 メッセージが表示されます。よろしくお願いします。
同じ楽器でEAが動作しないようにするにはどうしたらよいでしょうか?
例えば、EAをeur/usdのウィンドウで動作させても、eur/usdの他のウィンドウで実行すると、何らかの警告メッセージが表示されます。よろしくお願いします。
あるEAから別のEAにデータを転送する必要がある場合は、フォーラムを検索してください。
またはターミナルのグローバル変数を使用する(これが最も簡単な方法です) - そこに最初のEAの値を書き込むことができ、その後のEAのコピーはこの値を読み、実行しませんhttps://www.mql5.com/ru/docs/globals
あるEAから別のEAにデータを転送する必要がある場合は、フォーラムを検索してください。
またはターミナルのグローバル変数を使用する(これが最も簡単な方法です) - そこに最初のEAの値を書き込むことができ、その後のEAのコピーはこの値を読み、実行しませんhttps://www.mql5.com/ru/docs/globals
EAは同じなので、同じシンボルで動作するように無効化してください。
2分もあれば、ヘルプの内容を理解できるはずです。
グローバル変数 に文字列を渡す方法について具体的に述べている場合、唯一の方法はグローバル変数の名前を作成することです。つまり、あなたのケースでは、EURUSDでEAを実行し、チェックを行う
if(GlobalVariableCheck(_Symbol)) ......。
もしそのような変数がない場合は、次のように特大の変数を作成します。
if(GlobalVariableSet(_Symbol,Magic)==0) Print("Error writing to global variable # ",GetLastError());
を削除し、Expert Advisor を終了する際に、グローバル変数
このままでは端末が手狭になるので、なんとなく検索の方向性を指摘したところ