Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 762

 
Artyom Trishkin:

Entiendo que hay que indicar de alguna manera al Asesor Experto la entrada de la posición abierta manualmente, que quieres que rastree.

  1. Debe agregar al Asesor Experto el seguimiento de las posiciones recién abiertas y si no tiene un magik, significa que se abrió manualmente. El Asesor Experto marcará la apertura de esta posición en el precio y la barra de su apertura. El nombre del objeto debe contener un prefijo con el nombre común del objeto para todos los objetos de este tipo, por ejemplo "manual_" y también debe estar presente el ticket de la posición. Como resultado, el nombre del objeto puede ser el siguiente: "manual_12345678". Aquí: manual_ - prefijo, 12345678 - billete de posición.
  2. Añade al Asesor Experto OnChartEvent() y monitoriza el evento del clic del ratón sobre el objeto. Analiza el nombre del objeto y si contiene una subcadena manual_, busca un número después de manual_. Este número es el ticket de la posición sobre la que se ha hecho clic.
  3. Luego hay que guardar el número encontrado para que no se pierda al reiniciar el EA/terminal/ordenador/mundo... Por ejemplo, en los recursos o en las variables globales del terminal.
  4. El Asesor Experto debe leer este recurso y tomar la entrada de la posición a arrastrar desde él
  5. En el ciclo de arrastre, debe buscar el ticket de la posición seleccionada y buscar este número en la lista de tickets guardados. Si se encuentra un billete de este tipo, la posición con este billete debe ser rastreada.
  6. Si se modifica el número de posiciones, hay que comprobar el ticket de la posición cerrada y encontrarlo en la lista guardada. Si dicho billete existe en la lista, debe ser eliminado de la misma - la posición ya no existe, y no hay nada que hacer con su billete en la lista de billetes para el arrastre.
Algo así. La lógica fue escrita en una manivela, así que no pudo tener en cuenta algo...


Gracias por la aclaración, ahora entiendo lo que quiero decir.

Para mí las lecciones de mql recomiendan poner 3 (EURUSD), pero la liquidez de las divisas es diferente y también su velocidad. ¿Cuáles son las cifras que pueden utilizarse como punto de referencia en condiciones normales de mercado para los pares y cruces del dólar?

 
¿Es posible llenar un buffer multidimensional con CopyOpen, CopyHigh, CopyLow y CopyClose? La descripción dice que se copia a un array dinámico - pero un array dinámico puede ser multidimensional MQL5
 
Alexandr Sokolov:
¿Es posible llenar un buffer multidimensional utilizando las funciones CopyOpen, CopyHigh, CopyLow y CopyClose? La descripción dice que se copia a un array dinámico - pero un array dinámico puede ser multidimensional MQL5

Utiliza un array unidimensional...

 
Alexandr Sokolov:
¿Es posible llenar un buffer multidimensional utilizando las funciones CopyOpen, CopyHigh, CopyLow y CopyClose? La descripción dice que copia en un array dinámico - pero un array dinámico puede ser multidimensional.

Si tiene dificultades para entender las estructuras, puede utilizar ArrayCopyRates

int  ArrayCopyRates( 
   void&     dest_array[][],    // массив, переданный по ссылке 
   string    symbol=NULL,       // инструмент 
   int       timeframe=0        // таймфрейм 
   );

Si tienes un buen conocimiento de ello, será mejor que

CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 

