[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 182

 
 
dent:
Wie Sie einen Berater bestellen können
Sie können hier bestellen: https://www.mql5.com/ru/job
 
NaVolne:


Warum ist dies der Fall?

Der EA verarbeitet jeden Tick, und bei jedem Tick erfolgt eine Überprüfung und Eröffnung einer Order.... Sie müssen sich den Zeitpunkt der letzten offenen Position merken und eine Pause von 15 Minuten einlegen, oder Sie können nach der Eröffnung oder Schließung eines Balkens arbeiten. Es ist besser, im Code mit der Barzeit verbunden zu sein.

double OpenBar=0; 
 
int start()
   {
    //Проверка на начало нового бара
    if (OpenBar==Time[0]) {return;} else {OpenBar=Time[0];}
    //ваш код
   }
 
dent:
Wie man einen Berater bestellt
 
OlegTs:
double OpenBar=0; 

 

int start()
   {
    //Проверка на начало нового бара
    double CurOpenBar=iOpen(NULL,PERIOD_M15,0);  
    if (OpenBar==CurOpenBar) {return;} else {OpenBar=CurOpenBar;}
    //ваш код
   }


oder so ähnlich...

Ein schlechtes Beispiel. Denn der Eröffnungskurs der Leuchter kann wiederholt werden. Aber der Zeitpunkt ist nicht der richtige.
 
MaxZ:
Schlechtes Beispiel. Denn der Eröffnungskurs der Leuchter kann wiederholt werden. Aber der Zeitpunkt ist nicht der richtige.

Ich stimme zu:)))
 
Vielen Dank, Leute, es fängt an zu klappen :)
 

Ich versuche, mcl4 zu lernen und einen EA für Tests zu schreiben. Es haben sich einige Fragen ergeben.

1) Gibt es ein Verfahren, um die analysierte Historie auf fehlende Minuten-Kerzen für dieses oder jenes Paar zu überprüfen? Vielleicht ist das Verfahren bereits geschrieben und im Netz verfügbar?

2) Wenn es Lücken oder nur eine kleine Menge der Geschichte, wie kann der EA herunterladen die ganze Minute Candlesticks für dieses oder jenes Paar aus dem erforderlichen Datum oder füllen die Lücken?

Die Idee ist, dass der EA die Korrektheit der Historie während der Arbeit überprüft und die Lücken oder die geringe Anzahl von Balken korrigiert, wenn es nötig ist.
 

Ich lerne gerade eine Programmiersprache und habe Schwierigkeiten, das Verhalten des Programms zu verstehen. Ich habe einen EA geschrieben, der auf dem Lehrbuch basiert, aber ich habe ihn auf ein etwas anderes Funktionsprinzip umgestellt.

Der Expert Advisor basiert auf einer Mittelwertbildung über 2 Muwings. Die Idee ist einfach: Die gleitenden Durchschnitte kreuzen sich, der Auftrag wird geschlossen und der entgegengesetzte wird eröffnet. Ich habe einen EA geschrieben und er funktioniert gut. Das ist natürlich ein kleiner Nachteil, aber es entspricht der Idee. Das gesamte Problem lautet wie folgt (fett gedruckt):

A=iMA(NULL,0,Zeitraum_MA_1,0,MODE_SMA, PRICE_CLOSE,1); // A

B=iMA(NULL,0,Zeitraum_MA_2,0,MODE_SMA,PREIS_SCHLUSS,1); // B

C=iMA(NULL,0,Zeitraum_MA_1,0,MODE_SMA,PREIS_SCHLUSS,2); // C

D=iMA(NULL,0,Zeitraum_MA_2,0,MODE_SMA,PREIS_SCHLUSS,2); // D

Wenn ich die Art der Berechnung der gleitenden Durchschnitte ändere (es kann ein Pluszeichen angezeigt werden) und die exponentielle Methode( MODE_SMA) anstelle der einfachen(MODE_EEMA ) und einer weiteren(MODE_SMMA), der so genannten geglätteten Methode, verwende, geht alles schief. Das Funktionsprinzip wird noch amüsanter (im Strategietester), da der EA eine Order ganz am Anfang des eingestellten Zeitraums öffnet und am Ende schließt. D.h. für ein Jahr wird ein einziger Handel am Anfang des Zeitraums eröffnet und am Ende geschlossen. Im Ergebnis hat mir der Expert Advisor ein Plus gezeigt, aber ich brauche ein solches Plus nicht. Ich kann selbst eine Münze werfen und entweder eine Kauf- oder Verkaufsorder eröffnen und schauen, ob ich in einem Jahr gewinne oder verliere. Übrigens, wenn ich MODE_SMA auf MODE_LWMA (Linear Weighted Moving Average) einstelle, funktioniert das Programm einwandfrei.

Bitte teilen Sie mir mit, was los ist? Das Prinzip ist dasselbe, nur die Art und Weise, wie die gleitenden Durchschnitte berechnet werden, wurde ein wenig verändert.

