Fragen von einem "Dummy" - Seite 53

 
Verwechseln Sie nicht die unbedingte und dumme (aus Unwissenheit) Neuerstellung von Indikatoren bei jedem Tick mit der intelligenten (seltenen und notwendigen) Erstellung eines Indikators. Im ersten Fall kommt es zu einem hundertfachen Brems- und Ressourcenverlust, im zweiten Fall zu einer perfekten Leistung.
 
Renat:
Verwechseln Sie nicht die unbedingte und dumme (aus Unwissenheit) Neuerstellung von Indikatoren bei jedem Tick mit der intelligenten (seltenen und notwendigen) Erstellung eines Indikators. Im ersten Fall kommt es zu einer hundertfachen Bremsung und zu einer Vergeudung von Ressourcen, im zweiten Fall zu einer perfekten Arbeit.

Ich bin mir sehr wohl bewusst, dass Karlson unwissentlich einen Fehler gemacht hat, und ich verstehe auch die Art dieses Fehlers.

Aber schlagen Sie einen vernünftigen Plan zur Lösung seines Problems vor. Die Person muss den im Indikator geschriebenen Code verwenden, aber die Parameter dieses Codes werden vor jedem Zugriff auf die Daten des Indikators dynamisch bestimmt?

Ich habe eine Lösung, es enthält dll, aber Sie wollen reine mql verwenden, so schlagen Sie eine Lösung in mql.

HZ Ich habe bereits OnCalculate() und Berechnungen in Ereignissen erwähnt, aber Sie können drei Parameter per Ereignis übergeben. In meiner Lösung kann eine lange DLL die Adresse eines Arrays mit Parametern übergeben und der Indikator erhält Daten an dieser Adresse.

Wenn Sie eine mql-Lösung haben, zeigen Sie einfach mit dem Finger.

 
Urain:

Ich bin mir sehr wohl bewusst, dass Karlson unwissentlich einen Fehler gemacht hat, und ich verstehe auch die Art dieses Fehlers.

Aber schlagen Sie einen vernünftigen Plan zur Lösung seines Problems vor. Die Person muss den im Indikator geschriebenen Code verwenden, aber der/die Parameter dieses Codes werden dynamisch vor jedem Verweis auf die Indikatordaten definiert?

Wie viele verschiedene Indikatoren sollten in der Realität erstellt werden? Wahrscheinlich nicht mehr als 10, sonst wäre es eine sinnlose Verschwendung von Ressourcen.

Da sich die Parameter nicht ändern, können Sie eine Sammlung von Indikatoren anlegen, zu der bei Bedarf der erforderliche Indikator hinzugefügt wird. Wenn es weniger als 10 Indikatoren gibt und sie eine eindeutige Bedeutung haben (initial, bestätigend, korrigierend usw.), können Sie benannte Variablen von Handles mit den erforderlichen Parametern erstellen.

 
Urain:

Aber schlagen Sie einen vernünftigen Plan zur Lösung seines Problems vor. Die Person muss den im Indikator geschriebenen Code verwenden, aber die Parameter dieses Codes werden vor jedem Verweis auf die Indikatordaten dynamisch bestimmt?

Ich habe darüber nachgedacht. Wenn die Code-Parameter vor jedem Aufruf der Indikatordaten dynamisch ermittelt werden, warum wird dann nicht auch das Verfahren zur Ermittlung dieser Parameter in den Indikatorcode aufgenommen? Mit anderen Worten: Alle Berechnungen sollten in den Indikator integriert werden.

Oder gibt es Situationen, in denen ein solches Vorgehen prinzipiell unmöglich ist?

 
Können Sie mir bitte sagen, warum bei einem so einfachen Indikator der Nullbalken (der erste von rechts) nicht überall berechnet wird , außer bei der wöchentlichen Grafik?

#include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_color1 LightBlue
#property indicator_type1   DRAW_LINE
#property indicator_width1 2

input int PERIOD = 80;
input ENUM_MA_METHOD  method = MODE_SMA;
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE;
double Uptrend[];
double ExtRsiArray_TF2[];
double mabuf[];
int handleMA,handleMA2;

int OnInit()
  {
   SetIndexBuffer(0, Uptrend);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);  
   ArraySetAsSeries(Uptrend,true);
   handleMA=iMA(NULL, 0, PERIOD, 0, method, PRICE);
   handleMA2=iMA(NULL, 0, PERIOD/2, 0, method, PRICE);
   return(0);
  }
  
double WMA(int ai_0,int a_period_4) {
int some;
if(a_period_4==PERIOD)
 if(CopyBuffer(handleMA,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
some=PERIOD/2;
if(a_period_4==some)
 if(CopyBuffer(handleMA2,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
return (ExtRsiArray_TF2[0]);
}

int OnCalculate (const int rates_total,      
                 const int prev_calculated, 
                 const int begin,          
                 const double& price[] 
   )
  { ArraySetAsSeries(price,true);
    int counted_bars = prev_calculated; 
    if(counted_bars < 0) return(-1); 
    int x = 0; 
    int p = MathSqrt(PERIOD);              
    int e = rates_total - counted_bars + PERIOD + 1; 
    double vect[], trend[]; 
    if(e > rates_total) e = rates_total;    
    ArrayResize(vect, e); 
    ArraySetAsSeries(vect, true);
    ArrayResize(trend, e); 
    ArraySetAsSeries(trend, true);
    ArrayResize(mabuf, e); 
    ArraySetAsSeries(mabuf, true);
    for(x = 0; x < e; x++)        vect[x] = 2*WMA(x, PERIOD/2) - WMA(x, PERIOD);
    if(method==MODE_SMA)
    SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf);

    for(x = 0; x < e-PERIOD; x++) Uptrend[x] = mabuf[x];
    return(rates_total);                
  }
 
Yedelkin:

Ich habe eine Weile nachgedacht. Wenn die Code-Parameter vor jeder Verwendung der Indikatordaten dynamisch bestimmt werden, warum wird das Verfahren zur Bestimmung dieser Parameter nicht in den Indikatorcode aufgenommen? Mit anderen Worten: Alle Berechnungen sollten in den Indikator integriert werden.

Oder gibt es Situationen, in denen ein solches Vorgehen prinzipiell unmöglich ist?

Es gibt Situationen, in denen Parameter von einem anderen Indikator berechnet und an den Expert Advisor zurückgegeben werden, und der Expert Advisor entscheidet auf der Grundlage der Neuronen, welches Modell zu verwenden ist. Wir wissen nicht im Voraus, welcher Satz von Parametern angewandt werden wird.

 
Expert:
Können Sie mir bitte sagen, warum bei einem so einfachen Indikator der Null-Balken (der erste von rechts) nicht überall berechnet wird , außer bei der wöchentlichen Grafik?


Oops) Ich habe hier:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); anstelle von e - rates_total und alles funktioniert)
 
Expert:
Oops) hier ersetzt:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); anstelle von e - rates_total und alles hat funktioniert)

Fix bugs Mann mit Spitznamen Expert? es sollte im Thema Humor sein.
 

Ich versuche, einen Multicurrency Expert Advisor zu erstellen. Bisher habe ich mich für das von Nikolay Kositsin in seinem Artikel"Creating an Expert Advisor that trades on different symbols" vorgeschlagene Schema entschieden. Ich hatte das Problem, dass die Ergebnisse unterschiedlich ausfielen, wenn ich einen Test mit verschiedenen Symbolen, aber denselben Parametern durchführte. Ich habe das Forum durchforstet und festgestellt, dass viele zu dem Schluss gekommen sind, dass dieses Problem mit der Funktion OnTimer() gelöst werden kann. Andrey Khatimlansky hat ihn hier beraten:

Отвяжитесь от тиков конкретного инструмента (OnTick) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.

Ich habe versucht, den Moment der Balkenbildung bei allen Instrumenten zu erwischen, aber ich habe nicht das gewünschte Ergebnis erzielt.

Zum Beispiel:

In der Funktion, die einen neuen Balken erkennen soll, gebe ich ausdrücklich das Instrument und den Zeitrahmen an.

bool isNewBar(string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
 // В статической переменной будем помнить время открытия последнего бара
 static datetime last_time = 0;
 // Текущее время
 datetime lastbar_time = (ENUM_SERIES_INFO_INTEGER)SeriesInfoInteger(Symbol_,Timeframe,SERIES_LASTBAR_DATE);

 // Если это первый вызов функции
 if(last_time == 0)
   {
    // Установим время и выйдем 
    last_time = lastbar_time;
    return(false);
   }

 // Если время отличается
 if(last_time != lastbar_time)
   {
    // Запомним время и вернем true
    last_time = lastbar_time;
    return(true);
   }
 // Дошли до этого места - значит бар не новый, вернем false
 return(false);
}

In der Funktion OnTick() wird das von Nikolay Kositsin vorgeschlagene Schema verwendet.

Zum Beispiel:

void OnTick()
{ 
 // Объявление массивов переменных для торговых сигналов  
 static bool UpSignal[2], DnSignal[2];

 // Получение торговых сигналов
 TradeSignalCounter(0, остальные параметры);
 TradeSignalCounter(1, остальные параметры);

 // Совершение торговых операций
 TradePerformer(0, остальные параметры);
 TradePerformer(1, остальные параметры);
}


Die Funktion isNewBar(Symbol,Timeframe) wird in der Funktion aufgerufen, in der der Handel ausgeführt wird, d.h. TradePerformer(Parameter).

Zum Beispiel:

bool TradePerformer(параметры)
{

...

 if(isNewBar(Symbol_,Timeframe))
   {
    Trailing_Stop(параметры);
   
    Open_Source_Position(параметры);
   }
 return(true);
}


Das heißt, für jedes Symbol wird ein neuer Balken geprüft. Wenn es keinen neuen Balken gibt, wird das nächste Symbol geprüft. Und so geschieht es mit jeder Zecke. Aber diese Variante funktioniert nicht.

Bitte geben Sie mir einen Rat, wie ich die Überprüfung eines neuen Barrens in einem Multi-Currency Expert Advisor in dem gegebenen Schema korrekt umsetzen kann.
 
Urain:
Sollte in den Humor-Thread, um Fehler zu korrigieren, die von jemandem namens Experte?
In diesem Forum können und sollten Sie Fehler im Expertencode korrigieren, unabhängig von Rasse oder Zeitrahmen :)