[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 588

 
lottamer:


1) es comprensible

2) Acabo de comprobarlo...en Alpari no se puede poner stop y take en la apertura. sólo a través de la modificación posterior...costes de la mesa de no negociación

3) hay una estrategia.


Entonces es tan sencillo como lo has sugerido. Después de la modificación, se establece una casilla de verificación y se comprueba su estado antes de la modificación.Esto es si hay una orden. Si hay más de uno, debe contabilizar los pedidos usted mismo. Cómo hacerlo está en la sección de artículos.
 
TarasBY:
¡Nosotros (simples mortales) no lo entendemos! ;)))



Voy a leer un poco de mi vacío ))))
 

¿Pueden aconsejar si hay algún deslizamiento para los valores de stop y retirada cuando las órdenes se reabren con un rollover? ¿Y cómo se fijará el stop si la diferencia entre el precio de apertura y el stop después del rollover es menor que el stop nivelado?

Mi tarea es la siguiente. Si tengo una orden de mercado abierta, debería comprobar si fue abierta con rollover y si lo fue, debería obtener el ticket de la orden anterior, que fue cerrada. Tal vez alguien me diga el algoritmo de búsqueda. Actualmente estoy haciendo lo siguiente:

1. Selecciono la primera orden abierta.
2. Si se abrió de las 23:40 a las 00:20, entonces continúo comprobando esta orden más adelante (se toma la ventana de 40 minutos por si acaso, aunque en teoría se podría tomar de las 23:50 a las 23:59)
3. Recuerdo la entrada, el stop y el precio de toma
4. Compruebo todas las órdenes cerradas en el historial, donde los comentarios contienen la palabra swap y los pares de divisas coinciden
5. Comparo los datos de los stops y las tomas de posesión, si coinciden, aquí es el par de órdenes requerido, si no, vuelvo al paso 1

 

La respuesta se ha encontrado (personalmente), ¡pero dejaré el post para la historia! :))))

----------------------------------

pero esto es lo interesante...

Tengo un script (lo conseguí en internet). modifica una orden abierta.

Mi idea era tomarla como un todo, e insertarla en mi Asesor Experto como una función definida por el usuario, y llamarla cuando fuera necesario.

El problema es que el compilador da error "'MB_OK' - variable no definida G:\gram_Files_2\MT4-demo\experts\33.mq4 (153, 37)" - 3ª línea desde el final

Pero si se compila el propio script, todo está claro.

He descubierto lo que es MV_OC... pero no entiendo por qué funciona en el script, pero se avisa en el Expert Advisor?

//+------------------------------------------------------------------+
//|                                               Изменить стопы.mq4 |
//|                                                          Мефодий |
//|                                                    ppc-2@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Мефодий"
#property link      "ppc-2@mail.ru"
#include <WinUser32.mqh>

extern  int  StopLoss = 500; 
extern  int  TakeProfit = 500;

// #property show_confirm
// #property show_inputs

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+

