Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 1104

 
shtr:

Hallo zusammen!

Können Sie mir bitte sagen, warum die Bestellungen nicht geöffnet werden?

Init ist Init, Handel ist Init. Es gibt OnTick für EAs, es ist nicht nötig, alles in den Init zu stecken...

Und für inite gibt es spezielle Exit-Codes, die von den Entwicklern erfunden wurden, warum benutzen Sie diese nicht?

 
evillive:

Initu steht für initu, Handel steht für togo. Es gibt OnTick für EAs, es ist nicht nötig, alles in den Init zu stecken...

Und für inite gibt es spezielle Exit-Codes, die von den Entwicklern erfunden wurden, warum benutzen wir sie nicht?

Wahrscheinlich, weil wir keine Vorwahlen für die Kündigung kennen. Die Beispiele in der Anleitung unterscheiden sich von dem Formular im Editor. Dort fehlt zum Beispiel die Funktion int start(). Als ich das Beispiel eines einfachen Expert Advisors aus dem Tutorial in die Inite eingefügt habe, hat es irgendwie funktioniert. Aber egal, was ich geschrieben habe, es hat nicht funktioniert. So beschloss ich, nach zweiwöchigen Experimenten einen Experten zu konsultieren. Danke für den Tipp!

Ich habe alles in OnTick eingegeben, aber es hat sich nichts geändert.

 
shtr:

Wenn wir sie nicht verwenden, liegt das wohl daran, dass wir die Init-Abschlusscodes nicht kennen. Die Beispiele im Lehrbuch weichen von der Form im Editor ab. Dort fehlt zum Beispiel die Funktion int start(). Als ich das Beispiel eines einfachen Expert Advisors aus dem Tutorial in die Inite eingefügt habe, hat es irgendwie funktioniert. Aber egal, was ich geschrieben habe, es hat nicht funktioniert. So beschloss ich, nach zweiwöchigen Experimenten einen Experten zu konsultieren. Danke für den Tipp!

Ich habe alles in OnTick eingegeben, aber es hat sich nichts geändert.

Vergessen Sie das Tutorial, es ist noch mit der alten Syntax geschrieben, seitdem hat sich viel geändert. Die Hilfe aus der Terminalauslieferung ist am wichtigsten, und kodobase, wenn Sie nachschauen, ist auch eine Quelle für Beispiele in der neuen Version von MQL.

Und über nicht alle Code in der inite zu schreiben, war es vor, suchen Sie durch das Forum, gibt es Hunderte von Beiträgen in allen Sprachen dieses Forums, nur jedes Mal gibt es einen neuen Schriftsteller, der nicht ein Leser ist ;)

 
evillive:

Vergessen Sie das Tutorial, es ist noch nach der alten Syntax geschrieben, seitdem hat sich viel geändert. Die Hilfe aus der Terminalauslieferung ist am wichtigsten, und kodobase, wenn Sie nachschauen, ist auch eine Quelle für Beispiele in der neuen Version von MQL.

Und über nicht schreiben alle Code in der inite, es war vor, suchen Sie durch das Forum, gibt es Hunderte von Beiträgen in allen Sprachen dieses Forums, nur jedes Mal gibt es einen neuen Schriftsteller, der nicht ein Leser ;)

Danke!

Alte Lehrbücher sollten, wenn sie nicht mehr aktuell sind, sofort vernichtet werden).

 
shtr:

Ich danke Ihnen!

Alte Tutorials sollten, wenn sie an Relevanz verlieren, sofort geraucht werden))

Und werfen Sie nicht alles in OnTick, nur das, was für den Handel relevant ist, der Teil des Codes, der nur beim Start läuft, sollte in OnInit gelassen werden (natürlich, dass die Namen der Funktionen sollten in Latein geschrieben werden, nur faul, um das Layout auf dem Forum jedes Mal ändern).

Zum Code selbst: Es gibt Fragen zur Schleife, sie ist seltsam, ich glaube, es gibt nicht genug geschweifte Klammern...

Ja, und auch für die Berechnung der Gewinn- und Verluststufen sind sie nicht korrekt vorgeschrieben. Der Server sollte den Preis senden, vorzugsweise normalisiert, nicht den Wert in Pips.

 
evillive:

Und nicht alles in OnTick packen, nur das, was für den Handel relevant ist, ein Teil des Codes, der nur beim Start ausgelöst wird, sollte in OnInit gelassen werden (natürlich sollten die Funktionsnamen in Latein geschrieben werden, ich bin nur zu faul, das Layout im Forum jedes Mal zu ändern).

Zum Code selbst: Es gibt Fragen zur Schleife, sie ist seltsam, meiner Meinung nach gibt es nicht genug geschweifte Klammern...

Ja, und auch für die Berechnung der Gewinn- und Verluststufen sind sie nicht korrekt vorgeschrieben. Der Server sollte den Preis senden, vorzugsweise normalisiert, nicht den Wert in Pips.

Ich habe es verstanden, danke. Ich werde die Klammern überprüfen - der Editor hat keine Fehler produziert.

Warum hat das Beispiel aus dem Buch funktioniert? Ich habe alle Funktionen entfernt und nur den Beispielcode eingefügt, beginnend mit int start. Es traten keine Fehler auf und die Geschäfte wurden geöffnet.

 
shtr:

Verstanden, danke. Ich werde die Klammern überprüfen - der Editor hat keine Fehler angezeigt.

Warum hat das Beispiel aus dem Buch funktioniert...? Ich habe alle Funktionen entfernt und nur den Beispielcode eingefügt, beginnend mit int start. Es traten keine Fehler auf und die Geschäfte wurden geöffnet.

Nun, ich hatte keinen Grund, das zu tauschen, was funktioniert hat ))))

Wenn sich Ihre Frage auf den Unterschied zwischen Start und Ontik bezieht, sollten Sie alles von Start auf Ontik übertragen haben. Oder besser gesagt, in Ihrem Fall, von OnInit zu OnTick.

Der Compiler erkennt Syntaxfehler, die Logik wird nur von einem Menschen überprüft. In besonderen Fällen kann sogar der Autor des Codes verwirrt werden :)

 
evillive:

Nun, was funktionierte, musste nicht gehandelt werden ))))

Und Int Start der alte Weg und OnTick der neue Weg für EAs, so dass Sie alles von Start zu OnTick verschoben haben sollten. Oder besser gesagt, in Ihrem Fall, von OnInit zu OnTick.

Der Compiler erkennt Syntaxfehler, die Logik wird nur von einem Menschen überprüft. In besonderen Fällen kann sogar der Autor des Codes verwirrt werden :)

//+------------------------------------------------------------------+
//| 3333.mq4 |
//| Copyright 2016, MetaQuotes Software Corp.
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#Eigenschaft Version "1.00"
#Eigenschaft streng
extern int MA_1=5;
extern int MA_2=20;
extern MA_3=80;
extern inttern TP=100;
extern int SL=50;
extern double Lot=0.1;
Zeichenfolge Symb;
//+------------------------------------------------------------------+
Experten-Initialisierungsfunktion //|.
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion |
//+------------------------------------------------------------------+
void OnTick()
{
double MA_1_t;
double MA_2_t;
double MA_3_t;
int gesamt;
int pos;
Symbol=Symbol();
Gesamt=0;
for( pos=1; pos<=OrdersTotal(); pos++)
pos=OrderSelect(pos-1,MODE_TRADES);
if(pos==0)
MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0);
MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
{
double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
pos=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,stoploss,takeprofit, "Mein Auftrag",16384,0,clrGreen);
Rückkehr;
}
if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
{
double stoploss=NormalizeDouble(SL*Point-Bid,Digits);
double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
pos=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,stoploss,takeprofit, "Mein Auftrag",16384,0,clrRed);
Rückkehr;
}
Rückkehr;
}
//---

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

"Nun, was funktioniert hat, muss nicht verkauft werden)))" Nun, Sie wollen selbst etwas kritzeln.)

Der Patient kam nach der Manipulation nicht mehr zur Vernunft.

 
shtr:

"Du hättest das, was funktioniert hat, nicht eintauschen sollen.")) Nun, Sie wollen selbst etwas kritzeln.)

Der Patient kam nach der Manipulation nicht mehr zur Besinnung.

Nun, die Logik und die Mathematik sind lahm, es ist klar, dass es so nicht funktionieren wird.

