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

 
danil77783:

Hallo. Könnten Sie mir helfen, wenn Sie Zeit haben Frage ist dies, ich brauche die EA, um einen Auftrag auf jedes Signal von zwei Indikatoren zu öffnen, (sie geben ein Signal, wenn sie in bestimmten Kombination sind) in einem Wort, sollte es mehrere Kauf oder Verkauf Aufträge auf dem Markt, bzw. nach den Signalen der Indikatoren sein. Aber ich habe nur einen Auftrag auf dem Markt, und bis dieser geschlossen wird, öffnet sich der nächste nicht...... Liegt es an der Zählung der Aufträge? Bitte geben Sie mir einen Hinweis. Wenn Sie ihn brauchen, kann ich Ihnen den Code schicken.

Vielen Dank im Voraus!

die Bedingung "if (OrdersTotal()==0)...." entfernen. - Sie sagen nur: Suche nach Einträgen und eröffne neue Aufträge nur dann, wenn es gar keine Aufträge gibt.

Wenn Sie ein großes Paket neuer Aufträge nicht ohne eine solche Bedingung öffnen wollen, müssen Sie eine zusätzliche Bedingung erstellen. Und das hängt von Ihrer Strategie ab: keine neue Order innerhalb der Zeit T der vorherigen zu eröffnen, oder die Balken zu kontrollieren oder Abstände in Pips zwischen den Orders einzuhalten...

 

Hallo. Zunächst möchte ich mich bei Ihnen bedanken, dass Sie Neulingen helfen. Ich wäre nicht in der Lage, Tag für Tag einem Neuling und dann noch einem anderen elementare Fragen zu beantworten.

Und die Frage ist folgende:

Früher, als mql4 noch etwas anders war, dachte ich, dass jede Orderverarbeitung, wie z.B. das Öffnen/Schließen/Ändern nach einem möglichen Fehler durch die return(0)-Funktion unterbrochen werden sollte. Wenn ich also mehrere offene Orders zum aktuellen Preis schließen müsste, würde der Tester sie bei jedem neuen Takt einzeln schließen, und das würde das reale Bild im Tester (für jeden Tick eines Frames) wahrscheinlich (manchmal ziemlich dramatisch) verzerren. Der neue EA muss mehrere Orders genau nach dem Signal und teilweise schließen.

Frage: Ist es möglich, alle von ihnen in einer Schleife zu verarbeiten (sie teilweise zu schließen), ohne die Schleife jedes Mal zu unterbrechen? Wird der Prüfer damit zurechtkommen? D.h., wird es in der Lage sein, sie alle teilweise in einem Takt zu schließen?

 
XpeHHukoB:

Hallo. Zunächst möchte ich mich bei Ihnen bedanken, dass Sie Neulingen helfen. Ich wäre nicht in der Lage, Tag für Tag einem Neuling und dann noch einem anderen elementare Fragen zu beantworten.

Und die Frage ist folgende:

Früher, als mql4 noch etwas anders war, dachte ich, dass jede Orderverarbeitung, wie z.B. das Öffnen/Schließen/Ändern nach einem möglichen Fehler durch die return(0)-Funktion unterbrochen werden sollte. Wenn ich also mehrere offene Orders zum aktuellen Preis schließen müsste, würde der Tester sie bei jedem neuen Takt einzeln schließen, und das würde das reale Bild im Tester (für jeden Tick eines Frames) wahrscheinlich (manchmal ziemlich dramatisch) verzerren. Der neue EA muss mehrere Orders genau nach dem Signal und teilweise schließen.

Frage: Ist es möglich, alle von ihnen in einer Schleife zu verarbeiten (sie teilweise zu schließen), ohne die Schleife jedes Mal zu unterbrechen? Wird der Prüfer damit zurechtkommen? D.h., wird es in der Lage sein, sie alle teilweise in einem Takt zu schließen?

Unter einer kleinen Bedingung ist das ohne Probleme möglich. Der Code muss korrekt geschrieben sein.

 
Seric29:
Wenn es 2 Funktionen (möglicherweise überladen), zum Beispiel, int Funkz(int a) int Funkz(int a, int b, int w), und dann das Programm kompiliert wird, welche Funktion wird schneller arbeiten, die erste, wenn man bedenkt, dass es ein Argument hat, oder es spielt keine Rolle, weil das Programm bereits gebaut ist und was im Körper beschrieben ist, oder trotzdem gibt es einen kleinen Effekt, weil die Funktion Argumente einen Stapel darstellen, für die der Speicher reserviert ist?

Wenn Sie zwei gleichnamige Funktionen mit unterschiedlicher Anzahl von Argumenten haben, ist es keine Frage, welche schneller aufgerufen wird. Wenn Sie eine Funktion aufrufen, schreiben Sie nicht Funkz(), sondern geben die Anzahl der Argumente an.

Die Frage ist, ob der Compiler Funktionen mit demselben Namen auffrisst.

Wenn ich es richtig verstehe, geht es nicht um den Code, sondern um die kompilierte Datei?

 
Ähm ... Vielen Dank für Ihre Antwort, Alexej. Es hat sich einiges geklärt.
 
Hilfe bitte, wir haben SL gleich einen Wert in Pips (diese Höhe des Verlustes - benutzerdefinierte Parameter), und wir haben ein Symbol Preis für den Tag niedrig oder hoch - es ist wie eine zweite Stop-Loss und zu verschiedenen Zeitpunkten werden sie unterschiedlich sein, ich brauche die Auto-Vergleichsfunktion - so dass nach, dass Roboter setzt einen Stop-Loss für den kleinsten Parameter (SL oder Ilow - für kaufen oder SL -iHign für verkaufen) unten ist der Code, der nicht das gewünschte Ergebnis geben, kann ich nicht verstehen, was es ist...
   пользовательский параметр - extern int    SL               = 1000;