Hola. He intentado construir un EA a partir de varios, todo funciona correctamente en el probador de estrategias (lo he comprobado en modo visualización). Intenté usar una cuenta demo y de vez en cuando tengo el siguiente problema, se abre una orden y luego se borra, y esto sucede durante una hora, hasta que cambia la hora. Pensé que hay una condición para entrar y eliminar la orden al mismo tiempo, pero la eliminación es sólo en el tiempo, he eliminado este error de bloque entero no ha desaparecido. Si alguien no es difícil que me diga dónde está el error.

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
      
   CurrHour = TimeHour(TimeCurrent());
   
   if (CloseByTime == true && DayOfWeek() == DayEnd && CurrHour >= CloseHour)
   {
      if (CountTrades() > 0 || CountStop() > 0) CloseTrades();
   
     
   }
     

   if (DayStart == DayOfWeek() && CurrHour == StartHour && ((!SetLimits && CountStop() == 0) || (SetLimits && CountLimits() == 0)) && CountTrades() == 0)
   {
      high = iHigh(Symbol(), 0, 1);
      low  = iLow(Symbol(), 0, 1);
      spread = MarketInfo(Symbol(),MODE_SPREAD);
      
      if ((high - low)/Point <= MaxPips && spread < Maxspread)
      {
         buy  = NormalizeDouble(high + Indent*Point, Digits);
         sell = NormalizeDouble(low - Indent*Point, Digits);
        
      
         if (FixedLot > 0)
            Lots = FixedLot;
         else Lots = GetLots();

         if (UseMartingale == true)
         {
            if (AccountBalance() < abalance) 
               Lots = getlotlast();
            else abalance = AccountBalance();
         }
         
         if (!SetLimits)
         {
            tp_sell = ND(sell-spread*Point - TPP*Point);
            tp_buy  = ND(buy + spread*Point + TPP*Point);
         
            sl_sell = ND(sell + SLP*Point+spread*Point);
            sl_buy  = ND(buy-SLP*Point-spread*Point);
            
          if (iClose(NULL,1440,1) < iMA(NULL,1440,PeriodMA,0,MODE_EMA,PRICE_CLOSE,1)) 
                  OrderSendReliable(Symbol(), OP_SELLSTOP, Lots, (sell-spread*Point), Slippage, sl_sell,  tp_sell, comment, Magic, 0, Red);
                                                                         
                                                                        else
                  OrderSendReliable(Symbol(), OP_BUYSTOP,  Lots, (buy+spread*Point),  Slippage, sl_buy, tp_buy,  comment, Magic, 0, Blue);
                                                                       
         
            
         }else
         {
            tp_sell = ND(sell - MathAbs(buy-sell)*TakeProfitK);
            tp_buy  = ND(buy +  MathAbs(buy-sell)*TakeProfitK);
         
            sl_sell = ND(buy + MathAbs(buy-sell)*StopLossK);
            sl_buy  = ND(sell - MathAbs(buy-sell)*StopLossK);
         
            OrderSendReliable(Symbol(), OP_SELLLIMIT, Lots, buy,  Slippage, sl_sell, tp_sell,  comment, Magic, 0, Red);
            OrderSendReliable(Symbol(), OP_BUYLIMIT,  Lots, sell, Slippage, sl_buy,  tp_buy, comment, Magic, 0, Blue);
         }
      }
   }
   return(0);
}
 
craft11111:

Hola. He intentado construir un EA a partir de varios, todo funciona correctamente en el probador de estrategias (lo he comprobado en modo visualización). Intenté usar una cuenta demo y de vez en cuando tengo el siguiente problema, se abre una orden y luego se elimina, y esto sucede durante una hora, hasta que cambia la hora. Pensé que hay una condición para entrar y eliminar la orden al mismo tiempo, pero la eliminación es sólo en el tiempo, he eliminado este error de bloque entero no ha desaparecido. Por favor, indique dónde está el error.

Es necesario hacer un desbordamiento en un bucle a través deOrderSelect

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
OrderOpenPrice - Торговые функции - Справочник MQL4
OrderOpenPrice - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderOpenPrice - Торговые функции - Справочник MQL4
 

Según tengo entendido, cuando se produce una condición, se produce una transición a la función de modificación en la que sólo se utiliza la orden select. Y también traté de eliminar esta pieza todo el mismo error se mantiene, y no siempre es visible qué condición se produce.

void ModifyLoss()
{
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderType() == OP_BUY)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() < SL && (Ask - OrderOpenPrice())/Point>= BUP)
         {
            if (SL != ND(OrderStopLoss()))
               OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      } else
      if (OrderType() == OP_SELL)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() > SL && (OrderOpenPrice()-Bid)/Point >= BUP)
         {
            if (SL != ND(OrderStopLoss()))
                OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      }
   }
}
 
craft11111:

Hola. He intentado construir un EA a partir de varios, todo funciona correctamente en el probador de estrategias (lo he comprobado en modo visualización). Intenté usar una cuenta demo y de vez en cuando tengo el siguiente problema, se abre una orden y luego se borra, y esto sucede durante una hora, hasta que cambia la hora. Pensé que hay una condición para entrar y eliminar la orden al mismo tiempo, pero la eliminación es sólo en el tiempo, he eliminado este error de bloque entero no ha desaparecido. Por favor, indique dónde está el error.

Tienes que escribir en la función Print(__FUNCTION__) o en Print(tal bloque, tales parámetros). Observe el orden de activación de las funciones/bloques. El primero que disparó y no debió hacerlo, ahí es donde está la pregunta entonces. Confiar en que "he descrito aquí condiciones bastante incompatibles para su desencadenamiento simultáneo" no es una buena idea. Tal vez la unidad no debería haber disparado, pero los parámetros externos le permitieron disparar, tal vez algo dentro de la unidad no debería haber disparado.

 

OnChartEvent() no funciona en el probador.

Por favor, muestre el botón que puede funcionar en el probador. Por ejemplo, al hacer clic en que se levantará la bandera trade = true; ¿hacer clic de nuevo? trade = false;

 
Ghabo:

OnChartEvent() no funciona en el probador.

Por favor, muestre el botón que puede funcionar en el probador. Por ejemplo, al hacer clic en que se levantará la bandera comercio = verdadero; ¿hacer clic de nuevo? comercio = falso;

En OnTick() controla la pulsación del botón. Si funciona en el probador - control en OnTick(), pero en el mundo real este control no se ejecutará y se controlará en OnChartEvent()

Razón de la queja: