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

 

Wenn eine der schwebenden Orders ausgelöst wird, platziere ich eine weitere schwebende Order in die entgegengesetzte Richtung und verdopple das Volumen, z. B. wenn ich Buy platziere, dann platziere ich Sellstop 25 Pips niedriger als Buy, und wenn ich Sell platziere, dann platziere ich Buystop 25 Pips höher. Wenn einer der ausstehenden Aufträge ausgelöst wird, platzieren wir einen weiteren ausstehenden Auftrag in der entgegengesetzten Richtung des ausgelösten Auftrags zum Preis des ersten offenen Auftrags, und wenn dieser ebenfalls ausgelöst wird, platzieren wir erneut einen ausstehenden Auftrag in der entgegengesetzten Richtung des ausgelösten Auftrags innerhalb von 25 Punkten, usw. So sollten alle Kaufaufträge zu einem Preis und alle Verkaufsaufträge ebenfalls zu einem Preis erfolgen. Wenn jemand versteht, was ich hier geschrieben habe, bitte helfen Sie mit dem Code))

int A = 0;
if (OrdersTotal()==0)
   {
   A = 0;
   if ( Close[2] < Close[1])
      {
      OrderSend (Symbol(),OP_BUY,1,Ask,3,Ask-50*Point,Ask+25*Point,0,1);                 // первый вариант событий
      OrderSend (Symbol(),OP_SELLSTOP,2,Bid-25*Point,3,Bid+25*Point,Bid-50*Point,0,2);
      A=1;
      }
      
   if ( Close[2] > Close[1])
      {
      OrderSend (Symbol(),OP_SELL,1,Bid,3,Bid+50*Point,Bid-25*Point,0,1);               //второй вариант событий
      OrderSend (Symbol(),OP_BUYSTOP,2,Ask+25*Point,3,Ask-25*Point,Ask+50*Point,0,2);
      A=2;
      }
   }
//------------------------------------------------------------------------------------------------------------------+
OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера
int price = OrderOpenPrice();
//------------------------------------------------------------------------------------------------------------------+   
int sells = 0;                                                                                                                              
for (int B = 0; B < OrdersTotal(); B++)
   {
   OrderSelect (B,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sell
   if (OrderType() == OP_SELL) sells++;
   }
   
int buys = 0;                                                                                                                        
for (int b = 0; b < OrdersTotal(); b++)
   {
   OrderSelect (b,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buy 
   if (OrderType() == OP_BUY) buys++;
   }
int sellstops = 0;                                                                                                                              
for (int C = 0; C < OrdersTotal(); C++)
   {
   OrderSelect (C,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sellstop
   if (OrderType() == OP_SELL) sellstops++;
   }

int buystops = 0;                                                                                                                        
for (int c = 0; c < OrdersTotal(); c++)
   {
   OrderSelect (c,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buystop 
   if (OrderType() == OP_BUY) buystops++;
   }
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()==1)
   {                                               //удаление отложенного ордера..
   OrderDelete(2);                                 //..который остался после срабатываения tp и sl
   }  
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()>1 && A ==1)
   {
   if (sells == buys && buystops == 0)
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price,3,price-50*Point,price+25*Point,0,2);     //условия для первого варианта
      }
   if (buys > sells && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,2,price-28*Point,3,price+22*Point,price-53*Point,0,2);
      }
   }
   
if (OrdersTotal()>1 && A ==2)
   {
   if (sells == buys && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,1,price,3,price+50*Point,price-25*Point,0,2);     //условия для второго варианта
      }
   if (buys < sells && buystops == 0) 
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price+22*Point,3,price-28*Point,price+47*Point,0,2);
      }
   }
//-----------------------------------------------------------------------------------------------------------------+
   
   return(0);
   }
 
artmedia70:
Kommt dies von einem Indikator oder von einem EA? Es gibt einen Unterschied. Im Allgemeinen müssen Sie, um das Zeichnen des Pfeils zu vermeiden, den vorhergehenden angrenzenden Balken im Indikator überprüfen. Wenn dieser einen Wert ungleich Null oder nicht leer hat, bedeutet dies, dass der Pfeil auf dem angrenzenden Balken bereits existiert und es nicht notwendig ist, den Wert in den aktuellen Balkenpuffer einzugeben. Wenn bei einem EA der vorangegangene benachbarte Balken bereits ein kreuzendes Faktum in derselben Richtung wie der aktuelle Balken enthält und der Pfeil dieses Faktum bereits markiert, kann das kreuzende Faktum auf dem aktuellen Balken nicht registriert werden (falls es existiert) und der Pfeil muss auch nicht angezeigt werden.
Ich kann Ihnen nichts weiter über Ihren Code sagen. Wenn Telepathen in der Nähe sind, werden sie wahrscheinlich in der Lage sein, deinen Code besser zu verstehen ;)

