[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 774

 
drknn:

Ich verstehe nicht, was ich habe eine Zeile in den Markt, um die Öffnung, ich kopiere es und fügen Sie eine neue, um die Reihenfolge, sondern die gleichen 4107 Fehler nicht funktioniert, wenn Sie kümmern sich um zu sehen, was ich vermisst

Dateien:
test_21_1.mq4  15 kb
 
FoxUA:

Ich verstehe es nicht, ich habe diese Zeile in der Marktauftragseröffnung, ich kopiere es in einen schwebenden Auftrag und füge einen neuen hinzu, aber derselbe 4107-Fehler wird immer noch in das Protokoll geschrieben, aber schwebende Aufträge werden gesetzt, wenn Sie sich dafür interessieren, was ich übersehen habe.


Sie haben eine verdammt umständliche Codeorganisation. Und die Variablennamen haben Abkürzungen, die das Lesen erschweren.

Der Code sollte in Blöcken organisiert sein. Weisen Sie den Variablen Namen zu, so dass auf den ersten Blick klar ist, worum es im Code geht. Konstante Namen (gewöhnen Sie sich an, sie in Großbuchstaben zu schreiben). Die Initialisierung von Konstanten mit Werten muss in einem Initialisierungsblock untergebracht werden. So haben Sie zum Beispiel eine absolut ungerechtfertigte Verwendung der Zeichenfolge

string sy = Symbol();

beim Start des EA. Nun, sagen Sie mir, warum Sie bei jedem Tick die Funktion Symbol() aufrufen müssen, wenn der Symbolname während des gesamten Handels gleich bleibt? Es reicht aus, einmal mit dem Wert der Variablen sy im Initialisierungsblock zu initialisieren, und das ist alles. Außerdem wird dieser Codeblock

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

Das ist grundlegend falsch! Um den Stop-Loss der letzten Order zu ermitteln, muss diese (die Order) zunächst mit OrderSelect() ausgewählt werden - siehe das Beispiel im Orderzähler unten. Das bedeutet, dass Sie, wenn Sie Stopp-Levels für die letzten Aufträge benötigen, dies in einer Schleife tun müssen. Nächste. Die Gestaltung der

int total = OrdersTotal();
if(total == 0){

}

ist nicht gerechtfertigt. Die Funktion OrdersTotal() gibt die Gesamtzahl der bereits im Terminal geöffneten Aufträge zurück. Dieser Wert umfasst sowohl Aufträge, die von anderen Handelsinstrumenten eröffnet wurden, als auch Aufträge, die nicht vom Expert Advisor, sondern von Ihnen persönlich manuell für dasselbe Instrument eröffnet wurden und die der Expert Advisor erteilt hat.

Wenn Sie nicht von Hand handeln wollen und nur mit dem Symbol handeln, auf das der EA geworfen wurde, dann funktioniert dieses Design. Sobald Sie aber mit den Händen handeln wollen und der EA nicht mit Ihren manuellen Trades interferiert oder Sie die Trades auch mit anderen Symbolen ausführen wollen, lässt Sie das Design wirklich im Stich. Sie sollten also besser für jede Auftragsart einen eigenen Auftragszähler schreiben. Hier ist ein Beispiel für einen solchen Zähler.

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  string SMB=Symbol();
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
      Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){continue;}// если не наш, то смотрим следующий
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  

Schreiben Sie den Code neu und berücksichtigen Sie dabei die oben genannten Empfehlungen!!!

 

Entschuldigung, ich wusste nicht, dass Zeichenketten wie

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT

ein Unterprogramm aufrufen.

Aber es ist immer noch besser, sie auf eine andere Art zu organisieren.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Sie brauchen dem Unterprogramm keinen symbolischen Namen eines Handelssymbols zu übergeben. Ihr Unterprogramm befindet sich im Expert Advisor und nicht in der mitgelieferten Bibliothek. Da die Variable sy auf der globalen Ebene des Expert Advisors deklariert ist, befindet sich diese Variable im Geltungsbereich solcher Unterprogramme. Außerdem übergeben Sie den zweiten Parameter an das Unterprogramm, aber wenn Sie das Unterprogramm selbst aufrufen, initialisieren Sie diesen Parameter mit einem Wert ( int op=-1) - das ist nicht nötig. Das Gleiche gilt für den nächsten Parameter.

Die Linie

>> if (op<0 || OrderType()==op) {

ist wieder unleserlich. Schauen Sie, wie es in meiner Theke organisiert ist!

 

Und dann ist da noch dies. Der Codeblock

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

wird bei jedem Ticken aufgerufen. Sie ist jedoch nicht bei jeder Zecke erforderlich. In einigen Fällen müssen Sie nur den Stopp-/Gewinnauftrag kennen. Dies sind die Fälle, in denen Sie Ihr Unterprogramm aufrufen müssen.

 
spidey:

Hallo, können Sie bitte einen Alarm an den Indikator anhängen (grünes Kreuz über rotes Kreuz von oben nach unten - verkaufen, zurück - kaufen)?

Nun, jemand stellt wieder gestohlene Codes ins Forum. :))))))))

Ich bezweifle, dass sich jemand kostenlos durch dieses Sammelsurium von nummerierten Variablen wühlen möchte :)

 
spidey:

Guten Tag, könnten Sie bitte dem Truthahn eine Warnung hinzufügen (die grüne kreuzt die rote von oben nach unten - verkaufen, zurück - kaufen)?

Wenn Sie das noch einmal tun, bin ich gezwungen, Sie aus dem Spiel zu verbannen.

Dies ist ein Verstoß gegen die Forenregeln.

 
Soll der Code veröffentlicht werden?
 
drknn:

Entschuldigung, ich wusste nicht, dass Zeichenketten wie

ein Unterprogramm aufrufen.

Aber es ist immer noch besser, sie auf eine andere Art zu organisieren.

>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Sie brauchen dem Unterprogramm keinen symbolischen Namen eines Handelssymbols zu übergeben. Ihr Unterprogramm befindet sich im Expert Advisor und nicht in der mitgelieferten Bibliothek. Da die Variable sy auf der globalen Ebene des Expert Advisors deklariert ist, befindet sich diese Variable im Geltungsbereich solcher Unterprogramme. Als Nächstes übergeben Sie einen zweiten Parameter an das Unterprogramm, aber wenn Sie das Unterprogramm selbst aufrufen, initialisieren Sie diesen Parameter mit einem Wert ( int op=-1) - das ist nicht nötig. Das Gleiche gilt für den nächsten Parameter.

Die Linie

>> if (op<0 || OrderType()==op) {

ist wieder unleserlich. Schauen Sie, wie es in meiner Theke organisiert ist!

Ich denke, der Funktionsaufruf kann einfach geschrieben werden

PrAskLim = StopLossLastPos(OP_SELL); in der Funktion selbst

double StopLossLastPos(int op=-1,) wie folgt?

Ich habe bereits gesagt, dass ich die Funktionen von dieser Website übernommen habe, ihre Arbeit wurde getestet, weil ich mich nicht traue, ihre Variablen durch lesbarere zu ersetzen, weil mir vielleicht die Erfahrung fehlt, was man ändern kann und was nicht; das birgt die Gefahr, dass ich etwas Falsches in einer funktionierenden Funktion ändere und man wieder in einem Haufen Code steckt,

aber ich habe das, was ich selbst hinzugefügt habe, so weit wie möglich korrigiert,

Ich habe es bereits selbst hinzugefügt, aber es hat meine Probleme mit Log 4107 nicht gelöst, und ich muss mich fragen, wie ich den Preis und die Stopps ändern kann, denn ich habe darin nichts grundlegend geändert.

Die zweite Frage ist, wie man einen Spread zu diesem Preis hinzufügen kann PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD); )

Hier ist die modifizierte Version des EA

Dateien:
test_21_2.mq4  16 kb
 
spidey:
Soll der Code veröffentlicht werden?
Sie brauchen die gestohlenen Sachen nicht zu veröffentlichen.
 
drknn:
Sie müssen keine gestohlenen Sachen posten.

Sie brauchen nicht zu stehlen.

Und die Regeln dieser Ressource verbieten es nicht...

https://www.mql5.com/ru/code/8089

;)