Und machen wir einen "Cartoon" daraus (Mehrwährung) - Seite 7

 
Swan >> :

Es war

Wenn StopLoss wahr ist, wird der neue Wert zugewiesen,

andernfalls wird der Auftrag geändert.

kein Fehler, aber man muss entweder ein Kreuz ablegen oder eine Hose anziehen).

Ich habe es nicht sofort verstanden))... die Bedingung könnte nicht zu einem Stopp führen!

Vielleicht sollten wir einfach etwas anderes entfernen? Es scheint, dass die Logik nicht leidet... Warum brauche ich die zweite Bedingung, wenn eine einzige ausreicht?

StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

Oder so...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);


Schwan >> :

siehe Vergleich von reellen Zahlen.

Ich werde es lesen... Ist es also unbedingt notwendig? Ich habe es nur noch nie gemacht).

 
ALex2008 >> :

Ich habe es nicht sofort verstanden... Die Bedingung muss nicht unbedingt zu einem Stopp führen!

Können wir nicht einfach woanders hinziehen? Es scheint, als ob die Logik nicht leidet...

Vielleicht) 4h-Kerze ist normalerweise größer als StopLevel...


ALex2008 >> :

Ich werde es lesen... Ich meine, ist das wirklich notwendig? Ich habe es nur noch nie so gemacht)

alle möglichen seltsamen Dinge passieren, wenn die verglichenen Werte fast gleich sind)

bei der Überprüfung einer Zahl vom doppelten Typ auf Gleichheit - obligatorisch.


 StopLoss-Ask< StopLevel-0.5*Point

Auf Russisch: StopLoss minus Ask ist kleiner als StopLevel mit einer Genauigkeit von 0.5*Point

(StopLoss,Ask,StopLevel sind normalisiert)

 
StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
//StopLoss может присвоиться новое значение, желательно и его проверить на StopLevel
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
Es ist ein bisschen unübersichtlich, aber man muss darüber nachdenken).
 

Was ist also mit dieser Option? Es scheint vernünftig, sie zu behalten...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

Wir sollten auch den Handelskontext überprüfen, da wir sonst die Fehlermeldung erhalten, dass er beschäftigt ist - TradeDispatcher: trade context is busy ... Es stellt sich heraus, dass, wenn es eine Menge von Kopien des EA, alle von ihnen gleichzeitig schließen die aktuelle Reihenfolge auf ihre Symbole und setzen neue... wird sich ein Stau bilden)

So funktioniert es wahrscheinlich...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Ask< Enter- StopLevel+0.5*Point){
               OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }
void DownTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Bid> Enter+ StopLevel-0.5*Point){
               OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }

D.h. bevor wir den aktuellen Auftrag schließen und einen neuen schwebenden Auftrag einstellen, überprüfen wir den Handelsfluss... Wenn es besetzt ist, halten Sie 1 Sekunde lang an.

 
ALex2008 >> :

Was ist also mit dieser Option? Es scheint sinnvoll zu sein, es zu behalten...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

Nein, so funktioniert das. Wir müssen uns entscheiden.)

drei Optionen:

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=Ask+ StopLevel;//+x*Point
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask> StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

ALex2008 schrieb >>

Außerdem müssen wir den Handelsthread überprüfen, sonst kann es zu Fehlern kommen, dass er besetzt ist... Denn wenn es viele Charts gibt, schließen sie alle laufenden Aufträge zur gleichen Zeit...
int start() {
   if(!IsTradeAllowed()) return(0);

wenn das nicht hilft, vor allen OrderSend,OrderModify,OrderClose,OrderDelete IsTradeContextBusy() prüfen


ALex2008 >>:
Nur wo man es richtig platziert denke ich... Ich meine zum Beispiel, dass die alten Aufträge nicht gelöscht werden, weil der Thread besetzt ist, sondern dass das Programm neue Aufträge erteilen muss... Und das Programm darf erst dann neue Aufträge erteilen, wenn alle alten Aufträge gelöscht worden sind.

Umschreiben Sie es einfacher. In den Funktionen UpTrend() und DownTrend() prüfen Sie Bedingungen, Aufträge werden entfernt und gesetzt,

zu viele verschiedene Dinge)

 
Swan >> :

Nein, so funktioniert es eben. >> Sie müssen sich entscheiden.)

Ich verstehe es nicht, wird es oder wird es nicht?)

 
ALex2008 >> :

Ich verstehe nicht - funktioniert es oder nicht?))

* es wird nicht funktionieren.

In Ihrer letzten Variante.

         if( Type==0){
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

in der ersten if() ist StopLoss nicht definiert.

 
Swan >> :

*Das wird nicht passieren.

In Ihrer letzten Variante.

in der ersten if() ist StopLoss nicht definiert.


Was ist es also?

im ersten Fall nimmt der Stop das Minimum (zum Preis) von 2 Candlesticks... d.h. weit entfernt vom Auftrag

StopLoss=MathMin(b0,b1); 

in der zweiten, wenn der Stop den maximalen (zum Preis) Tiefstwert von 2 Kerzen erhält, d.h. er liegt nahe an der Order


StopLoss=MathMax(b0,b1);
 
ALex2008 >> :
         if( Type==0){
//здесь StopLoss нипанятно какой)
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
 

//здесь StopLoss нипанятно какой)

Was genau ist unklar? Bei der Eingabe der Funktion ist sie Null. Vielleicht verstehe ich etwas nicht....


Oben gibt es eine Bedingung - Wenn der Auftrag offen ist und sein Stop = 0, dann platziere einen Stop

if ((Type<=1)&&(Stop==0))SetStop();

und die Funktion selbst, um einen Stopp zu setzen


//-------Вычисление стопа и установка
void SetStop(){
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
            
         if( Type==0){
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
   }