[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 207

 
solnce600:

Señores, por favor, díganme cómo codificar (probablemente en una declaración condicional) una idea simple

-si una operación se cerró con un stop loss

-abrir otra operación al precio de stop loss

Gracias

Echaun vistazo.
 
Roger:

1. No se pueden abrir órdenes en la función init(). (En el Probador de Estrategias, esto seguirá funcionando, pero no funcionará en la demo).

2. Cuando se cierran órdenes, se debe contar desde el final hasta el principio, y no al revés, como en tu caso.

Gracias por su respuesta.
En este caso se investigó el operador de bucle en el probador, por eso las órdenes se abren en init() para simplificar, esto no ocurre en los EAs reales.
Un cambio en el orden de selección de la orden efectivamente lleva al cierre de las órdenes dentro de un tick (doy el código del programa y el informe del registro del probador más abajo).
Me parece extraño que el MQL4 no me permita cambiar el orden de trabajo con las órdenes, si saben por qué, por favor avisen, ya que según la lógica de trabajo de un EA voy a cerrar las órdenes exactamente en el orden en que se abren.

Sinceramente. Shurkin.

Код программы.

//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                                            21 февраля 2013 года. |
//|Тестирование оператора цикла for.                                 |
//+------------------------------------------------------------------+
#property copyright "21 февраля 2013 года."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int i;//Показатель счётчика итераций
double PriTP;//TP серии
int Tick;//Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка серии ордеров
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,NormalizeDouble(Bid-35*Point,Digits),
NormalizeDouble(Ask+35*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUYLIMIT,1,NormalizeDouble(Ask-15*Point,Digits),0,
NormalizeDouble(Bid-40*Point,Digits),NormalizeDouble(Ask+25*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_BUYLIMIT
OrderSend(Symbol(),OP_SELLSTOP,3,NormalizeDouble(Ask-30*Point,Digits),0,
NormalizeDouble(Bid+15*Point,Digits),NormalizeDouble(Ask-75*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_SELLSTOP
//----
   PriTP=Bid;//PriTP
   Print("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Tick++;//Tick
//   Print("Кс1:"," Tick=",Tick);//Сообщение
//----
//   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
   for(i=OrdersTotal()-1; i>=0; i--)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
//----
   return(0);
  }
//+------------------------------------------------------------------+
Записи в журнале тестера.

2013.03.08 13:28:19     Poligon1 EURUSD,M15: removed
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=0
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=1
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=0
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=0
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=2
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=3
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=4
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=5
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=6
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс0: OrdersTotal=7
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok
2013.03.08 10:13:26     Poligon1 test started
2013.03.08 10:13:24     Poligon1 EURUSD,M15: loaded successfully

 
Muchas gracias por la valiosa información, definitivamente trataré de tener en cuenta todo lo que me has dicho en el futuro.
 
borilunad:

No podrá abrir exactamente en el precio de stop loss, pero puede condicionar la apertura en la misma dirección o en la opuesta.

Aquí hay una llamada a una función de las "Funciones útiles" de Kim, que puedes poner en una condición:

isCloseLastPosByStop - Devuelve la bandera para cerrar la última posición por el stop

if(isCloseLastPosByStop() == 0) o ... == 1) y lo que quieras ......

Puede encontrar la función aquí: https://www.mql5.com/ru/forum/131859

¡Y ponlo fuera de la salida!

Y te insto a que lo hagas todo por ti mismo, con diligencia, precisión y paciencia, ¡de lo contrario no aprenderás nada de las pistas!

El conocimiento sólo se adquiere con un esfuerzo adecuado por tu parte. ¡Ponte a trabajar a diario de forma inquisitiva! Buena suerte.


Muchas gracias por la valiosa información, definitivamente trataré de tener en cuenta todo lo que me has dicho en el futuro.
 

Buen día.

Por favor, díganme si hay situaciones en las que los TC pueden cambiar o eliminar los comentarios de una orden.

Muchas gracias.

 
Gek34:

Por favor, díganme si hay situaciones en las que los TC pueden cambiar o eliminar los comentarios de una orden...

Como ejemplo.
Comentario nativo
e121220_3in1 01

Con CC añadida tras la prórroga

e121220_3en1 01[swap]

Es decir, si buscamos una orden con un comentario, debemos determinar preliminarmente la longitud de la línea de comentario nativo y durante la búsqueda sólo comprobamos la primera parte del comentario modificado en la longitud correspondiente. O comprobar si la cadena nativa está en el comentario que se está comprobando.

 

Shurkin:

Gracias por la respuesta.
En este caso el trabajo del operador de bucle fue investigado exactamente en el probador, por eso las órdenes se abren en el init() para simplificar, no sucede en los EAs reales.
Al cambiar el orden de selección de las órdenes, sí que se cierran las órdenes en un tick (doy el código del programa y el informe del registro del probador más abajo).
Me parece extraño que el MQL4 no me permita seleccionar una orden. Si saben por qué, por favor, aconséjenlo, ya que la lógica de trabajo del Asesor Experto sugiere que las órdenes deben cerrarse exactamente en el orden en que se abren.

Sinceramente. Shurkin.



Una vez que se cierra un pedido, se recalculan todos los demás. Prueba esta construcción

 for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
 
Gek34:

Buen día.

Por favor, díganme si hay situaciones en las que los TC pueden cambiar o eliminar los comentarios de una orden.

Muchas gracias.


Hemos experimentado un cambio completo de comentario sobre un pedido. Además, la magia a veces se pone a cero durante los cierres parciales (los cierres parciales son iniciados por el servidor). Ahora, hay un asesor separado y en bucle para controlar esto último, que vigila las órdenes "ajenas" y otras incoherencias, notificando por mensajes Push de manera oportuna.
 

Por favor, aconséjeme cómo escribir la condición correctamente:

1.si el símbolo de orden = símbolo y el magik de orden = 135

2.si no hay órdenes pendientes de BAYSTOP

3.si no hay órdenes abiertas BAY O (si las hay) stoploss>precio de apertura

4.si el precio está entre la MA y el fractal hacia arriba

COLOCAR ORDEN DE COMPRA PENDIENTE

ESCRITO ASÍ:

 static bool flag ;

   if(NewBar()==true)

     flag = true; 

     for(int i=0;i<total-1;i++) 

         {

         OrderSelect(i,SELECT_BY_POS); 

          if(OrderSymbol()==Symbol() && OrderMagicNumber()==135) 

          { 

          if(OrderType()<=OP_BUYSTOP) 

           {

           if((OrderType()<=OP_BUY) || (OrderType()==OP_BUY && OrderStopLoss()>OrderOpenPrice()))  

            { 

            if(Ask<m && Ask>ma && frUP>0 && flag)

            {

              double price = NormalizeDouble(frUP+30*Point+(Ask-Bid)*Point,Digits);

             double stoploss = NormalizeDouble(price-sl*Point-30*Point,Digits);

             double takeprofit = NormalizeDouble(price+tp*Point,Digits);

             int ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,price,5,stoploss,takeprofit,"R",135,TimeCurrent()+55000,Blue);

             if(ticket>0)

               {

               Alert("R!Отложенный ордер BUYSTOP!!! ",Symbol());

               flag = false;

               }

               else

               {

               Print("Lots= ", Lots,"price= ", price,"stoploss= ", stoploss,"takeprofit= ", takeprofit,"Ошибка № ",GetLastError());      

               return;

               }

             }

           }

         }

       }

     } 

¡NO FUNCIONA! ¡DIME CUÁL ES EL ERROR!

 

Por favor, indíqueme qué puede estar causando el siguiente problema.

Hay un indicador que utiliza funciones externas. El código de la biblioteca compilada se encuentra en la carpeta de bibliotecas, descriptores - en incluir.

Conexión #include <lib_Zemckikh.mqh>. Durante la primera ejecución del indicador, todas las funciones de la biblioteca funcionan normalmente, el indicador se muestra en el gráfico. Después de un cambio de parámetros (después de un nuevo cálculo del indicador) las funciones de la biblioteca no se llaman, el indicador no se muestra, no hay entradas en la pestaña "Expertos" después del cambio de parámetros.

Si se excluye la conexión de la biblioteca y se colocan las funciones necesarias en el archivo del indicador (compilado directamente con las funciones), todo funciona bien.

No puedo entender qué pasa. No quiero contaminar el foro, no voy a adjuntar los códigos. Si lo necesitas, te lo enviaré en persona.

Razón de la queja: