Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 573

 
Hallo!
Möglicherweise von https://ru.investing.com/tools/correlation-calculator
Ist es möglich, die Informationen in den Fahrplan zu übertragen?
Wie lässt sich das bewerkstelligen?
Ich danke Ihnen im Voraus.
 
Irina Dymura:
Hallo!
Möglicherweise von https://ru.investing.com/tools/correlation-calculator
Ist es möglich, die Informationen in den Fahrplan zu übertragen?
Wie lässt sich das bewerkstelligen?
Ich danke Ihnen im Voraus.
Versuchen SieWebRequest().
 
Ihor Herasko:

Ja. Es gibt keinen Grund, die Zeit in eine Zeichenkette zu übersetzen, da die Zeit eine Anzahl von Sekunden ist. Diese Zahl ist viel einfacher und schneller zu verarbeiten als Zeichenketten.

Sie haben eine Sache korrigiert und eine andere verdorben.)

Im zweiten Teil anstelle von:

Rückkehr:

In Ihrem letzten Versuch hatten Sie diese Zeile richtig geschrieben.


Vielen Dank für die Antworten! Ich habe beide Möglichkeiten ausprobiert.

Ich verstehe nicht, wo der Haken ist - er geht immer noch rein, wenn man auf einen Anschlag zugeht:

lil_lil:

Sprechen Sie Ihren Zustand laut aus und Sie werden sehen, was los ist)

if ( TimeSeconds(TimeCurrent()) - TimeSeconds(OrderCloseTime()) > TimeSeconds(30*60) )
if ( TimeCurrent() -OrderCloseTime() > 30*60 )

In der Tat gibt es überall != Bedingung, das heißt, das Gegenteil > sollte dort sein, wenn ich richtig verstanden habe, was Sie meinen. Aber alle Varianten liefen - funktionieren noch.

 

Helfen, die Logik zu verstehen, den Fehler zu finden

Der Code wurde detailliert auskommentiert.

Ich brauche es, um Fraktale mit einem Punkt zu zeichnen, mit einem "Zickzack"-Typ, so dass die untere obere obere untere Fraktale in Folge gehen und so weiter.

Das Ergebnis ist, dass die wiederholten Fraktale trotzdem auf dem Diagramm erscheinen.

Die Basis ist dem Standard-Fraktal-Indikator entnommen. Screenshot unten mit wiederholtem Fraktal in Periode 5

//+------------------------------------------------------------------+
//|                                                     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_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_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 data
input int period = 5;
int per = period;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
  if(per % 2 == 0) per++; //период фракталов только нечетный
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(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
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit;
//---
   if(rates_total < per)
      return(0);
//---
   if(prev_calculated < per + (per - 1) / 2)
     {
      limit = (per - 1) / 2;
      //--- clean up arrays
      ArrayInitialize(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 Fractal
         if(high[i-g] >= high[i] || high[i+g] > high[i]){//если одно из условий выполнено (high какой либо свечи справа или слева выше чем исследуемый), то фрактала сверху нет
            ExtUpperBuffer[i] = EMPTY_VALUE;
            high_f = false;            
         }        
         //---- Lower Fractal
         if(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);
  }

//+------------------------------------------------------------------+
Dateien:
6gvzow.JPG  149 kb
 
Können Sie mir sagen, wie ich das Volumen der offenen Positionen in MQL4 ermitteln kann, wenn SYMBOL_SESSION_INTEREST nicht unterstützt wird? Ich danke Ihnen!
 
kotaries:
Können Sie uns bitte mitteilen, wie man das Volumen der offenen Positionen in MQL4 erhält, wenn SYMBOL_SESSION_INTEREST nicht unterstützt wird? Ich danke Ihnen!

Alle Positionen durchlaufen und ihr Gesamtvolumen berechnen:OrderLots()

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

Ich kann nicht verstehen, warum ein bestimmter Wert von prev_calculated zurückgegeben wird?

Wie wird sie überhaupt berechnet?

 
Roman Sharanov:

Ich kann nicht verstehen, warum ein bestimmter Wert von prev_calculated zurückgegeben wird?

Wie wird sie überhaupt berechnet?

Das System wird dies im Auge behalten. Eigentlich sollten Sie nur an seinem Wert interessiert sein, nicht daran, wie er intern berechnet wird.
 
Roman Sharanov:

Ich kann nicht verstehen, warum ein bestimmter Wert von prev_calculated zurückgegeben wird?

Wie wird sie überhaupt berechnet?

Dies ist der von OnCalculate() bei der letzten Iteration zurückgegebene Wert. Dies wird in der Dokumentation ausdrücklich erwähnt:

Die Beziehung zwischen dem von OnCalculate() zurückgegebenen Wert und dem zweiten Eingabeparameter prev_calculated sollte beachtet werden. Der Parameter prev_calculated enthält beim Aufruf der Funktion den von OnCalculate() beim vorherigen Aufrufzurückgegebenen Wert. Dies ermöglicht sparsame Algorithmen für die Berechnung des benutzerdefinierten Indikators, um wiederholte Berechnungen für die Balken zu vermeiden, die sich seit dem letzten Aufruf dieser Funktion nicht verändert haben.

 

Die Aufgabe besteht darin, den Balken mit der geringsten Schließung zu finden

for(int x=0; x<=xBars -1; x++)

{

Gegen++;

// Print(Close[x],",",counter);

int h = ArrayMinimum(Close[x]);

if(Zähler > 20) break;

}

Compiler schwört auf Close