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

 
rid >> :

Quizás la función https://www.mql5.com/ru/forum/107476/page21 pueda ayudar.

Función isCloseLastPosByTake().
Esta función devuelve una bandera para cerrar la última posición de la toma.

Bandera arriba - Verdadero - Se activó el TakeProfit.

Bandera bajada - Falso - la posición se cerró debido a otra razón.


La función propiamente dicha debe colocarse al final del código. También añado a la condición de vender:


Buenos días, tardes o mañanas a todos vosotros.

Hice todo como lo escribí. Puse la función al final del código y la añadí a mis condiciones de venta.

if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем

Acabo de pensarlo y lo he añadido para comprarlo. Los pedidos se cerrarán no sólo por BUY, sino también por SHELL.

He insertado la función isCloseLasPosByTake() al final.

2;116;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;104:33;'(' - function definition unexpected
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:7;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:14;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:27;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:33;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:15;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:37;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:17;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:46;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;116:19;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;117:17;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;127:19;'sy' - variable not defined

Aquí hay una tarta de este tipo, o como decía pfc Gotsman pintura al óleo. ayuda al tonto a salir.... no sabe nada.......

el propio código (es decir, sólo el inicio)

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {//покупаем
     if( CheckOrders(OP_SELL))
      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;
        else
         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;
        else
         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
       }
    
    // Открытие позиции Sell продажа  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {//продаем
     if( CheckOrders(OP_BUY))
      {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;
        else
         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;
        else
         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
       }
       bool isCloseLastPosByTake(string sy=NULL, int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy==NULL) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}
//----
   return(0);
  }//+------------------------------------------------------------------+
 
igrok2008 >> :


Específicamente escribí en mi post. ¡Que esta función isCloseLastPosByTake() - debe colocarse al final del código, ANTES de la FUNCIÓN START!

¿Y dónde lo pusiste?

Y cuidado con los corchetes en las condiciones de compra y venta. Ahí te faltan claramente (comprueba - que el número de paréntesis abiertos es igual al número de cerrados). Aquí se corrigió la venta :

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
 

¡¡¡Buenos días!!!


¡Necesito ayuda! Me disculpo por no ser modesto.

Pero este es mi problema, tengo un EA que se basa en un Martin, coloca la primera orden de VENTA o COMPRA, lo que yo quiera, pero quiero poder elegir COMPRA o VENTA en las propiedades del EA. Es decir, pongo por ejemplo COMPRA en sus propiedades y se abre una orden sólo de COMPRA, o lo contrario.

Me temo que aún no he aprendido a programar en MQL4 .


Adjunto el propio asesor.


¡Gracias de antemano a los que respondan!

 
rid >> :

Específicamente escribí en mi post. ¡Que esta función isCloseLastPosByTake() - debe colocarse al final del código, ANTES de la FUNCIÓN START!

¿Y dónde lo pusiste?

Y presta más atención a las llaves en las condiciones de compra y venta. Ahí te faltan claramente (comprueba - que el número de paréntesis abiertos es igual al número de cerrados). Aquí está el arreglo de la venta :


Lo puse después del inicio fi, así que entiendo.....

Lo he entendido mal entonces, gracias por el pinchazo :-))

Si lo he entendido bien, debería ponerse después de } al final del bloque de función de desinicialización de expertos ??????? o después de return(0); al final de start-???????

¡¡¡¡¡¡¡¡¡Gracias de antemano por su paciencia!!!!!!!!!

 
igrok2008 >> :

Lo puse después de la función de inicio, por lo que entiendo.....

Lo he entendido mal, gracias por el pinchazo :-))

Si he entendido bien, debe ponerse después de } al final del bloque de función de desinicialización de expertos ??????? o después de return(0); al final de start-???????

¡¡¡¡¡¡¡¡¡Gracias de antemano por su paciencia!!!!!!!!!

Debe colocarse en el exterior. No dentro de ninguna función, - sino como una función independiente.

Así:

int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if( MAF_1 < MAS_1 && MAF_0 > MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_SELL, MagicNumber) ==true) {
     if( CheckOrders(OP_SELL))                                      {
       if( StopLoss <= StopLevel+ Spread)
         double SL = 0;        else         SL = Ask - StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         double TP = 0;        else         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
                }
               }
              }
//-------------------Конец покупки -----------------------

    //  ----- Открытие позиции Sell продажа------------  
    if( MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY, MagicNumber) ==true) {
     if( CheckOrders(OP_BUY))                                     {
       if( StopLoss <= StopLevel+ Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if( TakeProfit <= StopLevel- Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
    
//----
   return(0);
  }//+----------КОНЕЦ ФУНКЦИИ СТАРТ -------------------+


//ЖЖЖЖЖЖЖ Другие вызываемые пользовательские функции ЖЖЖЖЖЖ

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия           |
//|  последней позиции по тейку.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) {
                t=OrderCloseTime();
                j= i;
              }} }}}}}

  if (OrderSelect( j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo( sy, MODE_DIGITS);
    if ( dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if ( ocp== otp) return( True);
  }
  return( False);
}


No estoy seguro de que en estas condiciones, el Asesor Experto funcione. Porque la primera posición no podrá abrir...

La función isCloseLastPosByTake() debe ser eliminada de una condición de compra o venta.

Entonces el asesor trabajará.

 
Rover82 >> :

¡¡¡Buenos días!!!

Pero este es mi problema, tengo un EA que se basa en un Martin, coloca la primera orden de VENTA o COMPRA, lo que yo quiera, pero quiero poder elegir COMPRA o VENTA en las propiedades del EA. Es decir, pongo por ejemplo COMPRA en sus propiedades y se abre una orden sólo de COMPRA, o viceversa.

Adjunto el propio EA.

¡Gracias de antemano a todos los que respondan!


Es poco probable que nadie responda. El EA está descompilado (hackeado) y esos archivos no son bienvenidos aquí...

 
WinExec("C:\\Program Files\\Opera\\opera.exe http://www.mail.ru",2);
Hola a todos, esto es lanzar el enlace con un navegador específico, pero ¿cómo puedo lanzar el mismo enlace por defecto?
 
Es decir, con el navegador por defecto
 
Dimoncheg >> :
Es decir, el navegador por defecto

ShellExecute, el comando "abierto", por así decirlo.

 

He decidido estudiar MQL 4 ya que todo lo que he encontrado no cumple con mis aspiraciones. En este momento estoy estudiando para entender cómo funcionan los profesionales y mejorarlo para mi idea. Hay una (simple y pequeña, una página) función personalizada, el código se adjunta. Debido a mi amateurismo, no puedo durante dos días entender - lo que esta función devuelve como resultado, y que condición anidada es el Else?

¿Alguien podría plantar una chispa de conocimiento en mi torpeza?

Lo que consigo es esto:

El propósito de la función es determinar si ya existe un pedido para este par y, si lo hay, determinar su tipo.

La función que llama a esta función espera la presencia de uno de los pedidos seleccionados en el procedimiento interruptor, La función debe devolver "1", en presencia de dos órdenes - "2", y en ausencia de órdenes "-1".

El ciclo se inicia si l_pos_16= 0. Supongamos que tenemos cuatro órdenes pendientes en total para algunos pares, incluyendo dos en el par donde el EA está trabajando y no son las primeras.

Sin embargo, en la primera iteración del bucle, la función if(OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) comprueba la posición con el número "0" en la lista de pedidos, pero no existe tal posición (porque entiendo que la numeración es a partir de la posición 1) y entonces pasará a la siguiente. si no con salida completa de fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12) con devolución del valor Retorno(-1).

Se pierde el sentido de la función en su conjunto, ya que el resultado debería ser el mismo independientemente de la presencia o ausencia de órdenes en el símbolo dado .

Sin embargo, cuando el EA funciona, esta función define y da lo que la función llamada espera de ella, que luego trabaja en función del resultado obtenido .

Tampoco entiendo qué si no Return(-1) funcionará en

if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {

O mismo en if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

El código de la función :

int fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12)

a_count_0= 0;

a_count_4 = 0;

a_count_8 = 0;

a_count_12 = 0;

gi_252 = 0;

for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); l_pos_16++) {

if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

switch (OrderType()) case OP_BUY:

a_count_0++;

gi_252 = 1;

g_ticket_268 = OrderTicket();

gs_272 = OrdenComentario();

g_ord_open_price_256 = OrderOpenPrice();

g_ord_stoploss_288 = OrderStopLoss();

g_ord_takeprofit_296 = OrderTakeProfit();

romper;

caso OP_SELL:

a_count_4++;

gi_252 = -1;

g_ticket_268 = OrderTicket();

gs_272 = OrdenComentario();

g_ord_open_price_256 = OrderOpenPrice();

g_ord_stoploss_288 = OrderStopLoss();

g_ord_takeprofit_296 = OrderTakeProfit();

romper;

caso OP_BUYSTOP:

a_count_8++;

romper;

caso OP_SELLSTOP:

a_count_12++;

}

}

} si no, devuelve (-1);

}

devolver (a_count_0 + a_count_4 + a_count_8 + a_count_12);

/* la ejecución normal de la f-i devolverá uno en la variable en uno de caso y "0" en todos los demás, lo que indica que hay uno de

de los tipos de orden, y el número de esta orden está disponible para la función de llamada,

comentario, precio de apertura, stop loss y take profit */

}