Warum brauchen wir zum Beispiel eine Schleife in diesem EA? Ich meine, es ist doch klar, dass wir berechnen müssen, wie viele Bestellungen für das jeweilige Symbol und den jeweiligen Zauberer bereits aufgegeben wurden, oder? Was wir hier aber sehen, ist, dass die Schleife nichts zählt und nicht zählen kann, weil sie keinen "Zähler" hat, der in )))) eingeschraubt ist.

Total=0;                                   

   for( pos=1; pos<=OrdersTotal(); pos++)         
   pos=OrderSelect(pos-1,MODE_TRADES); И что дальше? Переменная pos всегда или 0, или 1, цикл сбивается постоянно на начало, а то и заглючить может и превратиться в бесконечный цикл.

OrderSelect() gibt einen booleschen Wert, true oder false, zurück, der für die Variable pos nicht geeignet ist. Und die Schleife sollte besser mit dem ältesten Auftrag beginnen, d. h. in umgekehrter Reihenfolge, um das Überspringen von Aufträgen zu vermeiden.

Die Variable Total kann als Zähler nützlich sein:

for(pos=OrdersTotal()-1;pos>=0;pos--)
{
  if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
  { 
    if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
    {
     Total++; //если это наш ордер, добавляем счётчику единицу
    }
  }
}
if(Total<1)
{
  торгуем
}

Ich entfernte unnötige Dinge, fügte Fehlerausgabe nach OrderSend hinzu, für Tester auf Nicht-ECN-Konten sind die Aufträge bereits offen:

#property version   "1.00"
#property strict
extern int MA_1=5;
extern int MA_2=20;
extern int MA_3=80;
extern int TP=100;
extern int SL=50;
extern double Lot=0.1;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
   double MA_1_t=0;
   double MA_2_t=0; 
   double MA_3_t=0;
   int Total=0;
   
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
   {
     if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
     { 
       if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
       {
        Total++; //если это наш ордер, добавляем счётчику единицу
       }
     }
   }
   if(Total<1)
   {
      MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
      MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0); 
      MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
  
      if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
      {
         double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
         double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
         if(OrderSend(Symbol(),OP_BUY,Lot,Ask,6,stoploss,takeprofit,"My order buy",16384,0,clrGreen)<1) 
         Print("OrderSend error #",_LastError," BuySL=",stoploss," BuyTP=",takeprofit);
      }
    
      if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
      {
         double stoploss=NormalizeDouble(Bid+SL*Point,Digits);
         double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
         if(OrderSend(Symbol(),OP_SELL,Lot,Bid,6,stoploss,takeprofit,"My order sell",16384,0,clrRed)<1)
         Print("OrderSend error #",_LastError," Sell SL=",stoploss," Sell TP=",takeprofit);
      }
   }
}

Ach ja, auch die Berechnung des SL-Levels für Verkäufe war falsch, wir sollten aufmerksamer sein.

 
evillive:

Nun, die Logik und die Mathematik sind lahm, also ist es klar, dass es so nicht funktionieren wird.

Warum sollte es zum Beispiel einen Zyklus in diesem EA geben? Ich meine, es ist doch klar, dass wir berechnen müssen, wie viele Aufträge wir für das gegebene Symbol und die magische Zahl haben, oder? Was wir hier aber sehen, ist, dass die Schleife nichts zählt und nicht zählen kann, weil sie keinen "Zähler" hat, der in )))) eingeschraubt ist.

OrderSelect() gibt einen booleschen Wert, true oder false, zurück, der für die Variable pos nicht geeignet ist. Und die Schleife sollte besser mit dem ältesten Auftrag beginnen, d. h. in umgekehrter Reihenfolge, um das Überspringen von Aufträgen zu vermeiden.

Die Variable Total kann als Zähler nützlich sein:

Ich entfernte unnötige Dinge, fügte Fehlerausgabe nach OrderSend hinzu, für den Tester auf Nicht-ECN-Konten die Aufträge bereits offen:

Ach ja, auch die Berechnung des SL-Levels für die Verkäufe war falsch, man muss sorgfältiger sein.

Wow!!! Danke!!! Das erfordert einige Überlegungen.

Vielleicht gibt es irgendwo ein "Selbststudium" zu den neuen Vorschriften? Die vierstellige Seitenzahl ist ein bisschen stressig...