inputint InpSlowEMA=84; // Slow EMA periodinputint InpSignalSMA=9; // Signal SMA periodinputENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price//--- indicator buffersdouble ExtMacdBuffer[];
double ExtSignalBuffer[];
double ExtFastMaBuffer[];
double ExtSlowMaBuffer[];
//--- MA handlesint ExtFastMaHandle;
int ExtSlowMaHandle;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawnPlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow labelIndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpSlowEMA)+","+string(InpSignalSMA)+")");
//--- get MA handles
ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_SMA,InpAppliedPrice);
//--- initialization done
}
//+------------------------------------------------------------------+//| Moving Averages Convergence/Divergence |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,constint prev_calculated,
constdatetime &Time[],
constdouble &Open[],
constdouble &High[],
constdouble &Low[],
constdouble &Close[],
constlong &TickVolume[],
constlong &Volume[],
constint &Spread[])
{
//--- check for dataif(rates_total<InpSignalSMA)
return(0);
//--- not all data may be calculatedint calculated=BarsCalculated(ExtFastMaHandle);
if(calculated<rates_total)
{
Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
calculated=BarsCalculated(ExtSlowMaHandle);
if(calculated<rates_total)
{
Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
//--- we can copy not all dataint to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
else
{
to_copy=rates_total-prev_calculated;
if(prev_calculated>0) to_copy++;
}
//--- get Fast EMA bufferif(IsStopped()) return(0); //Checking for stop flagif(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
{
Print("Getting fast EMA is failed! Error",GetLastError());
return(0);
}
//--- get SlowSMA bufferif(IsStopped()) return(0); //Checking for stop flagif(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
{
Print("Getting slow SMA is failed! Error",GetLastError());
return(0);
}
//---int limit;
if(prev_calculated==0)
limit=0;
else limit=prev_calculated-1;
//--- calculate MACDfor(int i=limit;i<rates_total && !IsStopped();i++)
ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.return(rates_total);
}
//+------------------------------------------------------------------+
.......................... 関数(検索、計算など)は一般に長さとサイズを返し、失敗した場合は -1 を返すので、エラー処理が非常に簡単になります。
ごあいさつリバースシグナルが発生した場合、注文のグリッドに共通のテイクアウトを設定するには、どのような関数を使用すればよいか、初心者のためのヒントがあれば教えてください。
ファイル操作の勉強中です。MQL4/5は、csvファイルとtxtファイルのどちらが速いかご存知の方はいらっしゃいますか?
ファイルを扱うことで、どのような問題を解決しようとしているのでしょうか?
EAからリンクされたリソースインジケータを呼び出し、それ自体が別のリンクされたリソースインジケータを使用する方法についてコード例を教えてください。例えば、あるインジケータAがあり、そこからBが呼び出される。Aを使用するエキスパートCもあります。どのような場合に#resourceやiCustomを呼び出す 際に何を記述すればよいのでしょうか?
この点については、ヘルプが明確に書かれているわけではありません。インジケータAでの通常の構築:#resource "\Indicators﹑.ex4" →iCustom(::IndicatorsB.ex4) は、A単体で起動した場合は正常に動作 しています。しかし、AをExpert Advisorの#resource "\Indicators A.ex4"に挿入 すると、添付のインジケータのリソースをロードできないエラーが表示され、何らかの形でライブラリディレクトリに言及した絶対的に間違った合成パスが示され、インジケータBは自身の内部 (MQL4Libraries::IndicatorsB.ex4::IndicatorsB.ex4)を検索 されます。
ArraySizeについては、先日MQL4で同様の問題を提起しました(https://www.mql5.com/ru/forum/152471)。私が理解する限り、MQL5でも全て同じはずです。
おそらく、私のメッセージはそこで考慮されたのでしょう :) この問題に関して、サービスデスクは、原因はオプティマイザの不正な動作であり、新しいビルドでタイプをuintに変更すると回答しています。ちなみにArrayResizeもuintにするそうです。 ulongにしないと、近い将来、大容量を保存するときに32bitの値がないために、この問題に戻らざるを得なくなるとアドバイスしておきました。
エラー時の値-1については、以下の理由で問題ないはずです。(int)-1 = (uint)-1 = 0xFFFFFFFFFF = UINT_MAX,つまりビット表現は同じです。 しかし比較演算は異なる結果になります。
が不正確になります。
MQL配列の総要素数はINT_MAXを超えてはならず、これは変更されません。
MQLプログラムでより大きなサイズの配列が必要な場合は、別のクラス(例えば、CBigArray)を作成する必要があります。
mql5でiCustomを使いこなそうとしている。mql4でマスターしました :)
問題はMACDに似たものを描くことですが、クイック移動平均の代わりにExamplesフォルダにあるVIDYAというインディケータを使う必要があります。
標準的なMACDのコードを取り、MAの代わりにVIDYA用のパラメータを入れました。問題は、すべてコンパイルされるのに、何も描画 されないことです。
下のコードで、標準のMACDのコードを変更した2か所に印をつけました。それ以外はすべて同じです。他に見逃しているものがあれば教えてください。コードのどこかに下流があるのでは......と思っています。
Первый вставленный кусок:input int Per=7; // Per input int Per1=21; // Per1 input int Shift=0; // ShiftКонецВторой вставленный кусокКонецmql5でiCustomを使いこなそうとしている。mql4では、仮想的に使いこなすことができました :)
既出かもしれませんが、新しいバー、バッファのPLOT_EMPTY_VALUEの値が0.0に設定されているが、実際には全く異なる値が存在する場合がある、という質問です