Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 46

 
Renat Akhtyamov:
int ticket;//тикет ордера
..........
ticket=OrderSend(.....);//приказ и запоминаем тикет ордера
if(ticket>0)//открылась
{
//действия с тикетом
}

Genauere Angaben wären:

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend - "Gibt die Ticketnummer zurück, die dem Auftrag vom Handelsserver zugewiesen wurde, oder -1, falls der Auftrag fehlgeschlagen ist ."

Auch im Testgerät ist die erste Ticketnummer 1, nicht 0.

 
Oksana Berenko:

Genauer gesagt, wird es das sein:

if(ticket!=-1)//открылась
{
//действия с тикетом
}

OrderSend - "Gibt die Ticketnummer zurück, die dem Auftrag vom Handelsserver zugewiesen wurde, oder -1, falls der Auftrag fehlgeschlagen ist ."

Auch im Testgerät ist die erste Ticketnummer 1, nicht 0.

So froh, die fehlende Oksana zu sehen ))

Ja, die Tickets beginnen mit 1 im Tester und auf dem DC-Server, aber Sie werden nie 1 im DC erwischen. Ihre Version funktioniert nicht ganz, es ist nicht korrekt, Ungleichheit mit -1 zu vergleichen. Was ist, wenn das echte Konto 1234567 zurückgibt?

if(ticket>0)//открылась
{
//действия с тикетом
}


// так верно
 

Im Tester kann ein Ticket also nicht kleiner als eins sein, erst recht nicht in der realen Welt

Null kleiner als eins ist, sind beide Bedingungen korrekt, nur eine für den Vergleich, die andere für den Ausschluss.

Obwohl ich mich daran gewöhnt habe:

// Открываем ордер
      int ticketbuy = OrderSend(sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),Slippage,0,0,Comments,mn,0,BuyColor);
         if(ticketbuy<0)
         Print(sy," OpenPosition. OrderSend Buy fail #",GetLastError());
         else
         Print(sy," OpenPosition. OrderSend Buy successfully");

Aber bei mir sind die Bedingungen alle korrekt, nur die Logik ist anders)

 
Guten Abend, darf ich Ihnen ein frohes neues Jahr wünschen? Könnten Sie mir bitte sagen, was an diesem Stück Code falsch ist?
void CloseOrder(int type)
  {
   bool ret;
   int error=0;
   double price=0.0;
   int total=OrdersTotal();
   if(!disabled(_Symbol))
     {
      Print(rezult);
      return;
     }
   for(int i=total-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS))continue;
      if(OrderSymbol()!=_Symbol)continue;
      if(OrderMagicNumber()!=Magic)continue;
      if(OrderType()>1)continue;
      if(OrderType()!=type)continue;
      int digits=(int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
      if(OrderType()==OP_BUY)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_BID),digits);
      if(OrderType()==OP_SELL)price=NormalizeDouble(SymbolInfoDouble(OrderSymbol(),SYMBOL_ASK),digits);

      if(NormalizeDouble(NormalizePrice(OrderSymbol(),price),digits)!=price)continue;
      ret=OrderClose(OrderTicket(),OrderLots(),price,Slippage,clrLawnGreen);
      if(!ret)
        {
         error=GetLastError();
         rezult=StringConcatenate(OrderSymbol(),": error close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType())," №- ",error," ",ErrorDescription(error));
         Print(rezult);
        }
      else
        {
         rezult=StringConcatenate(OrderSymbol(),": close order ",OrderTicket()," ",DoubleToString(OrderLots(),2)," ",TypeToStr(OrderType()));
         Print(rezult);
        }

     }
  }
 
Movlat Baghiyev:
Ich wünsche Ihnen ein frohes neues Jahr! Könnten Sie mir bitte sagen, was an diesem Code falsch ist?

Ich rate dazu, die Logik an der Wurzel zu ändern

Mit anderen Worten, ich muss den Überblick über offene Aufträge behalten - wie viele Verkäufe und wie viele Käufe sind offen.

Und auf der Grundlage dieser Überlegungen sollten wir Aufträge verwalten - sie öffnen und schließen

 

Ich weiß nicht, warum der EA eine Menge von Aufträgen öffnet, wenn die Bedingung nicht für die Eröffnung einer Position sein sollte, aber nach dem Öffnen öffnet er wieder.

Ich kann nicht verstehen, warum meine EA öffnet eine Menge von Aufträgen, wenn ich nicht will, dass es eine Position zu öffnen, aber es öffnet wieder, nachdem ich es öffnen, ich vermute, etwas ist falsch mit der Schleife, ich weiß nicht wirklich verstehen Zyklen

for(int i=OrdersTotal()-1;i>=0;i--)

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magisch) // wenn unsere Magie

{

if(OrderType()==OP_BUY) sdel_b++; // bai zählen

if(OrderType()==OP_SELL) sdel_s++; // Verkäufe zählen

if(OrderType()==OP_BUYSTOP) otl_b++; // Anzahl der anstehenden Bystops

if(OrderType()==OP_SELLSTOP) otl_s++; // Zählung der anstehenden Sellstops

}


// jetzt offene Aufträge

if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0); // Wenn es Zeit ist und keine offenen Aufträge vorhanden sind

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); // eine Pending Order aufgeben

OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

 
wishmast:

Ich weiß nicht, warum der EA eine Menge von Aufträgen öffnet, wenn die Bedingung nicht für die Eröffnung einer Position sein sollte, aber nach dem Öffnen öffnet er wieder.

Ich kann nicht verstehen, warum meine EA öffnet eine Menge von Aufträgen, wenn ich nicht will, dass es eine Position zu öffnen, aber es öffnet wieder, nachdem ich es öffnen, ich vermute, etwas ist falsch mit der Schleife, ich weiß nicht wirklich verstehen Zyklen

for(int i=OrdersTotal()-1;i>=0;i--)

if(OrderSelect(i,SELECT_BY_POS))

if(OrderMagicNumber()==magisch) // wenn unsere Magie

{

if(OrderType()==OP_BUY) sdel_b++; // bai zählen

if(OrderType()==OP_SELL) sdel_s++; // Verkäufe zählen

if(OrderType()==OP_BUYSTOP) otl_b++; // Anzahl der anstehenden Bystops

if(OrderType()==OP_SELLSTOP) otl_s++; // Zählung der anstehenden Sellstops

}


// jetzt offene Aufträge

if(Hour()==00 && Minute()==01 && otl_b==0 && otl_s ==0); // Wenn es Zeit ist und keine offenen Aufträge vorhanden sind

{

OrderSend (Symbol(),OP_BUYSTOP,lot,Vhod1,20,SL2,TP,NULL,magic,0,clrNONE); //eine Position einnehmen

OrderSend (Symbol(),OP_SELLSTOP,lot,Vhod2,20,SL,TP2,NULL,magic,0,clrNONE); //

}

Versuchen Sie dies

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
 
Sergey Gritsay:

Versuchen Sie dies

   sdel_b=0;
   sdel_s=0;
   otl_b=0;
   otl_s=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==magic) // Если наш Меджик
           {
            if(OrderType()==OP_BUY) sdel_b++; // Считаем баи
            if(OrderType()==OP_SELL) sdel_s++; // Считаем селы
            if(OrderType()==OP_BUYSTOP) otl_b++; // Считаем отложенные байстопы
            if(OrderType()==OP_SELLSTOP) otl_s++; // Считаем отложенные селлстопы
           }
        }
     }

....
eröffnet immer noch eine Menge Aufträge
148Die Anzahl der offenen und schwebenden Aufträge hat die vom Broker festgelegte Grenze erreicht.
 
wishmast:
Eröffnet immer noch eine Menge Aufträge
148Die Anzahl der offenen und schwebenden Aufträge hat die vom Broker festgelegte Grenze erreicht.
Bitte senden Sie uns den gesamten Code, es ist schwer zu verstehen, wo Sie einen Fehler machen
 

Grüße. Ein frohes neues Jahr für alle!

Wenn ich versuche, einen EA zu optimieren, nachdem er ausgeführt wurde, sind die Ergebnisse und das Optimierungsdiagramm leer und das Protokoll wird in das Protokoll geschrieben:

Während der Optimierung wurden 2Durchgängedurchgeführt, 2 Ergebnisse wurden als unbedeutend verworfen

Die Deaktivierung der Option"Genetischer Algorithmus" ist nicht hilfreich. Ich verstehe, dass die Ergebnisse für den Prüfer unbedeutend erscheinen, aber wie können wir sehen, was da ist? Und dies trotz der Tatsache, dass der Expert Advisor nicht verlieren Geld für den gleichen Zeitraum (ein Jahr) während der Prüfung, aber es ist +/- 20%.