Errores, fallos, preguntas - página 52

 
No era así en MT4, gracias. Sólo lo quité
 

Durante las pruebas de los Asesores Expertos:
Exp_TEMA.mq5, del artículo: "Creación de un Asesor Experto que opera con diferentes símbolos". La expresión Told[] Tnew[1]obtiene los siguientes valores:
Told[] La expresión no pudo ser evaluada
Tnew[1] Rango de array inválido.

Y My_First_EA.mq5, del artículo: "Guía paso a paso para escribir asesores expertos MQL5 para principiantes", la expresión
New_Time[1] obtiene el valor:Rango de array no válido

¿Qué significan los valores Expresión no pudo ser evaluada, Rango de array inválido, y cómo afectan a los resultados de los expertos?

 

Told - matriz vacía sin tamaño

Tnew[1] - fuera de la matriz, la matriz se describe como Tnew[1], por lo que sólo se puede acceder a sus elementos como Tnew[0], porque el índice comienza en cero.

 
Renat:

Told - matriz vacía sin tamaño

Tnew[1] - fuera de la matriz, la matriz se describe como Tnew[1], por lo que sólo se puede acceder a sus elementos como Tnew[0], porque el índice comienza en cero.


En cuanto a Tnew, ya lo he mencionado en otro hilo del foro, al parecer, era necesario un comentario de los desarrolladores :)
 

Por favor, díganme cómo abrir sólo una operación por condición. Con mi código, el terminal abre varias ofertas en esta condición, pero yo sólo necesito una.

       if(Buy_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);        
        }        

       if(Sell_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу                                          
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);              
        }
      

El resultado es la siguiente imagen:

¿Cómo puedo comprobar si un acuerdo se ha realizado con esta condición o no? Lo he intentado así, pero no funciona:

// в этом цикле поочередно перебираем все открытые позиции
   for(i=0;i<PositionsTotal();i++)
     {
      // выбираем позиции только по "нашему" инструменту
      if(Symbol()==PositionGetSymbol(i))
     ...
     }
 
AM2:

Por favor, aconséjeme cómo abrir sólo una operación por condición. Con mi código, el terminal abre varias ofertas en esta condición, pero yo sólo necesito una.

El resultado es la siguiente imagen:

¿Cómo puedo comprobar si un acuerdo se ha realizado con esta condición o no? Lo he intentado así, pero no funciona:

¿Y por qué organizar la búsqueda en el bucle si existe algo tan maravilloso como PositionSelect?

Sólo comprobamos la existencia de la posición en el símbolo interesante y si es cierto, nos vamos a beber coñac y a fumar puros... :)

PS

Según entiendo PositionGetString sinPositionSelect no debería funcionar. No necesitamos conocer los símbolos de todas las poses abiertas, ¿verdad?

 
Interesting:

No hay necesidad de buscar en el bucle cuando existe algo tan maravilloso como PositionSelect?

Simplemente se comprueba la presencia de una posición en la herramienta que nos interesa y si vuelve a ser cierta nos vamos tranquilamente a beber coñac y fumar puros... :)

PS

Según entiendo PositionGetString sinPositionSelect no debería funcionar. No necesitamos conocer los símbolos de todas las poses abiertas, ¿verdad?

Este código tiene en cuenta la presencia de una posición abierta:

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер                
     }

Pero sigue abriendo posiciones cuando se cumple la condición de la señal de compra. Lo que quiero es que antes de que se produzca la Señal_de_Venta no se vuelva a abrir una posición en la Señal_de_Compra. Estoy tratando de implementarlo de esta manera:

   Buy_Signal = true;
   Sell_Signal = true;                

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер
         Buy_Signal = false;
         Sell_Signal = true;                
     }


   if(Sell_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер    
         Buy_Signal = true;
         Sell_Signal = false;                
     }
No va.
 
AM2:

Este código tiene en cuenta la presencia de una posición abierta:

Pero sigue abriendo posiciones cuando se cumple la condición de Buy_Signal. Necesito asegurarme de que antes de que se produzca la condición de Sell_Signal no se abran más posiciones por Buy_Signal. Estoy tratando de implementarlo de esta manera:

No es así.

¿Por qué este código? Apenas se parece a lo que quería decir (dudo que sea correcto).

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                     // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);          // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit 
         OrderSend(mrequest,mresult);                                        // отсылаем ордер                
     }

Y me refería a algo así:

Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);

SL = NormalizeDouble(Ask - 500*_Point,_Digits);  // Stop Loss
TP = NormalizeDouble(Ask + 1500*_Point,_Digits); // Take Profit

  if(Buy_Signal)
  //Получен сигнал на market buy
  {
  
    if(!PositionSelect(_Symbol))
    //Позиции по данному символу отсутствуют
    {
    mrequest.action = TRADE_ACTION_DEAL; //Установка рыночного ордера (позиция)
    mrequest.type   = ORDER_TYPE_BUY;    //Ордер на покупку
    mrequest.magic = 18072010;          //ORDER_MAGIC
    mrequest.symbol = _Symbol;          //Инструмент
    mrequest.volume = 0.1;              //Объем в 0.1 лот
    mrequest.price = Ask;   //Цена открытия
    mrequest.sl = SL;       //Stop Loss
    mrequest.tp = TP;       //Take Profit
    mrequest.deviation = 5; //Отклонение в 5 пунктов   
    OrderSend(mrequest,mresult); //Отсылаем ордер
    }
  
  }

Como mínimo podrías hacerlo en un bloque

  if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }
 
Interesting:

¿Por qué este código en particular? No es ni remotamente parecido a lo que quería decir (no creo que sea correcto en absoluto).

Y me refería a algo así:

Como mínimo, todo puede hacerse en un bloque.

if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }

Este código y el anterior no abren una posición hasta que se cierra, sino que la abren de nuevo tras el cierre en la siguiente barra si se cumple la condición. Lo he implementado de esta manera:

bool BuyOne = true, SellOne = true; // только один ордер.  глобальные переменные




   if(Buy_Signal &&                                                         // покупаем если есть сигнал на покупку
      PositionSelect(Symbol())==false &&                                    // ордер закрыт
      BuyOne)                                                               // при условии на покупку ставим только один ордер
     {
      mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
      mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
      mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
      mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
      OrderSend(mrequest,mresult);                                          // отсылаем ордер
      BuyOne = false;                                                       // на покупку только один ордер                                                  
      SellOne = true;                                                       // меняем флаг одного ордера на продажу          
     }

Gracias. He tenido en cuenta todos sus deseos y ahora todo funciona. El Asesor Experto ha sido publicado. Puedo hacer algunos cambios más en el código. La seducción no tiene límites)))

 
No he encontrado en la documentación ninguna descripción de los códigos de respuesta (Retcode) para la estructura de los resultados de la comprobación de la solicitud de comercio MqlTradeCheckResult. ¿Habrá alguna?
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
Razón de la queja: