Y hagamos una "caricatura" de ello (multidivisa) - página 7

 
Swan >> :

Fue

Cuando StopLoss es verdadero, se asigna el nuevo valor,

en caso contrario, se modifica la orden.

no hay error, pero hay que quitarse una cruz o ponerse los pantalones).

No lo entendí de inmediato))... ¡la condición podría no causar una parada!

¿Tal vez deberíamos eliminar otra cosa? Parece que la lógica no sufre... ¿Por qué necesito la segunda condición si con una sola es suficiente?

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

O así...

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);


Cisne >> :

ver comparación de números reales.

Lo leeré... Entonces, ¿es absolutamente necesario? Es que nunca lo he hecho).

 
ALex2008 >> :

No lo entendí de inmediato... ¡La condición podría no causar una parada!

¿No podemos eliminar otra cosa? Parece que la lógica no sufre...

Tal vez) la vela de 4h suele ser mayor que el StopLevel...


ALex2008 >> :

Lo leeré... Es decir, ¿es necesario? Es que nunca lo he hecho así)

todo tipo de cosas raras suceden cuando los valores comparados son casi iguales)

cuando se comprueba la igualdad de un número de tipo doble - obligatorio.


 StopLoss-Ask< StopLevel-0.5*Point

En ruso: StopLoss menos Ask es menor que StopLevel con una precisión de 0,5*Punto

(StopLoss,Ask,StopLevel están normalizados)

 
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 un poco lioso, pero hay que pensar en ello).
 

¿Y qué pasa con esta opción? Parece razonable mantenerlo...

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);

También debemos comprobar el contexto comercial, de lo contrario nos da errores de que está ocupado - TradeDispatcher: trade context is busy ... Resulta que si hay muchas copias del EA, todas ellas cierran simultáneamente la orden actual de sus símbolos y ponen otras nuevas... se formará un atasco)

probablemente así es como funciona...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
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);
         }
      }
  }

Es decir, antes de cerrar la orden actual y establecer una nueva orden pendiente, comprobamos el flujo de operaciones... Si está ocupado, haga una pausa de 1 segundo.

 
ALex2008 >> :

¿Y qué pasa con esta opción? Parece sensato mantenerlo...

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);

No, así es como funciona. Tenemos que decidirnos).

tres opciones:

            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 escribió >>

Además, hay que revisar el hilo de comercio, de lo contrario puede tener errores de estar ocupado... Porque si hay muchos gráficos, todos cierran las órdenes actuales al mismo tiempo...
int start() {
   if(!IsTradeAllowed()) return(0);

si no ayuda, antes de todos los OrderSend,OrderModify,OrderClose,OrderDelete comprueba IsTradeContextBusy()


ALex2008 >>:
Sólo donde colocarlo correctamente creo... Me refiero a que, por ejemplo, los pedidos antiguos no se borran porque el hilo está ocupado, sino que el programa debe colocar los nuevos... Y el programa sólo debe colocar los nuevos cuando se hayan borrado todos los pedidos antiguos.

reescribirlo más fácilmente. en las funciones UpTrend() y DownTrend() comprobar las condiciones, las órdenes se quitan y se ponen,

demasiadas cosas diferentes)

 
Swan >> :

No, así es como funciona. >> tienes que decidirte).

No lo entiendo, ¿lo hará o no lo hará?)

 
ALex2008 >> :

No lo entiendo: ¿funcionará o no?))

*No va a suceder.

En su última 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);

en el primer if() StopLoss no está definido.

 
Swan >> :

*No va a suceder.

En su última variante.

en el primer if() StopLoss no está definido.


¿qué es?

en el primer caso, el stop toma el mínimo (en el precio) de 2 velas... es decir, lejos de la orden

StopLoss=MathMin(b0,b1); 

en el segundo si el stop recibe el máximo (en el precio) bajo de 2 velas. es decir, está cerca de la orden


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 нипанятно какой)

¿Qué es exactamente lo que no está claro? Es cero al entrar en la función. Tal vez no entienda algo....


Arriba hay una condición - Si la orden está abierta y su stop = 0, entonces coloca un stop

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

y la propia función para establecer un tope


//-------Вычисление стопа и установка
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);
         }
   }