Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 801

 

No entiendo cuál es el problema.

int start() 

{

bool i;

int ticket;

double Pricem;

datetime Timen; 

string Symb=Symbol();

ticket=OrderSend(Symb,OP_SELL,0.1,Bid,3,Ask+4*Point,Ask-12*Point);

i=OrderSelect(0,SELECT_BY_POS);

while(true)

{

RefreshRates();

Timen=OrderCloseTime();

  if(Timen>0)

   {

     Pricem=OrderClosePrice();

     Alert(Pricem);

     Alert("ордер закрылся");

     Sleep(30000);

 }

 Sleep(10);

 }

return;                              

}


Debería aparecer un mensaje de cierre. La orden se abre, llega al stop, se cierra y ¡ya está! ¿Dónde está el error?
 

Estoy resolviendo la tarea de cerrar todos los gráficos abiertos utilizando las herramientas MQL4. Hay 3 gráficos abiertos con diferentes pares de divisas y este es el código del script:

   for (int i=1;i<=3;i++) {
      long current=ChartID();
      Print("итерация цикла: ",i,", идентификатор текущего графика ",current);
      bool result=ChartClose(current);
      if(result)Print("окно успешно закрыто");
      else Print("не удалось закрыть окно с идентификатором: ", current);
   }

Cuando ejecuto el script, sólo se cierra uno de los tres gráficos y aquí están las impresiones del registro:

AUDUSD,H1: итерация цикла: 1, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 2, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто
AUDUSD,H1: итерация цикла: 3, идентификатор текущего графика 130627565403660021
AUDUSD,H1: окно успешно закрыто

Significa que tras el cierre de un gráfico el gráfico actual debería ser el otro, pero:

1. Después de cerrar el primer gráfico, la funciónChartIDdevuelve el identificador del gráfico cerrado en lugar del actual

2. Lafunción ChartClose() en 2 y 3 iteraciones devuelve true, lo que significa que cierra con éxito la ventana ya cerrada...

¿Quién sabe dónde está el fallo y cómo resolver este problema?

 
CJIeCaPb:

No entiendo cuál es el problema.

Debería aparecer un mensaje de cierre. La orden se abre, llega al stop, se cierra y ¡ya está! ¿Dónde está el error?

Creo que OrderSelect() debe estar dentro del bucle while, y además, el número de posición será incorrecto, porque después de que se cierre será diferente - en este caso es mejor seleccionar por ticket
 
tuner:
Creo que OrderSelect() debería estar dentro de un bucle while, y además, el número de posición será incorrecto, ya que después de cerrar se convertirá en diferente - en este caso es mejor seleccionar desde la entrada
¡Hurra, funcionó! ¡Gracias!
 
tuner:

Estoy resolviendo la tarea de cerrar todos los gráficos abiertos utilizando las herramientas MQL4. Hay 3 gráficos abiertos con diferentes pares de divisas y este es el código del script:

Cuando ejecuto el script, sólo se cierra uno de los tres gráficos y aquí están las impresiones del registro:

Significa que tras el cierre de un gráfico el gráfico actual debería ser el otro, pero:

1. Después de cerrar el primer gráfico, la funciónChartIDdevuelve el identificador del gráfico cerrado en lugar del actual

2. Lafunción ChartClose() en 2 y 3 iteraciones devuelve true, lo que significa que cierra con éxito la ventana ya cerrada...

¿Quién sabe dónde está el fallo y cómo resolver este problema?

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  
      prevChart=currChart;
      ChartClose(currChart);
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

pako, a veces funciona, a veces no, no sé por qué... Me da un error:

2014.12.11 17:52:12.456 Violación de acceso leída a 0x09295000 en 'C:\.....................ex4'

¿Podría ser porque está intentando cerrar el gráfico sobre el que se lanza el script?

PS funciona correctamente si el script se adjunta al primer gráfico de la izquierda. Pero si lo coloco en cualquier otro gráfico, obtengo un error

 
tuner:

pako, a veces funciona, a veces no, no sé por qué... Me da un error:

2014.12.11 17:52:12.456 Violación de acceso leída a 0x09295000 en 'C:\.....................ex4'

¿Podría ser porque está intentando cerrar el gráfico sobre el que se lanza el script?