Dies geht aus dem Indikator hervor. Schnittpunkt von 2 Zetteln, gibt Richtung an. Ich verstehe nicht ganz, die Richtung wird nur beim Überqueren und nicht bei jedem Takt angegeben. Von hier aus ist es unmöglich, nach dem vorherigen Balken zu urteilen.... Sagen Sie mal, wir bauen doch ein Array, oder? Wie kann man die vorherige Zelle überprüfen? Zwei Puffer ein CrossUp[i]=Low[i] - Range*0.75;, ein anderer sagen Cr[i]=Low[i] + Range*0.75; (will nur nicht wieder in Ordner und Code kommen)
 
zaqwsx123:

Wenn eine der schwebenden Orders ausgelöst wird, platziere ich eine weitere schwebende Order in die entgegengesetzte Richtung und verdopple das Volumen, z. B. wenn ich Buy platziere, dann platziere ich Sellstop 25 Pips niedriger als Buy, und wenn ich Sell platziere, dann platziere ich Buystop 25 Pips höher. Wenn einer der schwebenden Aufträge ausgelöst wird, platzieren wir einen weiteren schwebenden Auftrag in der entgegengesetzten Richtung des ausgelösten Auftrags zum Preis des ersten offenen Auftrags, und wenn dieser ebenfalls ausgelöst wird, platzieren wir erneut einen schwebenden Auftrag in der entgegengesetzten Richtung des ausgelösten Auftrags innerhalb von 25 Punkten usw. So sollten alle Kaufaufträge zu einem Preis und alle Verkaufsaufträge ebenfalls zu einem Preis erfolgen. Wenn jemand versteht, was ich hier geschrieben habe, bitte helfen Sie mir mit dem Code))

Du hast eine Menge Unsinn geschrieben... Zumindest dies:

OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера

Sind Sie sicher, dass die Reihenfolge richtig gewählt ist? Sind Sie sicher, dass dies der richtige Preis ist? Sind Sie sicher, dass die Bestellung ein Ticket == 1 hat? Bei der Auswahl nach Ticket ist der Pool irrelevant, so dass MODE_TRADES hier überflüssig ist. Nach erfolgreicher Auswahl per Ticket sollten wir auch die Abschlusszeit der ausgewählten Bestellung überprüfen. Wenn sie == 0 ist, befindet sich der Auftrag im Markt und wurde aus der Liste der Marktaufträge ausgewählt. Wenn die Schlusszeit > 0 ist, wurde der Auftrag entweder geschlossen oder ist ein gelöschter schwebender Auftrag und wurde aus der Liste der geschlossenen Aufträge ausgewählt.

Ich möchte nicht weiter in den Code schauen. Vielleicht sollten Sie sich zunächst mit den Grundlagen vertraut machen. Lesen Sie die Anleitung und die Dokumentation - sie sind hier an prominenter Stelle zu finden.

 
artmedia70:


Ich möchte nicht weiter in den Code schauen...


die mir aufgefallen sind)) Warum 4 identische Küken? und die Probe ist nicht das, was im Kommentar steht

if (OrderType() == OP_BUY) buystops++   //количество ордеров buystop

Das Gleiche gilt für Selstop. Sie benötigen OP_BUYSTOP und OP_SELLSTOP

 
ALXIMIKS:


die mir aufgefallen sind)) Warum 4 identische Küken? und die Probe ist nicht das, was im Kommentar steht

ähnlich mit selestop. Sie benötigen OP_BUYSTOP und OP_SELLSTOP

So weit bin ich noch nicht gekommen. Wenn man sich den Code anschaut und sieht, dass man keine Fehler erklären muss, sondern einfach damit beginnt, einem Menschen die Grundlagen beizubringen, die er selbst lesen kann, dann ... Ich will das nicht. Sie können auf bezahlter Basis unterrichten, aber nicht, wenn Sie nur helfen, Fehler im Code zu finden und nicht den Code unter den Fehlern.
 
Zolotai:

Dies geht aus dem Indikator hervor. Schnittpunkt von 2 Folien, gibt Richtung vor. Ich verstehe das nicht ganz, denn es gibt nur bei der Überquerung und nicht bei jedem Takt die Richtung an. Von hier aus ist es unmöglich, aus dem vorherigen Bar.... Sagen Sie mal, wir bauen doch ein Array, oder? Wie kann man die vorherige Zelle überprüfen? Es gibt zwei Puffer: einen CrossUp[i]=Low[i] - Range*0.75; und einen anderen, sagen wir, Cr[i]=Low[i] + Range*0.75; (ich will nicht wieder Ordner und Code durchsuchen).
Es gibt keine Quelldaten. Versuchen Sie, hier zu suchen.
 
Es gibt einen BUY_STOP-Auftrag, der vor der Ausführung gelöscht wurde:




Code prüfen:
            for(int cnt_1=OrdersHistoryTotal()-1; cnt_1>=0; cnt_1--) {
               if(OrderSelect(cnt_1, SELECT_BY_POS, MODE_HISTORY)==true ) {
                  if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
                     Print("OrderProfit()=",OrderProfit(), "   OrderCloseTime()=",TimeToStr(OrderCloseTime(),TIME_DATE|TIME_SECONDS), "   OrderType()=",OrderType(), "   OrderTicket()=",OrderTicket(), "   OrderClosePrice()=",OrderClosePrice(), "   OrderOpenPrice()=",OrderOpenPrice() );
                  } // if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
               }
            } // for(int cnt_1=0; cnt_1<OrdersHistoryTotal(); cnt_1++) {

String mit Ergebnis:
OrderProfit()=0   OrderCloseTime()=2001.01.26 06:15:00   OrderType()=4   OrderTicket()=24   OrderClosePrice()=0.9237   OrderOpenPrice()=0.9419

1, OrderType=4 - "4" ist OP_SELLLIMIT, richtig?
2. orderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - Woher kommt der Wert von OrderClosePrice(), der nicht gleich OrderOpenPrice() ist?

 
chief2000:

Es gibt einen BUY_STOP-Auftrag, der vor der Ausführung gelöscht wurde:




Code prüfen:

String mit Ergebnis:

1, OrderType=4 - "4" ist OP_SELLLIMIT, richtig?
2. orderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - woher kommt der Wert von OrderClosePrice(), der nicht gleich OrderOpenPrice() ist?

und in der Visualisierung Modus des Testers, über alle Ticks, in Schritt-für-Schritt-Modus (F12 auf Pause) finden Sie den Zeitpunkt der Entfernung und schauen Sie auf den aktuellen Preis, vielleicht gibt es der Hund ist dort versteckt?
 
artmedia70:
und Sie im Tester im Visualisierungsmodus, ja auf alle Ticks, im Schritt-Modus (F12 auf Pause) finden Sie den Moment der Entfernung und sehen den aktuellen Preis, vielleicht ist das, wo der Hund begraben ist?


BINGO! Das wusste ich nicht, aber es ist alles so, wie Sie geschrieben haben, d.h. der Schlusskurs ist in diesem Fall der Wert des Kurses zum Zeitpunkt der Löschung des Auftrags. Ich danke Ihnen!
 

Oft würde ich eine Variable wie diese innerhalb von Funktionen deklarieren:

int err = GetLastError();

Weiter drinnen rufe ich sie bereits unter einer bestimmten Bedingung auf, um zu sehen, ob es einen Fehler gibt. Nun, das ist nicht nur bei mir so, sondern auch an vielen anderen Stellen des Codes, auf die ich gestoßen bin. Es ist sozusagen eine typische Situation. Ich habe mir heute überlegt, dass es nicht logisch ist, in jeder Funktion, in der man Fehler kontrollieren will, jedes Mal die gleiche Variable zu deklarieren. Ich habe darüber nachgedacht und bin zu dem Schluss gekommen, dass es einfacher ist, einmal global zu deklarieren und es im Init zu initialisieren. Das geht so:

// Объявили на глобальном уровне
int err;

// Инициируем данную переменную:
int init()
{
    err = GetLastError();
}

Und außerdem, wenn Sie die err-Variable in Benutzerfunktionen aufrufen müssen, weil Sie wissen, dass sie bereits einen Wert hat. Wenn also diese Variable err in jeder Funktion am Ende aller Berechnungen aufgerufen wird, die für die Ausgabe des Fehlercodes verantwortlich ist, und GetLastError() aufruft, dann ist doch alles korrekt, oder?

Aber wenn Sie diese Variable nicht am Ende einer Funktion (nach der Ausführungskette des Codes) aufrufen, wird sie nicht zurückgesetzt, und es könnte zu einer falschen Ausführung kommen, falls es in der vorherigen Ausführungskette einen Fehler gab, aber nicht in der aktuellen, aber der Fehlercode wird zuletzt zurückgegeben... Und um sie zurückzusetzen, müssen Sie diese Funktion GetLastError() aufrufen. D.h. hier hängt alles davon ab, ob es aufgerufen wurde oder nicht. Wenn Sie nicht sicher sind, dass es überall sein wird, ist es einfacher, es jedes Mal neu zu versichern und zurückzusetzen, oder?