//+------------------------------------------------------------------+//| Fractals.mq5 |//| Copyright 2009-2017, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"2009-2017, MetaQuotes Software Corp."#property link"http://www.mql5.com"//---- indicator settings#property indicator_chart_window#property indicator_buffers2#property indicator_plots2#property indicator_type1DRAW_ARROW#property indicator_type2DRAW_ARROW#property indicator_color1 Gray
#property indicator_color2 Gray
#property indicator_label1"Fractal Up"#property indicator_label2"Fractal Down"bool high_f, low_f, lastIsUpper = true, lastIsLower = true;
int lastLowerIndex, lastUpperIndex;
//---- input datainputint period = 5;
int per = period;
//---- indicator buffersdouble ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high priceint ExtArrowShift=-10;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
if(per % 2 == 0) per++; //период фракталов только нечетный//---- indicator buffers mappingSetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawnPlotIndexSetInteger(0,PLOT_ARROW,217);
PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawingPlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
}
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(rates_total < per)
return(0);
//---if(prev_calculated < per + (per - 1) / 2)
{
limit = (per - 1) / 2;
//--- clean up arraysArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
}
else limit = rates_total - per;
for(i = limit; i < rates_total - (per + 1) / 2 && !IsStopped(); i++)
{
high_f = true; low_f = true;//с самого начала считаем что есть фрактал в i свечеfor(int g = 1; g < (per+1)/2; g++){//проверка на наличие фрактала (одновременной справа и слева от свечи с возможным фракталом)//---- Upper Fractalif(high[i-g] >= high[i] || high[i+g] > high[i]){//если одно из условий выполнено (high какой либо свечи справа или слева выше чем исследуемый), то фрактала сверху нет
ExtUpperBuffer[i] = EMPTY_VALUE;
high_f = false;
}
//---- Lower Fractalif(low[i-g] <= low[i] || low[i+g] < low[i]){ //если одно из условий выполнено, то фрактала снизу нет
ExtLowerBuffer[i] = EMPTY_VALUE;
low_f = false;
}
}
//устанавливаем верхнийif(high_f){//если фрактал все таки есть (из цикла-проверки выше)if(lastIsLower){//еси последний фрактал был нижний
ExtUpperBuffer[i] = high[i];//устанавливаем сверху
lastUpperIndex = i;//записываем индекс в буффере установленного
lastIsLower = false;//говорим что последний - не нижний
lastIsUpper = true;//а верхний
}else{
if(lastIsUpper){//если последний верхний (а мы пытаемся установить верхний)if(high[i] > ExtUpperBuffer[lastUpperIndex]){//если устанавливаем выше предыдущего
ExtUpperBuffer[lastUpperIndex] = EMPTY_VALUE;//удаляем предыдущий
ExtUpperBuffer[i] = high[i];//устанавливаем новый
lastUpperIndex = i;//записываем индекс нового
}
}
}
}
//аналогично для фрактала снизуif(low_f){
if(lastIsUpper){
ExtLowerBuffer[i] = low[i];
lastLowerIndex = i;
lastIsLower = true;
lastIsUpper = false;
}else{
if(lastIsLower){
if(low[i] < ExtLowerBuffer[lastLowerIndex]){
ExtLowerBuffer[lastLowerIndex] = EMPTY_VALUE;
ExtLowerBuffer[i] = low[i];
lastLowerIndex = i;
}
}
}
}
}
//--- OnCalculate done. Return new prev_calculated.return(rates_total);
}
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает сумму лотов открытых позиций |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ( "" - любой символ, |//| NULL - текущий символ) |//| op - торговая операция ( -1 - любая позиция) |//| mn - MagicNumber ( -1 - любой магик) |//+----------------------------------------------------------------------------+double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
l+=OrderLots();
}
}
}
}
}
}
return(l);
}
こんにちは。
そうです。時間は 秒数なので、時間を文字 列に変換する理由はありません。この数値は、文字列よりもはるかに簡単で、素早く作業できます。
あるものを修正し、別のものを台無しにしている)
の代わりに第2部では
を返します。
前回の試行では、そのセリフが正解でしたね。
返信ありがとうございました両方の選択肢を試しました。
ストップで閉じるときもそのまま入るし、何が引っかかるのかわからない。
自分の状態を声に出して言えば、何が起こっているのかがわかる)
実際、あらゆるところに != 条件があり、つまり、私があなたの言いたいことを正しく理解していれば、逆の > 条件があるはずなのです。しかし、すべてのバリエーションが動作し、現在も動作しています。
ロジックの理解、エラーの発見を支援
コードを詳細にコメントアウトしました。
ピリオドで、「ジグザグ」タイプで、下の上の下のフラクタルが 順番に行くように、フラクタルが描けるようにして欲しいです。
しかし、その結果、とにかく繰り返されるフラクタルがチャートに表示されるのです
ベースは標準的なフラクタル指標から取られています。周期5でフラクタルが繰り返される画面は以下の通りです。
SYMBOL_SESSION_INTERESTがサポートされていない場合、MQL4でオープンポジションの 出来高を取得する方法を教えてください。ありがとうございました。
すべてのポジションを循環させ、その総量を計算する:OrderLots()
なぜprev_calculatedの特定の値が返されるのか理解できないのですが?
そもそも、どのように算出するのでしょうか?
なぜprev_calculatedの特定の値が返されるのか理解できないのですが?
そもそも、どのように算出するのでしょうか?
なぜprev_calculatedの特定の値が返されるのか理解できないのですが?
どうやって計算するんだ?
最後の繰り返しでOnCalculate() が返す値である。これはドキュメントに明示されています。
OnCalculate()が返す値と2番目の入力パラメータprev_calculatedの関係に注意する必要がある。 この関数を呼び出すと、パラメータ prev_calculated には、前回の 呼び出し 時に OnCalculate() が 返した 値が格納 される。 これにより、この関数の前回の呼び出し以降に変更されていないバーについて、計算を繰り返すことを避けるために、カスタムインジケータの計算のための経済的なアルゴリズムが可能になります。
課題は、最小の閉塞を持つバーを見つけることです
for(int x=0; x<=xBars -1; x++)
{
カウンター++。
// Print(Close[x],",",counter)を実行します。
int h =ArrayMinimum(Close[x]);
if(counter > 20) break;
}
コンパイラはCloseで悪態をつく