Hier ist der gesamte Code des Programms:

//+------------------------------------------------------------------+

//| Basierend auf zwei gleitenden Durchschnitten.mq4

//| Copyright © 2011, MetaQuotes Software Corp.

//| http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2011, MetaQuotes Software Corp.

#property link "http://www.metaquotes.net"



//--------------------------------------------------------------- 1 --

// Numerische Werte für M15


extern int int Zeitraum_MA_1=6; // Zeitraum MA1

extern int Zeitraum_MA_2=15; // Zeitraum MA 2

extern double Lots =0.1; // Feste Anzahl von Losen



bool Work=true; // Expert Advisor wird funktionieren.

string Symb; // Name des Finanzinstruments

//--------------------------------------------------------------- 2 --

int start()

{

int

Total, // Anzahl der Aufträge im Fenster

Tip=-1, // Auftragsart ausgewählt (B=0,S=1)

Ticket; // Bestellnummer

doppelt

A, //Wert. MA_1-Wert für den ersten Takt vom Ende an

MA_2-Wert für den ersten Balken ab Ende

Preis, // Preis der ausgewählten Bestellung

C, //Wert. MA_1 für den zweiten Takt vom Ende

D, // Bedeutung. MA_2-Wert für den zweiten Balken vom Ende her

Lot; // Anzahl der Lose im ausgewählten Auftrag

bool

Ans =false, // Serverantwort nach dem Schließen

Cls_B=false, // Kriterium für den Abschluss Kauf

Cls_S=false, // Kriterium für den Abschluss Verkauf

Opn_B=false, // Kriterium für die Eröffnung Kaufen

Opn__S=false; // Kriterium für die Öffnung Verkauf

//--------------------------------------------------------------- 3 --

//Vorverarbeitung

if(Balken < Period_MA_2) // Nicht genügend Balken

{

Alert("Nicht genügend Balken im Fenster, Expert Advisor funktioniert nicht");

return; // Beenden von start()

}

if(Work==false) // Kritischer Fehler.

{

Alert("Kritischer Fehler: Expert Advisor funktioniert nicht.");

return; // Beenden von start()

}

//--------------------------------------------------------------- 4 --

// Zählen der Aufträge

Symb=Symbol(); // Name des Finanzinstruments.

Total=0; // Anzahl der Aufträge

for(int i=1; i<=OrdersTotal(); i++) // Auftragsschleife

{

if(OrderSelect(i-1,SELECT_BY_POS)==true) // Wenn die folgenden

{ // Auftragsanalyse:

if (OrderSymbol()!=Symb)continue; // Nicht unser Finanzinstrument

if (OrderType()>1) // Wir haben einen schwebenden Auftrag

{

Alert("Pending order detected. Expert Advisor is not working;)

return; // Exit()

}

Total++; // Zähler für Marktaufträge

if (Gesamt>1) // Nicht mehr als eine Bestellung

{

Alert("Mehrere Marktaufträge, Expert Advisor funktioniert nicht;)

return; // Exit()

}

Ticket=OrderTicket(); // Bestellnummer ausgewählt.

Tip =OrderType(); // Typ der ausgewählten Bestellung.

Preis =OrderOpenPrice(); // Preis der ausgewählten Bestellung.

Lot =OrderLots(); // Anzahl der Lose

}

}

//--------------------------------------------------------------- 5 --

// Handelskriterien

A=iMA(NULL,0,Zeitraum_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A

B=iMA(NULL,0,Zeitraum_MA_2,0,MODE_SMA,PREIS_SCHLUSS,1); // B

C=iMA(NULL,0,Zeitraum_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C

D=iMA(NULL,0,Zeitraum_MA_2,0,MODE_SMA,PREIS_SCHLUSS,2); // D


if (A<C&C>D&B>=A) // МА1 Linie geht nach unten,

{ // MA1 kreuzt MA2

Opn_B=true; // von oben nach unten

Cls_S=true; //

}

if (B<D&D>C&&A>=B) // MA2-Linie geht nach unten

{// MA2 kreuzt MA1

Opn_S=true; // von oben nach unten

Cls_B=true; //

}

//--------------------------------------------------------------- 6 --

// Aufträge schließen

while(true) //Ordnen Sie die Abschlussschleife.

{

if (Tip==0 && Cls_B==true) //Kaufauftrag eröffnen.

{ //Es gibt ein Abschlusskriterium

Alert("Versuch, Kauf zu schließen ",Ticket,";)

RefreshRates(); // Daten auffrischen

Ans=OrderClose(Ticket,Lot,Bid,2); // Close Buy

if (Ans==true) // Es hat funktioniert :)

{

Warnung ("Kaufauftrag geschlossen ",Ticket;)

break; // Verlassen der geschlossenen Schleife

}

if (Fun_Error(GetLastError())==1) // Fehlerbehandlung

continue; // erneut versuchen

return; // Beenden von start()

}


if (Tip==1 && Cls_S==true) // Verkaufsauftrag eröffnet.

{ // es gibt ein enges Kriterium

Alert("Versuch, Verkauf zu schließen ",Ticket,";)

RefreshRates(); // Daten auffrischen

Ans=OrderClose(Ticket,Lot,Ask,2); // Close Sell

if (Ans==true) // Es hat funktioniert :)

{

Warnung ("Verkaufsauftrag geschlossen ",Ticket;)

break; // Verlassen der geschlossenen Schleife

}

if (Fun_Error(GetLastError())==1) // Fehlerbehandlung

continue; // erneut versuchen

return; // Beenden von start()

}

break; // Beenden während

}

//--------------------------------------------------------------- 7 --

//--------------------------------------------------------------- 8 --

//Eröffnung von Aufträgen

while(true) //Ordnen Sie die Abschlussschleife.

{

if (Gesamt==0 && Opn_B==true) // Keine offenen Aufträge

{ //Kaufkriterium öffnen.

RefreshRates(); // Daten aktualisieren

Alert("Versuch, Buy zu öffnen, warte auf Antwort...");

Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,20,0,0, "EA 2xMA");//Kauf eröffnen

if (Ticket > 0) // es hat funktioniert :)

{

Warnung ("Kaufauftrag eröffnet ",Ticket;)

return; //Auftrag beenden

}

if (Fun_Error(GetLastError())==1) // Fehlerbehandlung

continue; // erneut versuchen

return; // Beenden von start()

}

if (Total==0 && Opn_S==true) // keine offenen Aufträge

{ //öffnen Verkaufskriterium.

RefreshRates(); // Daten aktualisieren

Alert("Versuch, Sell zu öffnen, warte auf Antwort...");

Ticket=OrderSend(Symb,OP_SELL,Lots,Bid,20,0,0, "EA 2xMA");//Open Sel.

if (Ticket > 0) // es hat funktioniert :)

{

Warnung ("Verkaufsauftrag eröffnet ",Ticket;)

return; // Beenden der Funktion start()

}

if (Fun_Error(GetLastError())==1) // Fehlerbehandlung

continue; // erneut versuchen

return; // Beenden von start()

}

break; // Beenden während

}

//--------------------------------------------------------------- 9 --

return; //Beenden von start()

}

//-------------------------------------------------------------- 10 --

int Fun_Error(int Error) // Fehlerbehandlung fie

{

switch(Fehler)

{ // Unüberwindbare Fehler.

Fall 4: Alert("Der Handelsserver ist beschäftigt. Versuchen Sie es erneut...");

Sleep(3000); // Einfache Lösung.

return(1); // Beenden Sie die Funktion.

case 135:Alert("Preis geändert, versuchen Sie es erneut...");

RefreshRates(); // Daten aktualisieren.

return(1); // Beenden Sie die Funktion.

case 136:Alert("Kein Preis. Ich warte auf einen neuen Tick...");

while(RefreshRates()==false) // Bis zu einem neuen Tick

Sleep(1); // Verzögerung in der Schleife

return(1); // Beenden der Funktion

case 137:Alert("Broker ist beschäftigt, versuchen Sie es erneut...");

Sleep(3000); // Einfache Lösung.

return(1); // Beenden Sie die Funktion.

case 146:Alert("Das Handelssubsystem ist beschäftigt. Versuchen Sie es erneut...");

Sleep(500); // Einfache Entscheidung

return(1); // Beenden der Funktion

// Kritische Fehler

Fall 2: Alert("Allgemeiner Fehler;)

return(0); // Beenden Sie die Funktion.

case 5: Alert("Ältere Version des Terminals.");

Work=false; // Nicht mehr funktionieren

return(0); // Beenden der Funktion

Fall 64: Alert("Konto gesperrt.");

Work=false; // Nicht mehr funktionieren

return(0); // Beenden der Funktion

case 133:Alert("Handel verboten.");

return(0); // Beenden der Funktion

case 134:Alert("Nicht genug Geld, um die Transaktion auszuführen.");

return(0); // Beenden der Funktion

default: Alert("Es ist ein Fehler aufgetreten ",Error); // Andere Optionen

return(0); // Beenden der Funktion

}

}

//-------------------------------------------------------------- 11 --



 
neisseria:

Ich lerne gerade eine Programmiersprache und habe Schwierigkeiten, das Verhalten des Programms zu verstehen. Ich habe einen EA geschrieben, der auf dem Tutorial basiert, aber ich habe ihn nach einem etwas anderen Prinzip verändert.



Beim Schließen der Order wäre es schön, die Gesamtzahl zu verringern, oder, noch besser, sich nicht darum zu kümmern und eine Funktion zu erstellen, die die Anzahl der offenen Orders für das Symbol und die magische Zahl zurückgibt.

Vier gleitende Durchschnitte sind zu viel, und es ist besser, sie in zwei Perioden und mit unterschiedlichen Abständen anzuzeigen. Es wird empfohlen, sie auf dem Bildschirm anzuzeigen und zu sehen, wie sie sich verhalten.