//+------------------------------------------------------------------+//| Demo_iBands.mq5 |//| Copyright 2021, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2021, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"//--- входные параметрыinputint bands_period=20; // период скользящей среднейinputint bands_shift=0; // сдвигinputdouble deviation=2.0; // кол-во стандартных отклоненийinputENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // тип цены//--- переменная для хранения хэндла индикатора iBandsint handle;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- создадим хэндл индикатора
handle=iBands(_Symbol,_Period,bands_period,bands_shift,deviation,applied_price);
//--- если не удалось создать хэндлif(handle==INVALID_HANDLE)
{
//--- сообщим о неудаче и выведем номер ошибкиPrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d",
_Symbol,
EnumToString(_Period),
GetLastError());
//--- работа индикатора завершается досрочноreturn(INIT_FAILED);
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- почистим график при удалении индикатораComment("");
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//--- индикаторные буферыdouble UpperBuffer[];
double LowerBuffer[];
double MiddleBuffer[];
//--- количество копируемых значений из индикатора iBandsint values_to_copy=2;
//--- если FillArraysFromBuffer вернула false, значит данные не готовы - завершаем работуif(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy))
return;
//--- сформируем сообщениеPrint("MiddleBuffer =",MiddleBuffer[0], "UpperBuffer =",UpperBuffer[0], "LowerBuffer =",LowerBuffer[0], "values_to_copy =",values_to_copy);
}
//+------------------------------------------------------------------+//| Заполняем индикаторные буферы из индикатора iBands |//+------------------------------------------------------------------+bool FillArraysFromBuffers(double &base_values[], // индикаторный буфер средней линии Bollinger Bandsdouble &upper_values[], // индикаторный буфер верхней границыdouble &lower_values[], // индикаторный буфер нижней границыint shift, // смещениеint ind_handle, // хэндл индикатора iBandsint amount // количество копируемых значений
)
{
//--- сбросим код ошибкиResetLastError();
//--- заполняем часть массива MiddleBuffer значениями из индикаторного буфера под индексом 0if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- заполняем часть массива UpperBuffer значениями из индикаторного буфера под индексом 1if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- заполняем часть массива LowerBuffer значениями из индикаторного буфера под индексом 2if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- все получилосьreturn(true);
}
//+------------------------------------------------------------------+
なるほど、ありがとうございます。他に何かヒントをお持ちの方はいらっしゃいますか?
私も一緒に学びました。
ただ、動かなくなったり、断続的に 動作したりしても驚かないでください。
どんな理由で?何が問題なのか書いてみたらどうだ?
どんな理由で?何が問題なのか言ったらどうなんだ?
なんだ、この嫌がらせは?
なんだ、ひき逃げか。
なるほど。
何が悪いのか、本当に悪いのならどういう理由で動かなくなるのか、どなたか教えてください。
なるほど。
もし本当に何か問題があるのなら、どういう理由で動作しなくなるのか、どなたか教えてください。
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。
イゴール・マカヌ さん 2021.07.05 14:16.
なぜなら、その指標はまだ算出されていないからです。
https://www.mql5.com/ru/docs/series/barscalculated
OnInit()セクションは、ターミナル環境を取得するのに最適な場所ではなく、論理的に正しく動作していると思います。これがその答えです。
ありがとうございます。
起動時にすぐに履歴の計算をするようにしてほしい。そのように必要だから、イナイレでやっているんです。
initで、計算の前にポーズを入れました。 その場合、やはり落とし穴があるのでしょうか?
起動時に履歴の計算をする必要があります。そのように必要なので、インサイトでやっています。
イナイトで、計算前のポーズを追加しました。 そうすると、やはり落とし穴があるのでしょうか?
最初の開始フラグをOnTick()に入れる方が簡単で信頼性が高い
昨日のインジケータでEAをスケッチしたのですが、何かうまく動きません。シグナルに基づかない取引を行うようです。反対側のシグナルでクローズオーダーを追加しようとしましたが、取引がクローズされた後、クローズされません。懐かしいと思います。
どんな理由で?何が問題なのか書かないのはなぜ?
開発者がOnInit()は初期化用であり、それ以外の用途には使えないと書いているため
OnInit()でインジケータの値を取得するために一時停止をしましたが、ユーザーが同時にTFを切り替えたらどうなりますか?
SZZY: また、EAを実行した後、ターミナルを閉じて、実行中のEAでターミナルを再び開いた場合、コードはどのように動作しますか?