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

 
Vitaly Muzichenko:
Geben Sie die Preise alle auf einmal ein, oder holen Sie sie ein und geben sie dann in die Berechnung ein?
Vitaly Muzichenko:
Legen Sie die Preise auf einmal fest oder erhalten Sie sie und fügen sie dann in die Berechnung ein?
int k=Zeitraum;
for(int i=1; i<=Periode; i++)
{
H1_Close[i]=Close[k];
k--;
}
Ich nehme einen Teil von timesession, der dem Zeitraum ab dem letzten geschlossenen Balken entspricht, und drehe ihn im Array um, da 1 der vorletzte Balken in timesession ist und die Berechnung mit dem i-ten Balken beginnen muss.
d.h. meine Funktion sollte den SMMA-Wert des letzten geschlossenen Balkens zurückgeben.
 
Guten Tag, liebe Kolleginnen und Kollegen.
Der folgende Code verschlüsselt eine einfache Idee.
Wenn der letzte geschlossene Auftrag auf SEL
Wenn der letzte geschlossene Auftrag auf der NEL war
Einen NEL-Auftrag eröffnen
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                            
if ( OrderType ()==OP_SELL)                                            
X = OrderProfit( );                                            

if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                            
if ( OrderType ()==OP_BUY)                                              
if(X < 0)                                              

OrderSend(Symbol(),OP_SELL,0.1,Bid ,3,Ask+400*Point,Ask-200*Point,"17-10",123 );



QUESTION
Welches Sprachkonstrukt kann verwendet werden, um zwei weitere Bedingungen zu diesem Code hinzuzufügen (rot eingekreist)

Wenn der letzte geschlossene Auftrag NEL ist
Wenn der letzte CEL-Auftrag abgeschlossen wurde
Wenn der letzte geschlossene Auftrag an der NEL geschlossen wurde
Wenn der letzte geschlossene Auftrag auf einemSL

geschlossen wurde,danke für Ihre Hilfe.


Ich wäre Ihnen sehr dankbar, wenn Sie den Code schreiben und nicht nur erklären könnten, was zu tun ist.
 
Hallo. Ich schreibe ein Skript zum Löschen aller ausstehenden Aufträge. Es wird jedoch nur ein Auftrag gelöscht. Ich habe immer zwei ausstehende Aufträge oder einen. In beiden Fällen wird nur ein Kaufstopp gelöscht. Um den Sell Stop zu löschen, müssen Sie das Skript erneut ausführen, vorausgesetzt, es gibt keine anderen Buy Stop-Aufträge. Bitte teilen Sie uns mit, wo der Fehler liegt.

void DeleteOrders()
{
int Total=AuftragsSumme();
for(int i=0;i<Total;i++)
if(OrderSelect(i,SELECT_BY_POS))
{
int type=OrderType(), ticket=OrderTicket();
bool c;
Schalter(Typ)
{
Fall 4:
c=AuftragLöschen(Ticket);
if(!c)
Print(GetLastError());
Pause;
Fall 5:
c=AuftragLöschen(Ticket);
if(!c)
Print(GetLastError());
Pause;
}
}
}
 
0B53RV3R:
Hallo. Ich schreibe ein Skript zum Löschen aller ausstehenden Aufträge. Es wird jedoch nur ein Auftrag gelöscht. Ich habe immer zwei ausstehende Aufträge oder einen. In beiden Fällen wird nur ein Kaufstopp gelöscht. Um den Sell Stop zu löschen, müssen Sie das Skript erneut ausführen, vorausgesetzt, es gibt keine anderen Buy Stop-Aufträge. Bitte geben Sie an, wo der Fehler liegt.

void DeleteOrders()
{
int Total=AuftragsSumme();
for(int i=0;i<Total;i++)
if(OrderSelect(i,SELECT_BY_POS))
{
int type=OrderType(), ticket=OrderTicket();
bool c;
Schalter(Typ)
{
Fall 4:
c=AuftragLöschen(Ticket);
if(!c)
Print(GetLastError());
Pause;
Fall 5:
c=AuftragLöschen(Ticket);
if(!c)
Print(GetLastError());
Pause;
}
}
}
Ändern Sie die Suchrichtung for(i=gesamt-1;i>=0;i--)
 
Maxim Kuznetsov:
die Suchrichtung ändern for(i=Gesamt-1;i>=0;i--)
Danke, jetzt funktioniert es. Verstehe ich das richtig, dass, wenn ein Auftrag mit Index 0 gelöscht wird, ein Auftrag mit Index 1 den Index 0 erhält und bei der nächsten Iteration i == 1 ist, und ein solcher Auftrag nicht existiert? Können Sie mir sagen, ob dies der Fall ist?
 
0B53RV3R:
Danke, jetzt funktioniert es. Verstehe ich das richtig, dass, wenn ein Auftrag mit Index 0 gelöscht wird, ein Auftrag mit Index 1 den Index 0 erhält und bei der nächsten Iteration i == 1 ist und kein solcher Auftrag erscheint? Können Sie feststellen, ob dies der Fall ist?
Richtig.
 

Es gibt eine anpassbare Fraktal-Funktion, na ja, das ist ganz schön schwer. Ich habe das Zeichnen von Objekten nur belassen, um visuell zu zeigen, ob die Fraktale richtig geformt werden - es wird nicht vorhanden sein.

Frage: Wie können wir es einfacher machen, denn visuelle Tests sind blöd:

extern int FrLeft=15; // Баров слева
extern int FrRight=5; // Баров справа

//-----------------------------------------------------------------------------------------------
void OnTick()
{
int nFrUp= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_UPPER); // Возвращает номер бара
int nFrDn= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_LOWER); // Возвращает номер бара
double FrHigh = High[nFrUp]; // Цена верхнего фрактала
double FrLow  = Low [nFrDn]; // Цена нижнего фрактала

SetArrow("FrUp"+"_"+(string)Time[nFrUp], Time[nFrUp], High[nFrUp], clrDeepSkyBlue, 217, 2, ANCHOR_BOTTOM);
SetArrow("FrDn"+"_"+(string)Time[nFrDn], Time[nFrDn], Low[nFrDn], clrDeepPink, 218, 2, ANCHOR_TOP);

// Comment("Price: ",FrHigh,", Num: ",nFrUp,"\nPrice: ",FrLow,", Num: ",nFrDn);
}

//----------------------------------------------------------------------------------------------+
//---------------------- Возвращает номер бара фрактала (настраиваемый) ------------------------+
//----------------------------------------------------------------------------------------------+
int GetBarFractal(string symb,ENUM_TIMEFRAMES tf=0,int nLeft=2,int nRight=2,int numFr=0,int mode=MODE_UPPER) {
int i=0,cn=0,pos=0,r=0,l=0,e=0,equals,bars;
double _high[], _low[];
nLeft=nLeft<=2?2:nLeft;
nRight=nRight<=2?2:nRight;
equals=nLeft+nRight;
bars=Bars(symb,tf)-equals;
ArraySetAsSeries(_high,true);
ArraySetAsSeries(_low,true);

  for(pos=nRight+1; pos<bars; pos++) {
   r=nRight;
   if(mode==MODE_UPPER) {
    CopyHigh(symb,tf,0,pos+equals+1,_high);
    for(i=1; i<=r; i++) {
     if(_high[pos]<=_high[pos-i]) break;
   }}
   if(mode==MODE_LOWER) {
    CopyLow(symb,tf,0,pos+equals+1,_low);
    for(i=1; i<=r; i++) {
     if(_low[pos]>=_low[pos-i]) break;
   }}
   //--
   if(i==r+1) {
    l=nLeft;
    e=equals;
     for(int j=1; j<=l+equals; j++) {
      if(mode==MODE_UPPER) {
       if(_high[pos]<_high[pos+j])  break;
       if(_high[pos]>_high[pos+j])  l--;
       if(_high[pos]==_high[pos+j]) e--;
      }
      if(mode==MODE_LOWER) {
       if(_low[pos]>_low[pos+j])  break;
       if(_low[pos]<_low[pos+j])  l--;
       if(_low[pos]==_low[pos+j]) e--;
      }
      if(l==0) {
       cn++;
       if(cn>numFr) return(pos);
      }
      //--
      if(e<0) break;
   }}
  }
   Print(__FUNCTION__": Фрактал не найден");
  return(0);
}

//----------------------------------------------------------------------------------------------+
//------------------- Функция рисования значка на графике, объект OBJ_ARROW --------------------+
//----------------------------------------------------------------------------------------------+
void SetArrow(string nm="", datetime t1=0, double p1=0, color col=clrRed,
                                           int code=252, int width=1, int anchor=0) {
if(ObjectFind(0,nm)==-1) {
    ObjectCreate(0,nm,OBJ_ARROW,0,0,0);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
    ObjectSetInteger(0,nm,OBJPROP_ARROWCODE,code);
    ObjectSetInteger(0,nm,OBJPROP_ANCHOR,anchor);
    ObjectSetInteger(0,nm,OBJPROP_WIDTH,width);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,false);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetDouble(0,nm,OBJPROP_PRICE,p1);
    ObjectSetInteger(0,nm,OBJPROP_TIME,t1);
   }
}

Danke!

 
Vitaly Muzichenko:

Es gibt eine anpassbare Fraktal-Funktion, na ja, das ist ganz schön schwer. Ich habe das Zeichnen von Objekten nur deshalb belassen, um visuell zu zeigen, ob sich die Fraktale richtig bilden - das wird nicht passieren.

Frage: Wie kann ich es einfacher machen, denn es ist blöd , es visuell zu testen:

Danke!

Sie können es nur einfacher machen, indem Sie alles in einen Indikator verwandeln. Auch der Kommentar in der oberen linken Ecke des Charts und vor allem die Positionseröffnungs- und -schlussmarken, die der Tester selbst setzt, verlangsamen die Prüfung.
 

Hallo. Könnten Sie einem Neuankömmling einen Rat geben?

Hier ist ein Beispiel:

if(Bedingung1)

if(Bedingung2)

{

}

sonst

{

}

Dem Code zufolge sollte sich Else auf if(condition1) beziehen und wird ausgeführt, wenn condition1 nicht erfüllt ist

Tatsächlich wird sie aber auch ausgeführt, wenn Bedingung2 nicht erfüllt ist.

 
Andy-D:

Hallo. Könnten Sie einem Neuankömmling einen Rat geben?

Hier ist ein Beispiel:

if(Bedingung1)

if(Bedingung2)

{

}

sonst

{

}

Dem Code zufolge sollte sich Else auf if(condition1) beziehen und wird ausgeführt, wenn condition1 nicht erfüllt ist

Tatsächlich wird sie aber ausgeführt, wenn Bedingung2 nicht erfüllt ist.


Gewöhnen Sie sich an, lockige Klammern sofort mit der Bedingung zu setzen

if(Bedingung)

{

}

A gemäß Ihrer Frage

if(Условие1)
   {
       if(Условие2)

        {

        }
    }
   else

    {

    }