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

 
Alexey Belyakov:

Legen Sie es ein. Das habe ich nicht. Es wird in Paketen geöffnet. Magie - sie ignoriert sie.



Wenn Sie Code schreiben, übersetzen Sie dessen Logik ins Russische. Zunächst gibt es einen Zyklus, in dem Vergleiche durchgeführt werden, und wenn der ausgewählte Auftrag kein Marktauftrag ist, dann zur nächsten Iteration; wenn das Symbol nicht EURUSD ist, dann zur nächsten Iteration und wenn die Magie nicht gleich Ihrer Magie ist, zur nächsten Iteration. Am Ende des Zyklus zählen Sie die Anzahl der Iterationen, die bis zum Ende des Zyklus vergangen sind. Der Zyklus ist beendet, und das Programm beginnt, Aufträge entsprechend den Bedingungen zu öffnen. Da eine der Bedingungen immer erfüllt ist, wird ein Auftrag eröffnet. Und das geschieht bei jeder Zecke.

 
Valeriy Yastremskiy:

Wenn Sie den Code schreiben, übersetzen Sie seine Logik ins Russische. Sie haben zunächst einen Zyklus, in dem Vergleiche angestellt werden: Wenn der ausgewählte Auftrag kein Marktauftrag ist, dann zur nächsten Iteration; wenn das Instrument nicht der Eurobucks ist, dann zur nächsten Iteration; und wenn die Magie nicht gleich Ihrer Magie ist, dann zur nächsten Iteration. Am Ende des Zyklus zählen Sie die Anzahl der Iterationen, die bis zum Ende des Zyklus vergangen sind. Der Zyklus ist beendet, und das Programm beginnt, die Aufträge entsprechend den Bedingungen zu öffnen. Da eine der Bedingungen immer erfüllt ist, wird ein Auftrag eröffnet. Und das geschieht bei jeder Zecke.

Ich verstehe. Aber in diesem Fall, if(OrderMagicNumber() == MagicNumber)continue, wird die platzierte Order für eine von Magic(o) platzierte Order akzeptiert. Das bedeutet, dass die manuell platzierte Order auf EUROBAX ignoriert werden sollte und eine weitere Order von einem Expert Advisor mit Magic eröffnet werden sollte.

OrdersTotal() - das ist das Problem, das jeder Manipulation mit Magic ein Ende setzt.
 
Alexey Belyakov:

Das verstehe ich. Aber in diesem Fall: if(OrderMagicNumber() == MagicNumber)continue; Orders, die platziert werden, werden für Orders genommen, die von Magic(s) platziert wurden. Das heißt, eine manuell platzierte Order auf Eurobucks sollte ignoriert werden, und eine andere sollte von einem EA mit Magic eröffnet werden.

OrdersTotal() - dies ist der Befall, der jeder Manipulation des Magiers einen Riegel vorschiebt.

Der Code wird von oben nach unten ausgeführt. Nach der Schleife erfolgt die Vergabe von Aufträgen. if(OrderMagicNumber() == MagicNumber)continue; Dadurch wird die Ausführung des Schleifenkörpers unterbrochen und eine neue Schleifeniteration beginnt. Die Schleife wird beendet und die Auftragserteilung beginnt. So haben Sie es geschrieben. Die Gesamtzahl der Aufträge hat damit nichts zu tun. Wenn Sie eine Bedingung festlegen möchten, die besagt, dass, wenn keine Aufträge mit Ihrer Magie und Ihrem Instrument erteilt werden, der Code für die Auftragserteilung anders sein sollte.

Gehen Sie die Bestellnummern durch. Wenn ein Auftrag mit unserer Magie und auf unserem Instrument gefunden wird, dann return - exit from start. Oder eine Flagge, dass Ihre Bestellung ist da und beim Start ontik oder Start Kontrolle auf die Flagge.

Und es ist besser, einen EA aus einer Vorlage zu erstellen, um ein EA-Skript, einen Indikator zu erstellen. Die Hauptcodefelder werden korrekter sein.

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >= 0; i--) 
{
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}
          

             
if ((Close[0]>High[1])&&(n==0))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}

if ((Close[0]<Low[1])&&(n==0))  
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}

return(0);
}
 
Valeriy Yastremskiy:

Der Code wird von oben nach unten ausgeführt. in einer Schleife nach den Regeln der Schleife. Nach der Schleife haben Sie Aufträge zu erteilen. if(OrderMagicNumber() == MagicNumber)continue; Dadurch wird die Ausführung des Schleifenkörpers unterbrochen und eine neue Schleifeniteration beginnt. Die Schleife wird beendet und die Auftragserteilung beginnt. So haben Sie es geschrieben. Die Gesamtzahl der Aufträge hat damit nichts zu tun. Wenn Sie eine Bedingung festlegen möchten, die besagt, dass, wenn keine Aufträge mit Ihrer Magie und Ihrem Instrument erteilt werden, der Code für die Auftragserteilung anders sein sollte.

Gehen Sie die Bestellnummern durch. Wenn ein Auftrag mit unserer Magie und auf unserem Instrument gefunden wird, dann return - exit from start. Oder eine Flagge, dass Ihre Bestellung ist da und beim Start ontik oder Start Kontrolle auf die Flagge.

Und es ist besser, einen EA aus einer Vorlage zu erstellen, um ein EA-Skript, einen Indikator zu erstellen. Die Hauptcodefelder werden korrekter sein.

for(int i = OrdersTotal(); i >= 0; i--) 
{
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}

Ich vermute, dass dies nicht die Lösung ist, aber in welche Richtung soll ich arbeiten?

