Ich denke, es wäre einfacher, den Expert Advisor neu zu erstellen oder ihn mit einer Datei zu bearbeiten.
Ich denke, es wäre einfacher, vollständig zu beschreiben, was Sie von dem Expert Advisor erwarten, und den gesamten von VISARD erstellten Code bereitzustellen.
Ich brauche zum Beispiel einen Expert Advisor, der Trades eröffnet, wenn der Preis eines Envelopes-Indikators überschritten wird. Das habe ich bekommen:
//+------------------------------------------------------------------+//| envelopes.mq5 |//| Copyright 2011, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright "Copyright 2011, MetaQuotes Software Corp."#property link "http://www.mql5.com"#property version "1.00"//+------------------------------------------------------------------+//| Include |//+------------------------------------------------------------------+#include <Expert\Expert.mqh>//--- available signals#include <Expert\Signal\SignalEnvelopes.mqh>//--- available trailing#include <Expert\Trailing\TrailingNone.mqh>//--- available money management#include <Expert\Money\MoneyFixedLot.mqh>//+------------------------------------------------------------------+//| Inputs |//+------------------------------------------------------------------+//--- inputs for expertinputstring Expert_Title ="envelopes"; // Document nameulong Expert_MagicNumber =28572; // bool Expert_EveryTick =false; // //--- inputs for main signalinputint Signal_ThresholdOpen =10; // Signal threshold value to open [0...100]inputint Signal_ThresholdClose =10; // Signal threshold value to close [0...100]inputdouble Signal_PriceLevel =0.0; // Price level to execute a dealinputdouble Signal_StopLevel =50.0; // Stop Loss level (in points)inputdouble Signal_TakeLevel =50.0; // Take Profit level (in points)inputint Signal_Expiration =4; // Expiration of pending orders (in bars)inputint Signal_Envelopes_PeriodMA =240; // Envelopes(240,0,MODE_LWMA,...) Period of averaginginputint Signal_Envelopes_Shift =0; // Envelopes(240,0,MODE_LWMA,...) Time shiftinputENUM_MA_METHOD Signal_Envelopes_Method =MODE_LWMA; // Envelopes(240,0,MODE_LWMA,...) Method of averaginginputENUM_APPLIED_PRICE Signal_Envelopes_Applied =PRICE_CLOSE; // Envelopes(240,0,MODE_LWMA,...) Prices seriesinputdouble Signal_Envelopes_Deviation=0.15; // Envelopes(240,0,MODE_LWMA,...) Deviationinputdouble Signal_Envelopes_Weight =1.0; // Envelopes(240,0,MODE_LWMA,...) Weight [0...1.0]//--- inputs for moneyinputdouble Money_FixLot_Percent =10.0; // Percentinputdouble Money_FixLot_Lots =0.01; // Fixed volume//+------------------------------------------------------------------+//| Global expert object |//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+//| Initialization function of the expert |//+------------------------------------------------------------------+intOnInit()
{
//--- Initializing expertif(!ExtExpert.Init(Symbol(),PERIOD_H4,Expert_EveryTick,Expert_MagicNumber))
{
//--- failedprintf(__FUNCTION__+": error initializing expert");
ExtExpert.Deinit();
return(-1);
}
//--- Creating signal
CExpertSignal *signal=new CExpertSignal;
if(signal==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating signal");
ExtExpert.Deinit();
return(-2);
}
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.StopLevel(Signal_StopLevel);
signal.TakeLevel(Signal_TakeLevel);
signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalEnvelopes
CSignalEnvelopes *filter0=new CSignalEnvelopes;
if(filter0==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating filter0");
ExtExpert.Deinit();
return(-3);
}
signal.AddFilter(filter0);
filter0.PatternsUsage(2);
//--- Set filter parameters
filter0.PeriodMA(Signal_Envelopes_PeriodMA);
filter0.Shift(Signal_Envelopes_Shift);
filter0.Method(Signal_Envelopes_Method);
filter0.Applied(Signal_Envelopes_Applied);
filter0.Deviation(Signal_Envelopes_Deviation);
filter0.Weight(Signal_Envelopes_Weight);
//--- Creation of trailing object
CTrailingNone *trailing=new CTrailingNone;
if(trailing==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating trailing");
ExtExpert.Deinit();
return(-4);
}
//--- Add trailing to expert (will be deleted automatically))if(!ExtExpert.InitTrailing(trailing))
{
//--- failedprintf(__FUNCTION__+": error initializing trailing");
ExtExpert.Deinit();
return(-5);
}
//--- Set trailing parameters//--- Creation of money object
CMoneyFixedLot *money=new CMoneyFixedLot;
if(money==NULL)
{
//--- failedprintf(__FUNCTION__+": error creating money");
ExtExpert.Deinit();
return(-6);
}
//--- Add money to expert (will be deleted automatically))if(!ExtExpert.InitMoney(money))
{
//--- failedprintf(__FUNCTION__+": error initializing money");
ExtExpert.Deinit();
return(-7);
}
//--- Set money parameters
money.Percent(Money_FixLot_Percent);
money.Lots(Money_FixLot_Lots);
//--- Check all trading objects parametersif(!ExtExpert.ValidationSettings())
{
//--- failed
ExtExpert.Deinit();
return(-8);
}
//--- Tuning of all necessary indicatorsif(!ExtExpert.InitIndicators())
{
//--- failedprintf(__FUNCTION__+": error initializing indicators");
ExtExpert.Deinit();
return(-9);
}
//--- okreturn(0);
}
//+------------------------------------------------------------------+//| Deinitialization function of the expert |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+//| "Tick" event handler function |//+------------------------------------------------------------------+voidOnTick()
{
ExtExpert.OnTick();
}
//+------------------------------------------------------------------+//| "Trade" event handler function |//+------------------------------------------------------------------+voidOnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+//| "Timer" event handler function |//+------------------------------------------------------------------+voidOnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
Genossen Entwickler, bitte erklärt mir, was ich im Code ändern sollte, damit nach einem Kauf-/Verkaufssignal eine Position einmal geöffnet und geschlossen wird und das war's, der Expert Advisor öffnet keine Positionen bis zum nächsten Signal. Dies ist insbesondere dann der Fall, wenn das System aus mehreren Indikatoren besteht. Der Expert Advisor ist immer in Position. Er schließt einen bei Take oder Stop und öffnet sofort einen anderen.
All dieser Spaß ist streng an den aktuellen Zeitrahmen gebunden. Um also an die ähnlichen Daten eines anderen Zeitrahmens zu gelangen, können Sie zum Beispiel das Handle des gewünschten eingebauten Standardindikators auf dem gewünschten Zeitrahmen aufrufen:
handle=iGator(_Symbol, PERIOD_W1);
und kopieren Sie dann die erforderlichen Daten in die Puffer mit Hilfe der Copy-functions-Varianten.
All dies wäre in Ordnung, aber es besteht die Notwendigkeit, rates_total und prev_calculated in anderen Zeiträumen als dem aktuellen zu verwenden. Und die gibt es, soweit ich weiß, nicht. Wo und wie können wir sie bekommen, wenn sie offensichtlich nicht in den aktuellen Zeitrahmen passen?
Natürlich gibt es eine klare Erklärung in der Hilfe:
"Wir müssen die Beziehung zwischen dem von OnCalculate() zurückgegebenen Wert und dem zweiten Eingabeparameter prev_calculated beachten. Der Parameter prev_calculated enthält beim Aufruf der Funktion den von OnCalculate() beim vorherigen Aufruf zurü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.
Dazu reicht es in der Regel aus, den Wert des Parameters rates_total zurückzugeben, der die Anzahl der Takte im aktuellen Funktionsaufruf enthält. Wenn seit dem letzten Aufruf von OnCalculate() Preisdaten geändert wurden (eine tiefere Historie wurde gepumpt oder Historienleerstellen wurden gefüllt), dann wird der Wert des Eingabeparameters prev_calculated vom Terminal auf Null gesetzt."
Müssen wir also wirklich manuell unsere eigenen Analoga von rates_total und prev_calculated für andere Zeiträume nach dem oben beschriebenen Prinzip implementieren? Oder gibt es etwas, das sofort verwendet werden kann? Nun, zum Beispiel so:
rates_total = BarsCalculated(handle);
oder den Rückgabewert der Kopierfunktion übernehmen. Aber mit prev_calculated wäre es, gelinde gesagt, nicht so einfach... Wie wird sie richtig umgesetzt?
Ich habe ein Geschäft aus der Historie ausgewählt,die Richtung des Geschäfts ist "pivot" (in/out), dann bestimme ich das Volumen des Geschäfts HistoryDealGetDouble(ticket,DEAL_VOLUME). Ich erhalte das Gesamtvolumen, aber woher weiß ich, welches Volumen ich geschlossen und welches geöffnet habe? Ich möchte wissen, welches Volumen ich geschlossen und welches ich geöffnet habe. Danke.
Ich habe eine lineare Regression geschrieben. Haben Sie vor, so etwas zum Terminal hinzuzufügen und es sogar im Diagramm des Testers anzuzeigen?
Und wie zu verstehen, um die Z-Zahl zu berechnen ist erforderlich, um unabhängig voneinander berechnen die Gesamtzahl der positiven und negativen Serie?
Ich denke, es wäre einfacher, den Expert Advisor neu zu erstellen oder ihn mit einer Datei zu bearbeiten.
Ich denke, es wäre einfacher, vollständig zu beschreiben, was Sie von dem Expert Advisor erwarten, und den gesamten von VISARD erstellten Code bereitzustellen.
Ich brauche zum Beispiel einen Expert Advisor, der Trades eröffnet, wenn der Preis eines Envelopes-Indikators überschritten wird. Das habe ich bekommen:
Frage zu den Indikatoren.
Es gibt eine solche Konstruktion von Eingabeparametern in OnCalculate:
All dieser Spaß ist streng an den aktuellen Zeitrahmen gebunden. Um also an die ähnlichen Daten eines anderen Zeitrahmens zu gelangen, können Sie zum Beispiel das Handle des gewünschten eingebauten Standardindikators auf dem gewünschten Zeitrahmen aufrufen:
und kopieren Sie dann die erforderlichen Daten in die Puffer mit Hilfe der Copy-functions-Varianten.
All dies wäre in Ordnung, aber es besteht die Notwendigkeit, rates_total und prev_calculated in anderen Zeiträumen als dem aktuellen zu verwenden. Und die gibt es, soweit ich weiß, nicht. Wo und wie können wir sie bekommen, wenn sie offensichtlich nicht in den aktuellen Zeitrahmen passen?
Natürlich gibt es eine klare Erklärung in der Hilfe:
"Wir müssen die Beziehung zwischen dem von OnCalculate() zurückgegebenen Wert und dem zweiten Eingabeparameter prev_calculated beachten. Der Parameter prev_calculated enthält beim Aufruf der Funktion den von OnCalculate() beim vorherigen Aufruf zurü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.
Dazu reicht es in der Regel aus, den Wert des Parameters rates_total zurückzugeben, der die Anzahl der Takte im aktuellen Funktionsaufruf enthält. Wenn seit dem letzten Aufruf von OnCalculate() Preisdaten geändert wurden (eine tiefere Historie wurde gepumpt oder Historienleerstellen wurden gefüllt), dann wird der Wert des Eingabeparameters prev_calculated vom Terminal auf Null gesetzt."
Müssen wir also wirklich manuell unsere eigenen Analoga von rates_total und prev_calculated für andere Zeiträume nach dem oben beschriebenen Prinzip implementieren? Oder gibt es etwas, das sofort verwendet werden kann? Nun, zum Beispiel so:rates_total = BarsCalculated(handle);oder den Rückgabewert der Kopierfunktion übernehmen. Aber mit prev_calculated wäre es, gelinde gesagt, nicht so einfach... Wie wird sie richtig umgesetzt?Ich habe den Artikel von Rosh über die Mathematikauf https://www.mql5.com/ru/articles/1492 gelesen.
Gibt es eine Möglichkeit, eine solche Analyse z.B. in OnTester() einzubinden?
Gibt es vorgefertigte Lösungen, die frei verfügbar sind?
Ich habe den Artikel von Rosh über die Mathematikauf https://www.mql5.com/ru/articles/1492 gelesen.
Gibt es eine Möglichkeit, eine solche Analyse z.B. in OnTester() einzubinden?
Gibt es vorgefertigte Lösungen, die frei verfügbar sind?
Ja - Teststatistiken
Können Sie uns beraten?
Ich habe ein Geschäft aus der Historie ausgewählt,die Richtung des Geschäfts ist "pivot" (in/out), dann bestimme ich das Volumen des Geschäfts HistoryDealGetDouble(ticket,DEAL_VOLUME).
Ich erhalte das Gesamtvolumen, aber woher weiß ich, welches Volumen ich geschlossen und welches geöffnet habe? Ich möchte wissen, welches Volumen ich geschlossen und welches ich geöffnet habe. Danke.
Ja - Teststatistiken
Ich habe eine lineare Regression geschrieben. Haben Sie vor, so etwas zum Terminal hinzuzufügen und es sogar im Diagramm des Testers anzuzeigen?
Und wie zu verstehen, um die Z-Zahl zu berechnen ist erforderlich, um unabhängig voneinander berechnen die Gesamtzahl der positiven und negativen Serie?
Und ich verstehe auch, dass man für die Berechnung des Z-Zählers die Gesamtzahl der positiven und negativen Reihen selbst berechnen muss?