В MQL5 существует несколько вариантов вызова индикаторов, и осуществляются они в основном при помощи функций IndicatorCreate() и iCustom(). Причем эти функции лишь возвращают хендл индикатора, и дальнейшая работа с индикаторами ведется именно через него. Так что же такое хендл? Как работать с функциями IndicatorCreate() и iCustom()? И как...
//+------------------------------------------------------------------+//| Example iEnvelopes values on a chart.mq5 |//| Copyright 2020, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"//--- input parametersinputint Input1=9;
//---int handle_iEnvelopes; // variable for storing the handle of the iEnvelopes indicator//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- create handle of the indicator iEnvelopes
handle_iEnvelopes=iEnvelopes(Symbol(),Period(),3,0,MODE_LWMA,PRICE_OPEN,0.03);
//--- if the handle is not createdif(handle_iEnvelopes==INVALID_HANDLE)
{
//--- tell about the failure and output the error codePrintFormat("Failed to create handle of the iEnvelopes indicator for the symbol %s/%s, error code %d",
Symbol(),
EnumToString(Period()),
GetLastError());
//--- the indicator is stopped earlyreturn(INIT_FAILED);
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---string text="";
double upper[],lower[];
ArraySetAsSeries(upper,true);
ArraySetAsSeries(lower,true);
int start_pos=0,count=3;
if(!iGetArray(handle_iEnvelopes,UPPER_LINE,start_pos,count,upper) ||
!iGetArray(handle_iEnvelopes,LOWER_LINE,start_pos,count,lower))
{
return;
}
string text_upper="",text_lower="";
for(int i=count-1; i>=0; i--)
{
text_upper = text_upper + "Upper"+"["+IntegerToString(i)+"]"+" "+DoubleToString(upper[i],Digits()+1) +" | ";
text_lower = text_lower + "Lower"+"["+IntegerToString(i)+"]"+" "+DoubleToString(lower[i],Digits()+1) +" | ";
}
Comment(text_upper+"\n"+text_lower);
}
//+------------------------------------------------------------------+//| Get value of buffers |//+------------------------------------------------------------------+bool iGetArray(constint handle,constint buffer,constint start_pos,
constint count,double &arr_buffer[])
{
bool result=true;
if(!ArrayIsDynamic(arr_buffer))
{
PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
return(false);
}
ArrayFree(arr_buffer);
//--- reset error codeResetLastError();
//--- fill a part of the iBands array with values from the indicator bufferint copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
if(copied!=count)
{
//--- if the copying fails, tell the error codePrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
__FILE__,__FUNCTION__,count,copied,GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculatedreturn(false);
}
return(result);
}
//+------------------------------------------------------------------+
もともとこの記事を頼りにしていたのですが、https://www.mql5.com/ru/articles/43
しかし、そこに書かれているコードは、インジケータ・データをチェックしてバッファ・アレイに取り込むところまでで、さらに、受け取ったインジケータ・データをどのように扱うかの例はないのです。リファレンスブックに目を通すと、主にインジケータのコード例があり、そこからsetindexbufferを拾ってみました。どっちに "掘る "か知りたい。昨日は半日で飽きたよ。
もう試した。しかし、ウィザードでは、クラスとともにそこに生成されます。せめて、少しは理解できるコードをわかりやすく理解したいものです。EAでインジケータの値を取得するために、どのようにコードを修正すればよいかアドバイスをお願いします。
例:EAからiEnvelopesのインジケータ値を取得する方法
結果
例:EAからiEnvelopesのインジケータ値を取得する方法
ありがとうございました。調べてみます!
Vladimir, please tell me: Where does it get UPPER_LINE and LOWER_LINE from?インジケーターのハンドルだけなら、そのままもらえたかな?
Vladimir, please tell me: Where does it get UPPER_LINE and LOWER_LINE from?インジケーターのハンドルだけなら、ハンドルも一度に手に入ったのでしょうか?
ご質問の意味がわかりません。意味のない文字の集合体です。質問を言い換えてください。急いで入力せず、質問をよく考えて、落ち着いて入力してください。
質問の意味がわかりません。意味のない文字の集合体。質問を言い換えてください。急いで入力せず、質問を考えて冷静に入力してください。
関数の引数に
iGetArray(handle_iEnvelopes,UPPER_LINE,start_pos,count,upper)
UPPER_LINEを使用しました。
このパラメータ値はどこから来ているかというと、先ほど受け取ったハンドルからです。
?
関数の引数に
UPPER_LINEを使用しました。
このパラメータ値はどこから来るかというと、以前に受信したハンドシェイクからです。
?
いいえ、この値はiEnvelopesの ヘルプから引用しています。
午後GBPUSD通貨でEAを動作させる際、EURUSD用のコードでインジケータを設定すると、EAが起動時にクラッシュしてしまいます。しかし、EURUSDでExpert Advisorを実行し、GBPUSDを指標として指定すると、すべてが動作します。何に関連することができるのか?
午後GBPUSD通貨でEAを動作させる際、EURUSD用のインジケータをコードに設定すると、EAが起動時にクラッシュしてしまいます。しかし、EURUSDでEAを実行し、GBPUSDをインディケータに指定すると、すべてが動作します。これは何によるものなのでしょうか?
1.Wizard MQL5を使ってEAを生成します。例えば、EAに'GBPUSD'、シグナルのモジュールに'EURUSD'を指定します。RIGHTのサンプルコードが表示されます。コードを勉強する。今後は、手動での編集を避け、MQL5 Wizardでコードを生成すればよいのです。
2.Expert Advisor に 'GBPUSD' を指定した場合、この EA は 'GBPUSD' のみで実行する必要があります。
1.Wizard MQL5を使用してEAを生成します。EAには'GBPUSD'、シグナルモジュールには'EURUSD'などと指定します。RIGHTのサンプルコードが表示されます。コードを勉強する。今後は、手動での編集を避け、MQL5 Wizardでコードを生成すればよいのです。
2.エキスパートアドバイザーに「GBPUSD」を指定した場合、このEAは「GBPUSD」のみで 動作させる必要があります。
Vladimir、MQL5 Wizardを使ってコードを生成しました。私はあなたのExpert Advisorを試しましたが、GBPUSD通貨で実行したとき、それはまた私のために動作しません。
ログには次のように書かれています。