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

 
artmedia70:
Igor Kim hat einen Berater, der in einem bestimmten Intervall Folgendes tut


Ich danke Ihnen!
 

Hallo.

Problem mit schwebenden Aufträgen, insbesondere mit dem Verfallsdatum.

   ticket=OrderSend(symb, OP_SELLLIMIT, Lots, price, Slippage, 0, 0, lsComm, mn, TimeCurrent() + 60*60, op_color);

Auf diese Weise wird ein neuer Auftrag eröffnet, d.h. wenn er innerhalb einer Stunde nicht ausgelöst wurde, sollte der Server ihn schließen.

Dann prüfe ich das Verfallsdatum:

   if (ticket>0)
   {
    OrderSelect(ticket, SELECT_BY_TICKET);
    Alert("OrderExpiration = ", TimeToStr(OrderExpiration(), TIME_DATE),":",TimeToStr(OrderExpiration(), TIME_MINUTES)); 
.......
   } 

So sieht es aus, wenn der EA im Testprogramm funktioniert:

2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: open #1 sell limit 2.00 EURUSD at 1.27972 ok
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: Alert: OrderExpiration = 2012.01.11:12:00
2013.03.01 12:45:58 2012.01.12 16:29 Tester: Auftrag #1, Verkaufen 2,00 EURUSD wird bei 1,27972 eröffnet

Das heißt, Datum und Uhrzeit des Ablaufs sind korrekt eingestellt, wie ich es möchte, aber es gibt keine Schließung zum Zeitpunkt des Ablaufs - eine Position wird nach 24 Stunden eröffnet.

Ich habe ein paar Foren durchsucht und das Problem tritt auf. Die üblichen Antworten lauten: "Das funktioniert bei mir" oder "Verfolgen Sie die ausstehenden Aufträge selbst". Ich möchte sie nicht selbst verfolgen, und das funktioniert bei mir nicht.

 
artmedia70:
Igor Kim hat einen Berater, der in einem bestimmten Intervall Folgendes tut

Es funktioniert großartig.

Danke für den Tipp!

 
DhP:

Es funktioniert großartig.

Danke für den Tipp!


Es liegt nicht an mir, sondern an Google.

Ich denke, Sie können die Funktion "Bildschirm speichern" selbst von dort abrufen und Ihre eigenen Parameter setzen, um sie aufzurufen - ich war zu faul...

 
borilunad:
Sergey, ich lasse die Frage nach der Funktion vorerst offen, da ich morgen einige weitere Funktionen in Ihren Test-EA einfügen werde, um ein sauberes Experiment durchzuführen. Ich habe es im visuellen Modus beobachtet und fast alle doppelten Schließungen sind die letzten, die früheren werden durch SL und TP geschlossen, d.h. es gibt nichts zur Auswahl. Ich habe "Stops and Takes" entfernt, um eine Auswahl zu haben. Morgen zeige ich Ihnen Ihren Expert Advisor mit allen zusätzlichen Funktionen und Kommentaren! Sie können sich selbst davon überzeugen, wie die Funktion funktioniert. Ich möchte wirklich, dass sie zeigt, dass ich mich geirrt habe! Wenn ich Recht habe, werde ich mein Bestes geben! Bis morgen!

Sergej, Dubakin Ich habe eine visuelle Kontrolle durchgeführt und mich vergewissert, dass diese Funktion die Maximalwerte auswählt, und das ist es, was ich brauche! Ich bin froh, dass ich keine Zweifel mehr habe, und ich entschuldige mich bei Ihnen! Aber in unserem Geschäft ist es besser, sieben Mal zu messen...". Zeigen Sie Ihren Prüfern EA für die Funktionsprüfung, mit zusätzlichen Funktionen und Kommentaren für eine klarere visuelle Prüfung! Ich danke Ihnen!

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
{
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
//   SL=NormalizeDouble(Price-300*Point,Digits);    
//   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,0,0,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
//   SL=NormalizeDouble(Price+300*Point,Digits);    
//   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,0,0,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  Comment("BuyPos: ",NumberOfBuyPositions(),"; SellPos: ",NumberOfSellPositions(),
  "; LotPos: ",GetAmountLotFromOpenPos(),
  "\nMaxLoss: ",DoubleToStr(GetMinProfit(),2),"; MaxProf: ",DoubleToStr(GetMaxProfit(),2),
  "\nLossDiff: ",DoubleToStr(GetMinProfit()+GetMaxProfit(),2));

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
}

