[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 323

 
sergeev:

bevor Sie versuchen, den Auftrag zu schließen, führen Sie OrderSelect aus und prüfen Sie OrderCloseTime. Wenn sie bereits größer als 0 ist, wird der Auftrag geschlossen.


Ich habe Select, und wo sollte ich OrderCloseTime platzieren? Nach der Auswahl oder in der Funktion CloseOrder()?

Nachgeschaut im Doc. Ich habe kein History Select, nur Trad. Ich werde also versuchen, diese History Select nach der Close-Bedingung und vor CloseOrder() zu platzieren. Ich danke Ihnen!

 
Innerhalb der Auswahl, nach den Filtern für Symbol und Magie (falls vorhanden), d.h. wir überprüfen den Auftrag auf die Schließungszeit, wenn sie ungleich Null ist (der Auftrag ist geschlossen), verbieten wir seine erneute Schließung
 
FAQ:
Innerhalb der Auswahl, nach den Filtern für Symbol und Magie (wenn es welche gibt), d.h. wir überprüfen den Auftrag auf die Schließungszeit, wenn sie ungleich Null ist (der Auftrag ist geschlossen), dann verbieten wir, ihn wieder zu schließen


Ich danke Ihnen! Dann werde ich das oben genannte ausprobieren!

Hier, versucht, einfügen, lief es in der Demo, aber etwas kommt aus mehr Fehler und anders. Ich frage zuerst, vom Herd aus, nach diesem Code von Doka:

  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
    {
     datetime ctm=OrderOpenTime();
     int      ticket=OrderTicket();
     if(ctm>0) Print("Время открытия ордера № ",ticket," ",ctm);
     ctm=OrderCloseTime();
     if(ctm>0) Print("Время закрытия ордера № ",ticket," ",ctm);
    }
  else
    Print("OrderSelect() вернул ошибку ",GetLastError());

Was ist hier überflüssig, zwischen Selecta Trades, Symbolchecks, Magie... einzufügen? и ... Auftragsart. Vielleicht sollte man datetime cmt und int ticket zu Beginn einführen? Und der Drucker schreibt andere Fehler.

Und fügen Sie eine Abschlussbedingung hinzu:

if(ctm == 0) {CloseOrder(OrderTicket(),OrderLots(),Bid,slip,Yellow);return(0);} else continue;

Bitte um Hilfe!

 

Hallo, können Sie mir einen Tipp geben?

Ich möchte einen Auftrag nicht sofort mit stp und sl eröffnen, sondern stp und sl nach der Eröffnung des Auftrags durch Änderung festlegen

Das habe ich getan:

ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,SpringGreen)
{
OrderSelect(ticket,SELECT_BY_TICKET);
}
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Blue);
zurück(0);

}


Ich weiß nicht, was zum Teufel ich hier tue.

oder?

 
RMX13:

Hallo, können Sie mir einen Tipp geben?

Ich möchte einen Auftrag nicht sofort mit stp und sl eröffnen, sondern stp und sl nach der Eröffnung des Auftrags durch Änderung festlegen

Das habe ich getan:

ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,SpringGreen)
{
OrderSelect(ticket,SELECT_BY_TICKET);
}
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Blue);
zurück(0);

}


Ich weiß nicht, was zum Teufel ich hier tue.

oder?



Und ich verstehe es nicht und mehr! Verwenden Sie den SRC, um den Code zu umreißen, siehe oben?
 
int orderOpen(int cmd, double open, int stopLossPips, int takeProfitPips, int magicNumber){       
      double sl=0, tp=0;
      if(stopLossPips>0){
         stopLossPips = MathMax(stopLossPips,MarketInfo(Symbol(),MODE_STOPLEVEL)+3*_pipsMultiplyer);
      }
      if(takeProfitPips>0){
         takeProfitPips = MathMax(takeProfitPips,MarketInfo(Symbol(),MODE_STOPLEVEL)+3*_pipsMultiplyer);
      }
      int ticket=-1;
      if(_doTrade){        
         double lots  = OrderLotSize();
         if(lots>=MarketInfo(Symbol(), MODE_MINLOT)){          
            //wait context
            if(TradeIsBusy() < 0) {
                 return(-1); 
            }
            if(cmd==OP_BUYSTOP || cmd==OP_BUY || cmd==OP_SELLLIMIT){
               RefreshRates();
               if(cmd==OP_BUY){
                  open=Ask;
               }
               if(stopLossPips>0){
                  sl=NormalizeDouble(open-stopLossPips*Point,Digits);
               }
               if(takeProfitPips>0){
                  tp=NormalizeDouble(open+takeProfitPips*Point,Digits);
               }
               ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,sl,tp,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,SpringGreen);              
            }else{
               RefreshRates();
               if(cmd==OP_SELL){
                  open=Bid;
               }
               if(stopLossPips>0){
                  sl=NormalizeDouble(open+stopLossPips*Point,Digits);
               }
               if(takeProfitPips>0){
                  tp=NormalizeDouble(open-takeProfitPips*Point,Digits);
               }
               ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,sl,tp,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,Red);
            }
Ist dieser Teil zunächst für die Eröffnung eines Auftrags zuständig?
 
Ich habe es ganz allein herausgefunden.
 
borilunad:


Ich danke Ihnen! Dann werde ich das oben genannte ausprobieren!

Hier, versucht, einfügen, lief es in der Demo, aber etwas kommt mehr Fehler und anders aus. Ich frage zuerst, vom Herd aus, nach diesem Code von Doki:

Was ist hier überflüssig, zwischen Selecta Trades, Symbolchecks, Magie... einzufügen? и ... Auftragsart. Vielleicht sollte man datetime cmt und int ticket zu Beginn einführen? Und der Drucker schreibt andere Fehler.

Und fügen Sie eine Abschlussbedingung hinzu:

Bitte um Hilfe!


Eh, wie das Sprichwort sagt: "Lerne den Schüler" (c)

for(int i=OrdersTotal()-1;i>=0;i--){
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES){
      if(OrderSymbol()!=Symbol()){continue;}// фильтр по символу(если не наш символ, то пропускаем)
      if(OrderMagicNumber()!=magik){continue;}// фильтр по магику
      if(OrderCloseTime()!=0){continue;}// фильтр по времени закрытия (если не=0 то ордер уже закрыт)
      if(OrderType()<=OP_SELL){//закрытие для рыночных ордеров
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
      }else{// закрытие для отложенных ордеров
         OrderDelete(OrderTicket());
      }
   }
}

Löschen (kommentieren) Sie, was nicht benötigt wird.

 
               ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,Red);
            OrderSelect(ticket,SELECT_BY_TICKET);
            OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0);

Ein Teil des Codes, der einen Auftrag eröffnet und Stop-Loss und Take-Profit festlegt

erzeugt das Terminal folgende Fehler: EURUSD,M30: OrderSend error 130

EURUSD,M30: ungültiges Ticket für OrderModify-Funktion

EURUSD,M30: OrderModify-Fehler 4051

EURUSD,M30: OrderSend fehlgeschlagen mit Fehler #4051 bid:1.23674000 ask:1.23683000 Open:1.23674000 SL:1.2423 TP:1.2283 MODE_STOPLEVEL:0.00000000 LOT:0.01000000

Was ist das Problem?


 
FAQ:


Wie heißt es doch so schön: "Lerne, Student" (c).

Unnötiges löschen (auskommentieren)


Herzlichen Dank! Ich bin auch ein lebenslanger Lerner! Und im Allgemeinen ist das Lernen interessanter als das Arbeiten. Jetzt werde ich versuchen, mich anzupassen, ich möchte die Reihenfolge im Code wirklich nicht ändern. Ich kann jederzeit Bedingungen ändern oder hinzufügen, je nach den Veränderungen im Marktverhalten. Alles Gute für Sie und gute Nacht!