PS funciona correctamente si el script se adjunta al primer gráfico de la izquierda. Pero si lo coloco en cualquier otro gráfico, obtengo un error

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(currChart<0) break; 
      ChartClose(currChart); 
      prevChart=currChart;
      i++;
     }
     ChartClose(ChartFirst());
  }
//+------------------------------------------------------------------+
 

Chicos, ayudadme en esto

El problema es la siguiente función para traducir la orden en no pérdida, empieza a funcionar incorrectamente si la pongo en los pares Yen y permite que todas las órdenes abiertas sean no pérdida

los dejo todos bien, pero en cinco dígitos vuelve a cero aunque lo ponga a cinco dígitos solamente pero lo mejor es que si lo pongo a cinco funciona bien

¿Qué hay que tener en cuenta en estas funciones, para que la ejecución correcta se lleve a cabo y no dependa de la operación de EA en qué ventana la lancé tres o cinco dígitos?

Muchas gracias.

    }

 //==================================================================================================

 // функция перевода ордеров стоп лоса в без убыток по всем открытым ордерам

 //==================================================================================================

 if(_Simbol==false)//если false то по всем ордерам открытым 

 { 

   for(int i=0;i<OrdersTotal();i++)//цикл перебора ордеров

     {

       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))//будем искать следующие

         {

           if(OrderType()==OP_BUY) //если тип бай

            {

             double  bid=MarketInfo(OrderSymbol(),MODE_BID);//последний известный бид инструмента

             double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

             

               if(OrderStopLoss()<OrderOpenPrice())//если стоп лос меньше цены открытия

                {

                  if(bid-Dist_Perivoda*point>OrderOpenPrice())//бид-профит*пункт больше цены открытия

                   {//модифицируем стоп лос

 bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

              if(!ord_modifik)//если не получилось

              Comment(GetLastError());//номер ошибки в угол

                   }

                   

                }

            }

            if(OrderType()==OP_SELL)//если тип селл

            {

              double ask=MarketInfo(OrderSymbol(),MODE_ASK);//последний известный аск инструмента

              double  point=MarketInfo(OrderSymbol(),MODE_POINT);//чему равен пункт инструмента

              

              if(OrderStopLoss()==0||OrderStopLoss()>OrderOpenPrice())//если стоп лос больше цены открытия или равен нолю

              {

                if(ask+Dist_Perivoda*point<OrderOpenPrice())//аск +профит*пункт меньше цены открытия

                  {//модифицируем стоп лос

  bool ord_modifik=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-NormalizeDouble(Level_Zahiti*point,Digits),OrderTakeProfit(),0,clrNONE);

                  if(!ord_modifik)//если не получилось

                  Comment(GetLastError());//номер ошибки в  угол

                  }

                }

             } 

          }

       }

    }

  

 
pako:

Gracias por el código, entiendo la esencia, aunque a veces me sigue dando error.

Se ha experimentado con funciones que muestran los ID de los gráficos. Lo que es ChartFirst() de la documentación no está en absoluto claro, uno puede interpretarlo de cualquier manera - puede significar el primer gráfico abierto en orden desde la izquierda, o el primer gráfico abierto de todos los abiertos (en el tiempo), o el primero abierto en la terminal (la posibilidad de que esté abierto ahora es casi cero, por lo que no tiene sentido cerrarlo). Me inclino más por esta última versión, porque nunca he visto que esta función devuelva el ID del gráfico, que está abierto en ese momento.

 
tuner:

Gracias por el código, entiendo la esencia, aunque a veces me sigue dando error.

Se ha experimentado con funciones que muestran los ID de los gráficos. Lo que es ChartFirst() de la documentación no está en absoluto claro, uno puede interpretarlo de cualquier manera - puede significar el primer gráfico abierto en orden desde la izquierda, o el primer gráfico abierto de todos los abiertos (en el tiempo), o el primero abierto en la terminal (la posibilidad de que esté abierto ahora es casi cero, por lo que no tiene sentido cerrarlo). Me inclino más por esta última versión, porque nunca he visto que esta función devuelva el ID del gráfico que está abierto en ese momento.

ChartFirst

Devuelve el ID del primer gráfico del terminal cliente.

Entiendo que este es el gráfico más a la izquierda