bool LockOFF(int EA_Magic) {
  double Result, PrevLoss, PrevProfit;
     int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
    bool Ans;

  MaxProfitTicket=-1; MaxLossTicket=-1;

  orders_total=OrdersTotal();
  for(pos=orders_total-1; pos>=0; pos--) {
    if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
    if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
    if(OrderType()>1) continue;
    Result=OrderProfit()+OrderSwap()+OrderCommission();
    if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
      PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType();  // end of for
  } }
  if(MaxLossTicket==-1) return(false); // нет убыточной позиции
  if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

  orders_total=OrdersTotal();
  for(pos=orders_total-1; pos>=0; pos--) {
    if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
    if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
    if(order_type!=OrderType()) continue;
    Result=OrderProfit()+OrderSwap()+OrderCommission();
    if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
      PrevProfit=Result; MaxProfitTicket=OrderTicket();  // end of for
  } }
  if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

  Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
  if(!Ans) { 
    Print("Ошибка при встречном закрытие!"); return(false); 
  }
  return(true); 
}
//+----------------------------------------------------------------------------+
int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY) {
        if (op<0 || OrderType()==op) {
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+
int NumberOfSellPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
  double l=0;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          l+=OrderLots();
  } } } }
  return(l);
}
//+----------------------------------------------------------------------------+
double GetMinProfit(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          if (p>OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
  return(p);
}
//+----------------------------------------------------------------------------+
double GetMaxProfit(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          if (p<OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
  return(p);
}
//+----------------------------------------------------------------------------+
 
borilunad:

Sergej, Dubakin Ich habe eine visuelle Kontrolle durchgeführt und mich vergewissert, dass diese Funktion Maximalwerte auswählt, was ich auch brauchte! Ich bin froh, dass ich keine Zweifel mehr habe, und ich entschuldige mich bei Ihnen! Aber in unserem Geschäft ist es besser, sieben Mal zu messen...". Zeigen Sie Ihrem Tester EA zur Funktionsprüfung, mit zusätzlichen Funktionen und Kommentaren für eine klarere visuelle Prüfung! Ich danke Ihnen!

Wie das... Basierend auf Igor Kim etwas gemacht... Nur eines Ihrer Merkmale... der Rest ist derselbe...

//+----------------------------------------------------------------------------+
int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) { // для чего присвоены значения по-умолчанию, если они нигде не используются? Кроме op (и то неверно)
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY) {                               // тут жесткая проверка на тип Buy
        if (op<0 || OrderType()==op) {                         // тут лишняя проверка на значение op, используемое по умолчанию и ещё одна лишняя проверка на ==op
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+

so etwas wie das hier, denke ich:

//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy, int op, int mn) {
  int i, k=OrdersTotal()-1, kp=0;
  for (i=k; i>=0; i--) {
   if (OrderSelect(i,SELECT_BY_POS)) {           // если ордер выбран
      if (OrderMagicNumber()!=mn)   continue;    // если не наш магик - смотрим следующий ордер
      if (OrderSymbol()!=sy)        continue;    // если не наш символ - смотрим следующий ордер
      if (OrderType()!=op)          continue;    // если не соответствует тип - смотрим следующий
      kp++;                                      // тут искомый ордер - увеличим счётчик
      }
   }
  return(kp);
}
//+----------------------------------------------------------------------------+

Und rufen Sie sie aus:

zum Zählen von Buy und Sell nach dem aktuellen Symbol, mit Magic

//+----------------------------------------------------------------------------+
   int BuyPos= NumberOfPositions(Symbol(), OP_BUY,  Magic);
   int SellPos=NumberOfPositions(Symbol(), OP_SELL, Magic);
//+----------------------------------------------------------------------------+
 
alsu:
pasha5282:
Können Sie mir sagen, wie ich das kleinste Los unter allen offenen Geschäften auswählen kann?

int i, ot = OrdersTotal();
double min=0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}


Ich habe das Thema durchstöbert. Ihre Logik ist seltsam. Ich interessiere mich für die letzte Zeile des Codes:

if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();
Die Variable i hat nur zu Beginn der Schleife einen Wert von 0. Außerdem wird bei jeder Iteration 1 Wert hinzugefügt.

Dann gibt es eine Bedingung, die dazu führt, dass die Schleife fortgesetzt wird:

min>OrderLots()
Aber min wird als Null deklariert und sein Wert ändert sich nirgendwo sonst im Code. Das bedeutet, dass dieser Wert niemals wahr sein wird! Wo ist die Logik?
 
hoz:


Ich habe den Thread durchstöbert. Ihre Logik ist seltsam. Ich interessiere mich für die letzte Zeile des Codes:

Die Variable i hat nur zu Beginn der Schleife einen Wert von 0. Außerdem wird der Wert mit jeder Iteration um 1 erhöht.

Dann gibt es eine Bedingung für die Fortsetzung des Zyklus:

Aber min wird als Null deklariert, und sein Wert ändert sich nirgendwo sonst im Code. Das bedeutet, dass dieser Wert niemals wahr sein wird! Wo ist die Logik?

int i, ot = OrdersTotal();
double min=0.0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(min==0.0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
Wenn wir es so machen, sollten alle seltsamen Dinge verschwinden.
 
hoz:


Ich schaute durch den Zweig. Ihre Logik ist seltsam. Ich interessiere mich für die letzte Codezeile:

Die Variable i hat nur zu Beginn der Schleife den Wert 0. Außerdem wird der Wert mit jeder Iteration um 1 erhöht.

Dann gibt es eine Bedingung für die Fortsetzung des Zyklus:

Aber min wird als Null deklariert, und sein Wert ändert sich nirgendwo sonst im Code. Das bedeutet, dass dieser Wert niemals wahr sein wird! Wo ist die Logik?

Bitte beachten Sie

if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();

Wenn min>OrderLots(), dann min = OrderLots();

 
r772ra:

Bitte beachten Sie

Wenn min>OrderLots() dann, min = OrderLots();

Wenn min gleich Null ist, kann es nie größer werden als OrderLots().