Ich habe ein paar Dutzend Varianten ausprobiert. Entweder öffnet eine Bestellung, oder ohne Unterbrechung, tuyvukuchu.

Hier sollte übrigens über OrderSekect - eine Variable vom Typ bool gesetzt werden, sonst wird geflucht.

 
Alexey Belyakov:

Das ist keine Lösung, aber welchen Weg soll man einschlagen?

Ich habe schon ein paar Dutzend Varianten ausprobiert. Öffnet entweder einen einzelnen Auftrag oder öffnet ohne Unterbrechung.

Hier sollte übrigens über OrderSekect - eine Variable vom Typ bool gesetzt werden, sonst wird geflucht.

Ja, sie sollte ins Leere laufen.

for(int i = OrdersTotal(); i >= 0; i--) 
{
     bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}

Sie sollten besser einen Algorithmus schreiben, was Sie auch tun wollen.

 
Alexey Belyakov:

Das ist keine Lösung, aber welchen Weg soll man einschlagen?

Ich habe schon ein paar Dutzend Varianten ausprobiert. Öffnet entweder einen einzelnen Auftrag oder öffnet ohne Unterbrechung.

Hier sollte übrigens über OrderSekect - eine Variable vom Typ bool gesetzt werden, sonst wird geflucht.

Anstatt return(0) sollte es continue heißen

 

Gute und sachkundige Leute! Hilfe bei der Implementierung des Envelopes-Indikators in einen MT5 EA. Der EA selbst muss jeden Tick (ohne Überspringen) verarbeiten. Ich habe einige Varianten ausprobiert, ich habe in der Dokumentation nachgeschaut, ich scheine die Variante zu mögen, aber sie ist für den Handler OnCalculate. Ich habe es noch nicht mit der Standardbibliothek ausprobiert ... Nun, hier ist meine erste Implementierung:

input int       Indicatorperiod         = 3;
input double    EnvelopesDeviation      = 0.07;
int    handle;                                          //--- переменная для хранения хэндла индикатора iEnvelopes
double upperEnv[3], lowerEnv[3];                        // динамические массивы для хранения численных значений Emvelopes
double local_envelopesupper, local_envelopeslower;      // в эти переменные пытаюсь получить значения верхней и нижней линии индикатора
...

int OnInit()
...
handle=iEnvelopes(_Symbol,_Period,Indicatorperiod,0,MODE_LWMA,PRICE_OPEN,EnvelopesDeviation);
...

void OnTick()
...
//--- Объявляем структуру, которая будут использоваться
   MqlRates mrate[3];           // Будет содержать цены, объемы и спред для каждого бара
   ArraySetAsSeries(mrate, true); 

      //--- Получить исторические данные последних 3-х баров
      if(CopyRates(_Symbol,_Period,0,3,mrate)!=3)
        {
         Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
         return;
        }

      //--- Используя хэндлы индикаторов, копируем новые значения индикаторных буферов в массивы
      if(CopyBuffer(handle,0,0,3,upperEnv)<2 || CopyBuffer(handle,1,0,3,lowerEnv)<2)
        {
         Alert("Ошибка копирования буферов индикатора Envelopes - номер ошибки:",GetLastError(),"!!");
         return;
        }
...
local_envelopesupper = upperEnv[1];
local_envelopeslower = lowerEnv[1];
...

Im visuellen Tester erhalte ich:


Können Sie mir sagen, was falsch ist und wie man es am besten macht?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Некорректное отображение индикатора
 
Valeriy Yastremskiy:

Ja, es soll fluchen, es geht ins Leere.

Schreiben Sie lieber den Algorithmus auf, den Sie machen wollen, es ist nicht klar, was Sie brauchen.

In der ersten Nachricht steht der Code. Es ist ganz einfach: Wir durchbrechen das vorherige Hoch/Tief und eröffnen ein Geschäft. Die von diesem EA eröffneten Orders sollten sich nicht mit anderen Orders überschneiden, die manuell oder von einem anderen EA eröffnet wurden, d.h. der EA sollte unabhängig arbeiten.

Ich habe das ganze Internet durchforstet. Es ist ein eher triviales Thema, aber es gibt viele Varianten. Es scheint eine einfache Sache zu sein, die nirgendwo zu finden ist.

 
Alexey Belyakov:

In der ersten Nachricht ist der Code. Es ist ganz einfach: Durchbrechen Sie das vorherige Hoch/Tief - eröffnen Sie einen Handel. Die von diesem EA eröffneten Orders sollten sich nicht mit anderen, manuell oder von einem anderen EA eröffneten Orders überschneiden, d.h. der EA sollte unabhängig arbeiten.

Ich habe das ganze Internet durchforstet. Es ist ein eher triviales Thema, aber es gibt viele Varianten. Es scheint eine einfache Sache zu sein, die nirgendwo zu finden ist.

Beschreiben Sie die Arbeit des Expert Advisors Schritt für Schritt. Der erste Schritt besteht darin, zu prüfen, ob es Aufträge mit unserer Magie auf dem ausgewählten Symbol gibt. Wenn wir sie haben, beenden wir unsere Arbeit, wenn nicht, geben wir die Aufträge. Was geschieht, nachdem die Bestellungen aufgegeben wurden? Sie lautet wie folgt
 
Maxim Kuznetsov:

anstelle von return(0) sollte die Bedeutung continue sein

Es gibt Gleiche, also gehen wir nicht weiter und beenden... Ich mag es nicht, wenn es nicht gleich ist, dann mach weiter. Es ist schwieriger zu verstehen.
Grund der Beschwerde: