[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 46

 
rustein:

Wo genau liegt die Frage?
 
ilunga:
Wo genau liegt die Frage?
https://www.mql5.com/ru/forum/115354/page78
 

in dem von Ihnen angegebenen Code, wenn es nur 1 Auftrag gibt, die Schleife

for(;Cnt>=0;Cnt--)
    {
      RefreshRates();
      OrderSelect(Cnt,SELECT_BY_POS);
      if(OrderMagicNumber()==Magic)
      {
      TotalOpenOrders++;
      }
    }

Beim ersten Mal wird versucht, einen Auftrag auszuwählen, der nicht existiert.

 
ilunga:

Wenn im obigen Code nur 1 Auftrag vorliegt, wird die Schleife

Beim ersten Mal wird versucht, einen Auftrag auszuwählen, der nicht existiert.

Danke, ich werde es selbst korrigieren.
 
artmedia70:
Das Terminal wurde nachdenklich, nach etwa 15 Minuten habe ich es ausgeschaltet.
nichts...
Ich hätte ihn getötet, ohne eine Minute zu warten.
 
PapaYozh:

Unmittelbar vor der Verwendung von Ask und Bid, führen Sie RefreshRates() aus


Ausprobiert, nichts ändert sich

Funktion zum Senden von Aufträgen, alles scheint Standard zu sein

 int OpenPosition(string AdvisorName,int Position,int Magic,double Lots,double StopLoss){ 
 int N; int Сount = 5; int Slippage = (CalculateSpread() * 2); 
 string PeriodString = GetPeriod(Period());
 if(Position == OP_BUY){double Price = NormalizeDouble(Ask,Digits); 
 string OrderName = " - Покупка по рынку";
 string ErrorName = "Ошибка открытия ордера на покупку";
 string CriticalErrorName = "Невозможно открыть ордер на покупку";
 string MailCriticalErrorName = "Ошибка открытия"; color Arrow = Gold;}
 if(Position == OP_SELL){Price = NormalizeDouble(Bid,Digits); 
 OrderName = " - Продажа по рынку"; ErrorName = "Ошибка открытия ордера на продажу";
 CriticalErrorName = "Невозможно открыть ордер на продажу";
 MailCriticalErrorName = "Ошибка открытия"; Arrow = YellowGreen;}
 
 while(IsTradeContextBusy() || !IsTradeAllowed()){int Interval = MathRand()+1000; 
 Print("Торговый поток занят. Повторная проверка через "+DoubleToStr((Interval/1000),0)+" сек"); 
 Sleep(Interval);} RefreshRates(); while(N < Сount){RefreshRates(); 
 int Ticket = OrderSend(Symbol(),Position,Lots,Price,Slippage,StopLoss,0,AdvisorName+
 OrderName,Magic,0,Arrow);
 if(Ticket > 0){if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){int Flag = 1; 
 PlaySound("recharge.wav"); break;}}
 else{Flag = 0; int PRM = GetLastError(); string ERR = Error(PRM,"OrderSend()"); 
 ErrorProcessing(AdvisorName+" "+PeriodString,ErrorName+" "+PRM+" ("+
 Error(PRM,"OrderSend()")+")","","OrderSend()"); N++; Sleep(5000);}
 if(N == Сount){ErrorProcessing(AdvisorName+" "+PeriodString,CriticalErrorName,
 MailCriticalErrorName+" "+PRM+" ("+Error(PRM,"OrderSend()")+")","OrderSend()");}}
 return(Flag);}
 
Dimoncheg:


Ich habe es versucht, aber es ändert sich nichts.

Funktion zum Senden von Aufträgen, alles scheint Standard zu sein


Zunächst aktualisieren Sie die Preise mit der Funktion RefreshRates() und speichern den gewünschten Preis in Price.

Dann führen Sie Sleep(Interval) aus, und zu diesem Zeitpunkt ändern sich die Kurse.

Danach rufen Sie OrderSend() mit dem Angebot vom Vorjahr auf.

Was erwarten Sie als Antwort?

 
PapaYozh:


Zunächst aktualisieren Sie die Preise mit der Funktion RefreshRates() und speichern den gewünschten Preis in Price.

Dann führen Sie Sleep(Interval) aus, und zu diesem Zeitpunkt ändern sich die Kurse.

Und danach rufen Sie OrderSend() mit dem Angebot vom Vorjahr auf.

Was erwarten Sie als Antwort?


Mein Fehler, ich habe ein bisschen an der falschen Stelle modernisiert, jetzt habe ich den Preis aus der Funktion herausgenommen

OpenPosition("Sovetneg",OP_BUY,NormalizeDouble(Ask,Digits),Magic,SlowlyIncreasingLots(0.2),MultiStop(OP_BUY,StopLoss));
Die Funktion selbst ist nun
 int OpenPosition(string AdvisorName,int Position,double Price,int Magic,double Lots,double StopLoss){ 
 int N; int Сount = 5; int Slippage = (CalculateSpread() * 2); 
 string PeriodString = GetPeriod(Period());
 if(Position == OP_BUY){
 string OrderName = " - Покупка по рынку";
 string ErrorName = "Ошибка открытия ордера на покупку";
 string CriticalErrorName = "Невозможно открыть ордер на покупку";
 string MailCriticalErrorName = "Ошибка открытия"; color Arrow = Gold;}
 if(Position == OP_SELL){
 OrderName = " - Продажа по рынку"; ErrorName = "Ошибка открытия ордера на продажу";
 CriticalErrorName = "Невозможно открыть ордер на продажу";
 MailCriticalErrorName = "Ошибка открытия"; Arrow = YellowGreen;}
 
 while(IsTradeContextBusy() || !IsTradeAllowed()){int Interval = MathRand()+1000; 
 Print("Торговый поток занят. Повторная проверка через "+DoubleToStr((Interval/1000),0)+" сек"); 
 Sleep(Interval);} while(N < Сount){RefreshRates(); 
 int Ticket = OrderSend(Symbol(),Position,Lots,Price,Slippage,StopLoss,0,AdvisorName+
 OrderName,Magic,0,Arrow);
 if(Ticket > 0){if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){int Flag = 1; 
 PlaySound("recharge.wav"); break;}}
 else{Flag = 0; int PRM = GetLastError(); string ERR = Error(PRM,"OrderSend()"); 
 ErrorProcessing(AdvisorName+" "+PeriodString,ErrorName+" "+PRM+" ("+
 Error(PRM,"OrderSend()")+")","","OrderSend()"); N++; Sleep(5000);}
 if(N == Сount){ErrorProcessing(AdvisorName+" "+PeriodString,CriticalErrorName,
 MailCriticalErrorName+" "+PRM+" ("+Error(PRM,"OrderSend()")+")","OrderSend()");}}
 return(Flag);}
Sieht es jetzt richtig aus?
 

Hallo.

Können Sie mir sagen, was Typ==4 bedeutet?

und Typ==5

in dem folgenden Ausschnitt:

double ma=iMA(Symbol(),PERIOD_D1,21,0,MODE_SMA,PRICE_CLOSE,0);

for(int k=1; k<=OrdersTotal(); k++)
bool select=OrderSelect(k-1,SELECT_BY_POS);

if(select)
{
int type=OrderType();
int ticket=OrderTicket();

if (Bid<ma && type==4)
OrderDelete(ticket);
if (Bid>ma && type==5)
OrderDelete(ticket);
}

Ich verstehe, dass die Bedingungen für die Löschung von Aufträgen, von ma ist klar, aber zusammen wie?

Ich danke Ihnen.

 
Dimoncheg:


Scheint das jetzt nicht richtig zu sein?


Nein, ist es nicht. Es wurde sogar noch schlimmer :)

Verstehen Sie, RefreshRates() aktualisiert die Werte der vordefinierten Ask- und Bid-Variablen, Sie verwenden den einmal in der Price-Variablen gespeicherten Wert.

Grund der Beschwerde: