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

 
.roman.:

Unnötige (für das Problem irrelevante) Berechnungen wurden entfernt. Die Drucker wurden dem Code hinzugefügt, um das Problem zu verdeutlichen. Trotz des Vergleichs des Ordersymbols mit dem Symbol, auf dem der EA geöffnet ist, kann der EA folgendes anzeigen (aus dem Ozi-Chart nehmen Sie die Orderdaten auf Euro, zum Beispiel, wie in diesem Fall):

                        if(Ask>openPrice)
                           {
                              Print("OrderSymbol ",OrderSymbol()," OrderTicket ",OrderTicket()," OrderOpenPrice ",OrderOpenPrice());
                           }
                     

Dies kann nicht der Fall sein, da der Ask für das Känguru auf keinen Fall höher sein kann als jeder offene Preis für den Eurodollar im Jahr 2015...

Und alle Prüfungen für die ausgewählte Reihenfolge werden besser nach der Auswahl mit einer separaten if()-Klausel durchgeführt.

 
evillive:

Das kann nicht der Fall sein, denn es ist unmöglich, dass der Ask des Kängurus höher ist als jeder Eröffnungskurs des Eurodollars im Jahr 2015...

Und alle Prüfungen für die ausgewählte Bestellung sollten nach der Auswahl mit einer separaten if()-Klausel erfolgen.

Das stimmt, das konnte es nicht. Aus diesem Grund wurden Bid<openPrice-Aufträge für eu bei 1,11262 erteilt.

Mit anderen Worten, schlagen Sie vor, das Vorhandensein einer Order mit Hilfe von if(OrderSelect()) zu prüfen und dann im eingebetteten if bereits das Chart-Symbol mit dem Order-Symbol, dem offenen Preis usw. zu vergleichen?

 
.roman.:

Das stimmt, das konnte es nicht. Aus diesem Grund hat er einen Bid<openPrice-Auftrag für eu bei 1,11262 erteilt.

Mit anderen Worten, schlagen Sie vor, mit if(OrderSelect()) zu prüfen, ob eine Order vorliegt, und dann das Chart-Symbol mit dem Order-Symbol, dem Eröffnungskurs usw. in dem eingebetteten if zu vergleichen?

Ja, genau, zuerst OrderSelect(), und dann die nächste Prüfung für die restlichen Parameter.
 

Es ist nicht hilfreich, mit Tamburinen zu tanzen.

Es macht keinen Unterschied, ob man die Auftragsauswahl und die Prüfung auf Symbol und Magier in eine Zeile schreibt oder auf 3 verschiedene Zeilen aufteilt. Entsprechend den Änderungen in neuen Builds werden die Prüfbedingungen stufenweise geprüft, d. h. wenn die erste Bedingung nicht erfüllt ist, werden die folgenden nicht geprüft. Es ist dasselbe wie bei den 3 Zeilen. Die erste Bedingung ist erfüllt und die zweite wird geprüft. Und nur wenn auch die zweite Bedingung erfüllt ist, wird die dritte geprüft.

Das Problem besteht wahrscheinlich darin, dass im gelöschten Teil des Codes eine Benutzerfunktion aufgerufen wird, bei der eine andere Bestellung ausgewählt wird.

 

Hätte es einen Hinweis auf die Arbeit mit Aufträgen gegeben, wäre mir das als erstes aufgefallen. Aber es werden nur Berechnungen durchgeführt und keine einzige Benutzerfunktion verwendet. Es ist nicht klar, was genau dazu führt, dass ein Auftrag aus einem anderen Paar ausgewählt wird. Deshalb bin ich auch so verwirrt über die in der Dokumentation erwähnte "Softwareumgebung" und habe den Code bereits wie von evillive vorgeschlagen überarbeitet und bin bereit, mit Tamburinen zu tanzen. Die nächste Perversion ist ein erzwungener Vergleich mit dem Bid\ask des gewünschten Paares über marketinfo.


UPD.: Problem gelöst. Tatsächlich fand eine verschachtelte Funktion, die ihre eigene OrderSelect verwendet. Danke für die Idee, AlexeyVik.

 
Hallo alle, Können Sie mir sagen, wie man ein Problem zu lösen, finde ich die Bar-Nummer, die ich in der Schleife wollen, aber ich brauche auch die Vergangenheit Bar-Nummer in der Schleife, wie man dies kurz und bündig zu implementieren? Ich danke Ihnen.
for(i=limit; i>=0; i--)
{
yesterday_weekday = TimeDayOfWeek(iTime(Symbol(),0,i-1))-TimeDayOfWeek(iTime(Symbol(),0,i));
if (yesterday_weekday ==1)
yesterday_time=iTime(Symbol(),0,i);
yesterday_shift=iBarShift(Symbol(),0,yesterday_time0);//последний бар 

}
 

Ich habe einen EA erstellt (nicht für die Arbeit, nur für die Praxis)

Wenn ich beide Parameter in der IF-Funktion, wenn ich sie eine nach der anderen, alles wird gut funktionieren, hier ist der Code (Auch, wie kann ich sicherstellen, dass, wenn ich bereits eine offene Buy-Order die nächste Buy-Order wird nicht geöffnet, auch wenn alle Bedingungen übereinstimmen)?

//+------------------------------------------------------------------+
//|                                                        новый.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()

  {
  
double PC = iClose ("EURUSD", PERIOD_H1, 0);  

double MA = NormalizeDouble (iMA ("EURUSD", PERIOD_H1, 12, 0, MODE_LWMA, PRICE_MEDIAN, 0), 4); 


if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point);

   
return (0);





   
  }
//+------------------------------------------------------------------+
 
inuboh:

Ich habe einen EA erstellt (nicht für die Arbeit, nur für die Praxis)

Wenn ich sie einzeln einstelle, funktioniert es gut, d.h. der Code ist korrekt (und ich möchte wissen, wie ich überprüfen kann, ob ich bereits einen offenen Kaufauftrag habe und der nächste Kaufauftrag nicht geöffnet wird, selbst wenn alle Bedingungen korrekt sind):

Nicht, dass dies die Quelle aller Probleme wäre, sondern aus rein akademischem Interesse: warum gleichzeitig OnInit(), OnDeinit() und dann plötzlich start()?

Und was die Frage anbelangt, so wird dringend davon abgeraten, einen solchen Vergleich zu stellen == MA, der sich in der Geschichte sehr selten bewahrheitet. Was bedeutet also der Ausdruck PC-->MA?

Was die Erlaubnis für einen Kauf betrifft, durchlaufen wir alle Marktpositionen und vergleichen sie mit den angegebenen Kriterien - Symbol, Typ, magische Zahl - und erhöhen den Zähler um eins, wenn die gesuchte Position gefunden wird. Dann wird dieser Zähler gegebenenfalls überprüft.

So ist das nun mal:

   _ExpertOrdersB=0;
   _ExpertOrdersS=0;

   for(int z=OrdersTotal()-1; z>=0; z --)
     {
      if(!OrderSelect(z,SELECT_BY_POS))
        {
         Print(". OrderSelect("+IntegerToString(z)+", SELECT_BY_POS ) FAIL!. Error #"+IntegerToString(GetLastError()));
        }
      if((OrderMagicNumber()==magic) && OrderSymbol()==_Symbol)
        {
          switch(OrderType())
           {
            default: break;
            case 0:
               _ExpertOrdersB++;
               break;
            case 1:
               _ExpertOrdersS++;
               break;
           }
        }
     }


if (_ExpertOrdersB < 1) //если нет покупок, то пытаемся купить, при условии, что:
if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point); 
 
evillive:

Nicht, dass dies die Quelle aller Probleme wäre, aber rein aus akademischem Interesse: warum gleichzeitig OnInit(), OnDeinit() und dann plötzlich start()?

Und was die Frage anbelangt, so wird dringend davon abgeraten, einen solchen Vergleich zu stellen == MA, der sich in der Geschichte sehr selten bewahrheitet. Was bedeutet also der Ausdruck PC-->MA?

Was die Erlaubnis für einen Kauf betrifft, durchlaufen wir alle Marktpositionen und vergleichen sie mit den angegebenen Kriterien - Symbol, Typ, magische Zahl - und erhöhen den Zähler um eins, wenn die gesuchte Position gefunden wird. Dann schauen wir uns den Zähler an, wo es nötig ist.

Ich habe start() aus "Gewohnheit" korrigiert)

Warum ist Ask == MA ein seltenes Ereignis? Berührt der aktuelle Geldkurs selten die Linie des gleitenden Durchschnitts?

Die PC-->MA ist in meinem Fall, wenn der vorherige Schlusskurs höher ist als die Linie des gleitenden Durchschnitts (ich habe keine andere Möglichkeit gefunden).

Wenn ich also die IF-Funktion nacheinander mit Ask == MA und dann PC-->MAaktiviere , funktioniert es gut, aber wenn ich sie kombiniere, funktioniert es nicht!

 
evillive:

Nicht, dass dies die Quelle aller Probleme wäre, aber rein aus akademischem Interesse: warum gleichzeitig OnInit(), OnDeinit() und dann plötzlich start()?

Und was die Frage anbelangt, so wird dringend davon abgeraten, einen solchen Vergleich zu stellen == MA, der sich in der Geschichte sehr selten bewahrheitet. Was bedeutet also der Ausdruck PC-->MA?

Was die Erlaubnis für einen Kauf betrifft, durchlaufen wir alle Marktpositionen und vergleichen sie mit den angegebenen Kriterien - Symbol, Typ, magische Zahl - und erhöhen den Zähler um eins, wenn die gesuchte Position gefunden wird. Dann wird dieser Zähler gegebenenfalls überprüft.

So ist das nun einmal:

Nach meinem Verständnis ist PC-- > MA dasselbe wie PC-1 > MA.