int start()
  {
        bool   result;
        double stop_loss,take_profit,point,bid,ask, lotsize;
        int    cmd, total, error, spread;
        string message;
//----
   total=OrdersTotal();

//----
   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         //---- print selected order
         OrderPrint();
         cmd=OrderType();
         point=MarketInfo(OrderSymbol(),MODE_POINT);
         bid= MarketInfo(OrderSymbol(),MODE_BID);
         ask= MarketInfo(OrderSymbol(),MODE_ASK);
         spread=MarketInfo(OrderSymbol(),MODE_SPREAD);     
         //---- buy or sell orders are considered
         if(cmd==OP_BUY || cmd==OP_SELL)
          {
            //---- modify first market order
            while(true)
             {
                if(cmd==OP_BUY){
                        string type = "buy";
                        if(OrderStopLoss()!=0)stop_loss=OrderStopLoss();
                        else stop_loss=OrderOpenPrice()-StopLoss*point;
                        if(OrderTakeProfit()!=0)take_profit=OrderTakeProfit();
                        else take_profit=OrderOpenPrice()+TakeProfit*point;
                }
                     
                else{
                        type = "sell";
                        if(OrderStopLoss()!=0)stop_loss=OrderStopLoss();
                        else stop_loss=OrderOpenPrice()+StopLoss*point;
                        if(OrderTakeProfit()!=0)take_profit=OrderTakeProfit();
                        else take_profit=OrderOpenPrice()-TakeProfit*point;
                }   
                result=OrderModify(OrderTicket(), OrderOpenPrice(), stop_loss, take_profit, 0, CLR_NONE);
                if(result!=true) { error=GetLastError(); Print("LastError = ",error);}
                else {error=0;}
                if(error==135) RefreshRates();
                else break;
              }
                if(error==0){
                        message=message+"Ордер #"+OrderTicket()+" - "+type+" - "+DoubleToStr(OrderLots(), 2)+" успешно модифицирован.\n";
                        }
                        else{
                                if(error == 130){string error_desc = " - Неправильные стопы";} else error_desc = "";
                                if(error != 1)
                        message=message+"Ошибка модификации ордера #"+OrderTicket()+" - "+type+" - "+DoubleToStr(OrderLots(), 2)+". "+error_desc+" \n";
                        }

              //---- print modified order (it still selected after modify)
              OrderPrint();
              continue;             
           }
        }
      else { Print( "Error when order select ", GetLastError()); break;}
     }
        int ret=MessageBox(message, NULL, MB_OK);
        //if(ret==IDOK) return(0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Resulta que la línea #include <WinUser32.mqh> debe estar presente.

y este archivo está en include

 

déjame presumir...

no necesitas ninguna bandera al modificar.

es suficiente bajo la condición if (cross-means por ejemplo)... para tomar la referencia de utilizar la función BUY y MODIFY entre paréntesis {}

y de esta manera, la condición se propagará a ambas acciones :))

así

{Mi_compra ();

Mi_modificación (); }

:))))))))))))))))))))))))

 

lottamer:

así

{Mi_compra ();

Mi_modificación (); }

:))))))))))))))))))))))))

Una interpretación tan poco rigurosa del código del programa requiere una aclaración:

    if (условие == true)
    {
        if (Tvoi_buy() == true)  // как вариант
        {Tvoi_Modify();}
    }
:)))
 
TarasBY:

Una interpretación tan laxa del código del programa requiere una aclaración:

:)))


¿Por qué?

y ¿se puede comprobar que Mi_compra (una variable no booleana) es TRUE-FALSE?

La modificación va por seguro - la orden está abierta - tenemos que poner los stop-stocks...

 
lottamer:

la modificación está en marcha con seguridad - la orden está abierta - tiene que establecer los picos de parada...

Entonces, ¿por qué lo has puesto entre paréntesis { } si (medias cruzadas, por ejemplo)?
 

¡Me estoy convirtiendo en madre delante de mis ojos! (es decir, convertirse en matriarca) :))

esto es lo otro.

Si modificaba un pedido, la ventana de notificación aparecía después informando de que el pedido se había modificado con éxito. Además, si desactivo el EA después de que aparezca esa ventana, después de pulsar OK en la ventana de mensajes, el EA SIEMPRE REPARARÁ sus acciones (cerrar una posición, en este caso). Lo interesante es que el EA ha desaparecido, ¡pero sus comandos se siguen ejecutando!

Tuve que pensar un poco y quitar la línea

message=mensaje+"Error de modificación del pedido #"+OrderTicket()+" - "+type+" - "+DoubleToStr(OrderLots(), 2)+"."+error_desc+" \n"

Después de eso todo fue como debería. sin ventanas... todo se abre y se cierra... se abre y se cierra... se abre y se cierra...

:))))))))))))

P.D.

pero si se elimina

OrderPrint(); 

continuar;

no hay ningún cambio ... lo mismo con la línea

if(ret==IDOK) return(0);

si está allí o no - ¡no hay cambio!

¿por qué es así?