Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 412

 
Ekburg:

Oje... Ich bin sicherlich froh, dass Sie begann, das Problem zu lösen, aber meine Nachricht, die Sie irgendwie nicht bemerkt haben, wo ich sagte, die gleiche Sache, ein wenig andere Worte, und sagte sofort die Mängel, außer für das Schließen der Datei, nicht sofort sah, wo Sie es passiert:)

Sie haben eine Antwort in drei Absätzen geschrieben. Im ersten Punkt haben Sie einen Fehler gemacht (mein Eintrag ist völlig korrekt), im zweiten haben Sie ebenfalls einen Fehler gemacht (der allerdings durch diese Meldung ausgeglichen wurde :) Der dritte Punkt klang so, als hätten Sie vorgeschlagen, den Cursor nach dem Eintrag an das Ende zu setzen, nicht davor (was wieder als Fehler aufgefasst wurde). Angesichts eines solchen Bildes zog ich es vor, eine Klarstellung eines sehr erfahrenen Moderators vorzunehmen, der darauf antwortete.

Dennoch danke ich Ihnen für Ihr Feedback. Und ein frohes neues Jahr! :)

 

Hallo. Mit einer unangenehmen Situation konfrontiert. Helfen Sie mir auf die Sprünge.

Ich habe einen Expert Advisor. Im Strategietester funktioniert es gut, ich habe keine Beschwerden. Wenn ich es auf einer Demo laufen lasse, kann der Expert Advisor für bestimmte Aufträge keine Stopps setzen. Es gibt einen Fehler, der nicht immer, aber manchmal auftritt. Ich versuche verzweifelt, es selbst zu finden und hoffe auf Ihre Hilfe. Es sollte angemerkt werden, die EA funktioniert einwandfrei in allen anderen Aspekten, genau wie in der Tester, keine Beschwerden, außer dass das Problem ist, dass die Stops nicht immer gesetzt werden. Der Fehler tritt bei verschiedenen Brokern auf verschiedenen Konten auf. Hier ist der Teil des Codes, der für den Handel zuständig ist

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {
  //---- обновление инфы
  OrderSelect(ord_ticket,SELECT_BY_TICKET);
  ord_openpr=OrderOpenPrice();
  ZigZagInfo[0][ZZ_TimeP]=t_cur;
  ZigZagInfo[k][ZZ_TryCount]++;
  //---- проверка стопов
  if(ND(a*(ord_tp-ord_openpr)-stops,Digits)<0) ord_tp=ND(ord_openpr+a*stops,Digits); 
  if(ND(a*(ord_openpr-ord_sl)-stops,Digits)<0) ord_sl=ND(ord_openpr-a*stops,Digits);
  //---- время удаления
  if(TimeDelete>0) td=TimeCurrent()+60*TimeDelete;
  else td=0;
  //----
  if(!OrderModify(ord_ticket,ord_openpr,ord_sl,ord_tp,td)) {
    Alert(Error(GetLastError()),"/nSL=",DoubleToStr(ord_sl,5)," TP=",DoubleToStr(ord_tp,5),"/nTimeDel=",TimeToStr(td),
          "OP=",DoubleToStr(ord_openpr,5));
  }
}

Hier ist der Code der Funktion Error(int er)

string Error(int er) {
  switch(er) {
    case 0:   return("Нет ошибки");
    case 1:   return("Нет ошибки, но результат неизвестен");
    case 2:   return("Общая ошибка(сбой системы, глюк, и т.п.)");
    case 3:   return("Неправильные параметры");
    case 4:   return("Торговый сервер занят");
    case 6:   return("Нет связи с торговым сервером");
    case 7:   return("Недостаточно прав");
    case 8:   return("Слишком частые запросы");
    case 9:   return("Недопустимая операция нарушающая функционирование сервера");
    case 128: return("Истек срок ожидания совершения сделки");
    case 129: return("Неправильная цена");
    case 130: return("Неправильные стопы");
    case 131: return("Неправильный объем");
    case 133: return("Торговля запрещена");
    case 134: return("Недостаточно денег для совершения операции");
    case 135: return("Цена изменилась");
    case 137: return("Брокер занят");
    case 138: return("Новые цены");
    case 139: return("Ордер заблокирован и уже обрабатывается");
    case 140: return("Разрешена только покупка");
    case 141: return("Слишком много запросов");
    case 145: return("Модификация запрещена, так как ордер слишком близок к рынку");
    case 146: return("Подсистема торговли занята");
    case 147: return("Использование даты истечения ордера запрещено брокером");
    case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером");
    case 149: return("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");
    default:  return("Неизвестная ошибка "+DoubleToStr(er,0));
  }
}

Wenn der EA also nicht in der Lage ist, Stops zu setzen, erscheint eine Meldung mit Informationen über den Fehler und die Parameter des Auftrags, den er zu ändern versuchte. Was er schreibt, ist für mich das eigentliche Rätsel. Wie Sie auf den Bildern unten sehen können, schreibt es ständig, dass die Lautstärke falsch ist. Das ist seltsam. Ich sollte noch hinzufügen, dass alle Auftragsparameter vor der Änderung korrekt berechnet werden, was aus den Meldungen ersichtlich ist. Andernfalls würde der Fehler anders aussehen. Das Programm wurde mit einer höheren Streuung als in der Demo getestet.

Enigmaeine andere

 
_Vladimir_:

Hallo. Mit einer unangenehmen Situation konfrontiert. Helfen Sie mir auf die Sprünge.

Ich habe einen Expert Advisor. Im Strategietester funktioniert es gut, ich habe keine Beschwerden. Wenn ich es jedoch auf einer Demo laufen lasse, sehe ich, dass der EA für bestimmte Aufträge keine Stopps setzen kann. Es gibt einen Fehler, der nicht immer, aber manchmal auftritt. Ich versuche verzweifelt, es selbst zu finden und hoffe auf Ihre Hilfe. Es sollte angemerkt werden, die EA funktioniert einwandfrei in allen anderen Aspekten, genau wie in der Tester, keine Beschwerden, außer dass das Problem ist, dass die Stops nicht immer gesetzt werden. Der Fehler tritt bei verschiedenen Brokern auf verschiedenen Konten auf. Hier ist der Teil des Codes, der für den Handel zuständig ist

Hier ist der Code der Funktion Error(int er)

Wenn es dem EA also nicht gelingt, Stops zu setzen, erscheint eine Meldung mit Informationen über den Fehler und die Parameter des Auftrags, den er zu ändern versuchte. Was er schreibt, ist für mich das eigentliche Rätsel. Wie Sie auf den Bildern unten sehen können, schreibt es ständig, dass die Lautstärke falsch ist. Das ist seltsam. Ich sollte noch hinzufügen, dass alle Auftragsparameter vor der Änderung korrekt berechnet werden, was aus den Meldungen ersichtlich ist. Andernfalls würde der Fehler anders aussehen. Das Programm wurde mit einer höheren Streuung als in der Demo getestet.

Seien Sie vorsichtig mit den Werten Ihrer globalen Variablen. Ich kann davon ausgehen, dass ord_ticket eine globale Variable ist, was bedeutet, dass der vorherige Wert in ihr gespeichert werden kann. Und bevor Sie GetLastError() aufrufen, um den Fehler abzufangen, sollten Sie den vorherigen Wert zurücksetzen, indem Sie ihn am Anfang des Codes aufrufen.
 
TarasBY:
Sie sollten mit den Werten Ihrer globalen Variablen sehr vorsichtig sein. Ich möchte darauf hinweisen, dass ord_ticket eine globale Variable ist und daher den vorherigen Wert speichern kann. Und bevor Sie GetLastError() aufrufen, um den Fehler abzufangen, sollten Sie den vorherigen Wert zurücksetzen, indem Sie ihn am Anfang des Codes aufrufen.

ord_ticket wird auf lokaler Ebene deklariert. Und selbst wenn sie in der ersten Zeile global deklariert wird

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {

wird sich sein Wert mit Sicherheit ändern. Im Falle einer erfolgreichen Transaktion ist dies entweder die Auftragsnummer, andernfalls -1. Wenn der Auftrag also nicht geöffnet wird, kommen wir nicht zum Block für die Festlegung von Stopps.

Es sollte auch beachtet werden, dass die Funktion OrderSend() immer den Wert des letzten Fehlers ändert (laut Dokumentation und Logik), so dass das Zurücksetzen des vorherigen Wertes in diesem Fall nicht notwendig ist und zu einer einfachen Zeitverschwendung führen würde. Das heißt, der Fehler 131 erscheint nach der Eingabe des Stopp-Einstellblocks und bevor die Fehlermeldung angezeigt wird. Da die Stopps nicht wirklich platziert werden, muss die Funktion OrderModify() als letzte Funktion aufgerufen werden, die ebenso wie die vorherige immer den Wert des letzten Fehlers ändert. Aber ich verstehe nicht, warum der Wert des letzten Fehlers nicht geändert wird. Woher kommt sie? Ich möchte noch einmal betonen, dass es im Testgerät keine Probleme gab.

Ich hatte die Vermutung, dass der Broker betrügt, weil der Server Fehlernummern an das Terminal sendet und dieses sie wiederum an den Expert Advisor weiterleitet. Ich habe diese Idee verworfen, weil nur die Aufträge eines EAs Fehler aufweisen, andere EAs, die parallel arbeiten, haben keine solchen Fehler.

 
_Vladimir_:

ord_ticket wird auf lokaler Ebene deklariert. Und selbst wenn sie in der ersten Zeile global deklariert wird

Wert wird sich mit Sicherheit ändern. Im Falle einer erfolgreichen Transaktion ist dies entweder die Auftragsnummer, andernfalls -1. Wenn der Auftrag also nicht geöffnet wird, kommen wir nicht zu dem Block, in dem die Stopps gesetzt werden.

Es sollte auch beachtet werden, dass die Funktion OrderSend() immer den Wert des letzten Fehlers ändert (laut Dokumentation und Logik), so dass das Zurücksetzen des vorherigen Wertes in diesem Fall nicht notwendig ist und zu einer einfachen Zeitverschwendung führen würde. Das heißt, der Fehler 131 erscheint nach der Eingabe des Stopp-Einstellblocks und bevor die Fehlermeldung angezeigt wird. Da die Stopps nicht wirklich platziert werden, muss die Funktion OrderModify() als letzte Funktion aufgerufen werden, die ebenso wie die vorherige immer den Wert des letzten Fehlers ändert. Aber ich verstehe nicht, warum der Wert des letzten Fehlers nicht geändert wird. Woher kommt sie? Ich möchte noch einmal betonen, dass es im Testgerät keine Probleme gab.

Ich hatte die Idee, dass der Broker betrügt, weil der Server Fehlernummern an das Terminal sendet und dieses sie wiederum an den Expert Advisor weiterleitet. Ich habe diese Idee schnell wieder verworfen, da nur die Aufträge eines EAs Fehler aufweisen, andere EAs, die parallel arbeiten, haben keine solchen Fehler.


Ich füge hinzu. Der Code des parallel arbeitenden EA ist genau der gleiche, er ist für das Setzen von Stopps zuständig. Bei diesem EA gab es noch nie eine Situation, in der für Aufträge keine Stopps gesetzt wurden.

Es scheint, dass irgendwo oben ein Fehler in der Berechnung der Parameter vorliegt, aber wenn nur ein Parameter falsch ist, sollte ein anderer Fehler erscheinen. Zum Beispiel die bekannte 130

 
_Vladimir_:

ord_ticket wird auf lokaler Ebene deklariert. Und selbst wenn sie in der ersten Zeile global deklariert wird

Wert wird sich mit Sicherheit ändern. Im Falle einer erfolgreichen Transaktion ist dies entweder die Auftragsnummer, andernfalls -1. Wenn der Auftrag also nicht geöffnet wird, kommen wir nicht zum Block für die Festlegung von Stopps.

Es sollte auch beachtet werden, dass die Funktion OrderSend() immer den Wert des letzten Fehlers ändert (laut Dokumentation und Logik), so dass das Zurücksetzen des vorherigen Wertes in diesem Fall nicht notwendig ist und zu einer einfachen Zeitverschwendung führen würde. Das heißt, der Fehler 131 erscheint nach der Eingabe des Stopp-Einstellblocks und bevor die Fehlermeldung angezeigt wird. Da die Stopps nicht wirklich platziert werden, muss die Funktion OrderModify() als letzte Funktion aufgerufen werden, die ebenso wie die vorherige immer den Wert des letzten Fehlers ändert. Aber ich verstehe nicht, warum der Wert des letzten Fehlers nicht geändert wird. Woher kommt sie? Ich möchte noch einmal betonen, dass es im Testgerät keine Probleme gab.

Ich hatte die Vermutung, dass der Broker betrügt, weil der Server Fehlernummern an das Terminal sendet und dieses sie wiederum an den Expert Advisor weiterleitet. Ich habe diese Idee schnell wieder verworfen, da nur die Aufträge eines EAs Fehler aufweisen, andere EAs, die parallel arbeiten, haben keine solchen Fehler.

Der Gedanke ist rasant! Aber die Erfahrung zeigt, dass das, was wir denken (wie es sein sollte) und das, was tatsächlich da ist, sehr oft UNTERSCHIEDLICH ist. Was kann beraten werden: "Drucken Sie die gesamte Sequenz Ihrer Code-Ausführung vor" - das ist der schnellste Weg, um einen Fehler zu finden (oder sich zu vergewissern, dass Sie richtig liegen). :)
 
yan720:

Sie haben eine Antwort in drei Absätzen geschrieben. Im ersten Punkt haben Sie einen Fehler gemacht (mein Eintrag ist völlig korrekt), im zweiten haben Sie ebenfalls einen Fehler gemacht (obwohl Sie ihn mit diesem Beitrag ausgeglichen haben :) Der dritte Punkt hörte sich an, als ob Sie vorschlugen, den Cursor nach dem Eintrag ans Ende zu setzen, nicht davor (was wieder als Fehler aufgefasst wurde). Angesichts eines solchen Bildes habe ich es vorgezogen, dem antwortenden, vielseitig versierten Moderator eine Klarstellung zu geben.

Dennoch danke ich Ihnen für Ihre Antwort. Und ein frohes neues Jahr! :)



:D ok, dir auch ein frohes neues Jahr :)
 
Um auf das zurückzukommen, was auf Seite 411 geschrieben wurde ... jemand haben eine Idee, wie man diesen Code und Entry/Exit-Bedingungen für die Kreuzung von zwei MAs zu kombinieren? oder sind schwebende Aufträge die einzige Option?
 
petya33r:
Um auf das zurückzukommen, was auf Seite 411 geschrieben wurde ... hat jemand eine Idee, wie man diesen Code und Entry/Exit-Bedingungen für die Kreuzung von zwei MAs zu kombinieren? oder sind schwebende Aufträge die einzige Option?

Nach der Eröffnung eines Geschäfts auf einem mooving Signal, beginnen, um die Anzahl der Aufträge oder diese Reihenfolge speziell zu überwachen, wenn die Anzahl der Aufträge zu verringern oder als die zweite Option ist speziell diese Reihenfolge geschlossen, dann finden Sie heraus, wie es geschlossen wurde, wenn ein Anschlag, dann öffnet nur die entgegengesetzte Reihenfolge auf den aktuellen Preis, das ist alles
 
Ekburg:

Nach der Eröffnung eines Geschäfts auf einer beweglichen Signale beginnen, um die Anzahl der Aufträge oder diese Reihenfolge speziell zu überwachen, wenn die Zahl der Aufträge zu verringern oder als die zweite Option ist speziell diese Reihenfolge geschlossen, dann herausfinden, wie es geschlossen ist, wenn der Anschlag, dann öffnen Sie einfach die entgegengesetzte Reihenfolge zum aktuellen Preis, das ist alles

Ich verstehe das, aber ich kann es nicht aufschreiben. Der Expert Advisor handelt entweder nur auf muwings-Signale hin und eröffnet im Falle eines Verlustes keine umgekehrte Position, oder er lässt das Terminal einfach abstürzen, wenn der Test beginnt. Also habe ich etwas geschrieben, das überhaupt nicht verarbeitet werden kann. Ich bin nicht sehr gut im Schreiben. Ich brauche Hilfe in Form von geschriebenem Code.

//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер 
  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) 
  {
     if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         old_order_type = OrderType();
         if ( OrderProfit()<0 ) //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
         {
                break; //прекращаем поиск
         }
     }
  }
  //если раньше покупали, то теперь продаем
  if ( old_order_type == OP_BUY )
  {
      ticket = OrderSend(Symbol(), OP_SELL, Lot,  NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
      Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      return (0);  
  }

Wenn OrderProfit()<0 ist, wird der entgegengesetzte Auftrageröffnet. Es funktioniert jedoch nicht zusammen mit Signalen von sich bewegenden Hilfsmitteln. Können Sie einen einzigen Code schreiben, der sowohl muwings-Signale als auch Bedingungen für die Eröffnung einer entgegengesetzten Position enthält?