//---------------------------------------------------------------
bool CheckForStopLossSell()
  {
   double Hign=iHigh(Symbol(),PERIOD_D1,1);
   double StopLoss=NormalizeDouble(SL*Point,Digits);
   double uroven = StopLoss;
   double OOPS=iLow(Symbol(),PERIOD_D1,1)-StepOpenOrder*Point;
   double StopLossS=NormalizeDouble(OOPS+StopLoss,Digits);
   //----------------------------------------
   if(Hign>StopLoss) Alert("StopLoss");
   return bool(StopLossS);
   
   //else
   if(Hign<StopLoss) Alert("Hign");
   return bool(Hign); 
   
   //else
   Alert("uroven");
   return bool(uroven); 
   
  }
//--------------------------------------------------------------
bool CheckForStopLossBuy()
  {
   double LOW=iLow(Symbol(),PERIOD_D1,1);
   double StopLoss=SL*Point;
   double uroven = StopLoss;
   double SPREAD = MarketInfo(Symbol(),MODE_SPREAD)*Point;
   double OOPB = (iHigh(Symbol(),PERIOD_D1,1)+SPREAD)+StepOpenOrder*Point;
   double StopLossB=OOPB-StopLoss;
   //-------------------------------------------
   if(LOW<StopLoss) Alert("StopLoss"); 
   return bool(StopLossB);  
   
   //else
   if(LOW>StopLoss) Alert("LOW"); 
   return bool(LOW);  
   
   //else
   Alert("uroven");
   return bool(uroven);  
   
  }
//---------------------------------------------------------------
 
XpeHHukoB:

Wenn Sie zwei gleichnamige Funktionen mit unterschiedlicher Anzahl von Argumenten haben, ist es keine Frage, welche schneller aufgerufen wird. Wenn Sie eine Funktion aufrufen, schreiben Sie nicht Funkz(), sondern geben die Anzahl der Argumente an.

Die Frage ist, ob der Compiler Funktionen mit demselben Namen auffrisst.

Sie meinen die kompilierte Datei, nicht den Code?

Und wenn die Funktionen unterschiedlich sind, welche funktioniert dann schneller mit weniger oder mehr Argumenten? Ich denke, dass die Überladung mit verschiedenen Nummern auch eine Belastung darstellt, oder ist sie nur der Einfachheit halber?

 

Bitte sagen Sie mir, wie man #define schreibt?

Ich schreibe es so

#define  my_POS    cst_Position.my_Position

Wenn ich diese Konstruktion in def ändere, funktioniert alles.

my_POS.SelectByTicket(pos_DATA(DATA_TICKET))

Aber wenn ich nur my_POS schreibe. wird die Funktionsliste nicht nach einem Punkt angezeigt.

Dasselbe gilt für

#define  pos_DATA  cst_Position.getPositionData

Es gibt keine Hinweise nach der pos_DATA(.

Was mache ich falsch?

 
bool operation=0;for(int pos=0;pos<OrdersTotal();pos++)
     {if ( OrderSelect (pos, SELECT_BY_POS) == false )  continue;
      if ( OrderSymbol()==Symbol()) break;}


//=========================================================================================================
if(Hour()>=2&&Hour()<=18&&operation==0){
if(OPB1==1)
   {operation=1;if(operation==0 &&OrderSymbol()!=Symbol()||OrdersTotal()==0)
        {OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-ss*Point,Ask+T*Point,"My order#",mn,0,Green);}}
        if (OrderType()==OP_BUY &&OrdersTotal()==1&&OrderMagicNumber()==8)
        {OrderSend(Symbol(),OP_SELLSTOP,5*lots,OrderOpenPrice()-(ss-ss/4)*Point,0,0,SstopClose,"My order#",80,0,Red);}
       

if(OPS1==1)
   {operation=1;if(operation==0 &&OrderSymbol()!=Symbol()||OrdersTotal()==0)        
         {OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+ss*Point,Bid-T*Point,"My order#",mn,0,Red);}}
         if (OrderType()==OP_SELL &&OrdersTotal()==1&&OrderMagicNumber()==8)
         {OrderSend(Symbol(),OP_BUYSTOP,5*lots,OrderOpenPrice()+(ss-ss/4)*Point,0,0,BstopClose,"My order#",80,0,Green);}}



if(OrderMagicNumber()==80){operation=0;
 {for( int  ii=OrdersTotal()-1;ii>=0;ii--)
       {OrderSelect(ii, SELECT_BY_POS);
        int  type   = OrderType();bool result = false;
        switch(type)
         {case OP_BUYSTOP   : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );//break;
          case OP_SELLSTOP  : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); //break;
         
          result = OrderDelete( OrderTicket() );//break;
          }}}}

Hallo, liebe Experten!

Bitte helfen Sie mir, dieses Problem zu lösen.

Wenn ich ein beliebiges Paar teste, funktioniert alles einwandfrei, aber wenn ich mit anderen Währungen arbeite, werden die schwebenden Aufträge nicht platziert (ich muss den schwebenden Auftrag offenlegen) und werden nach der Auslösung des Take-Profits nicht geschlossen.

Bitte teilen Sie mir mit, wie ich den Code ändern kann, falls möglich:



Herzlichen Dank im Voraus

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
Dateien:
c5k8icfo.png  55 kb
 
Motzaart:

Hallo, liebe Experten!

Bitte helfen Sie mir, dieses Problem zu lösen.

...

Bitte geben Sie den Code korrekt ein:


Grund der Beschwerde: