[¡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 699

 
artmedia70:

Aquí tienes

void OpenBuy() {

double dStopLoss = 0, dTakeProfit = 0;
double Lotes_Nuevos = Lote;

si (isLossLastPos(NULL, -1, MAGIC))
Lots_New *= 2;
else if (!isLossLastPos(NULL, -1, MAGIC))

Lotes_Nuevos = Lote;

Es una función, y al principio de esta función se asigna a la variable Lotes_Nuevos el valor = Lote;

Piensa en cómo cambiará después si siempre lo devuelves a su estado original...

¿Dónde te dije que lo escribieras? En las variables externas antes de la función de inicio...

Y normalizar el valor del lote al tamaño correcto:

Lots_New = NormalizeLot(Lot*2, False, "");




¡Muchas gracias!

¿Puede decirnos también si puede añadir el valor de un lote a cada orden perdedora posterior? Puede utilizar algo como esto

1 lote 0,01

2 lote 0,01

3 lote 0,02

4 lote 0,03

5 lote 0,07

.....

15 lote 1.2

Poder cambiar el valor del lote en el código.

Y que en caso de que un acuerdo resultara rentable, todo volvería al principio.

Se lo agradeceré de antemano.

Gracias.

 
Necron:
Roger, gracias, pero sigue sin funcionar correctamente. He intentado añadir otro trailing stop, pero el error sigue ahí :( ¿Hay alguna diferencia entre el trailing stop para una posición y el trailing stop para varias posiciones a la vez?

En principio, no hay ninguna diferencia.
Prueba mi función, es bastante simple, pasar como parámetros, medjic, y arrastre deseado.
La llamada de esta función se realiza al inicio, en cualquier lugar, siempre que se "chorree" allí en cada tick.

//+------------------------------------------------------------------+
void trailing(int magic, int trailing){
   int index = 0;
   while(trailing > 0 && OrdersTotal() != 0 && OrderSelect(index, SELECT_BY_POS)){
      if(OrderMagicNumber() == magic){
         if(OrderType() == OP_BUY){
            if(Bid - OrderStopLoss() > Point*trailing){
               if(trailing >= MarketInfo(Symbol(), MODE_STOPLEVEL) && trailing > MarketInfo(Symbol(), MODE_FREEZELEVEL))
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - (Point*trailing), OrderTakeProfit(), 0))Print(">>> ERROR ", GetLastError());
            }
            return;
         }
         if(OrderType() == OP_SELL){
            if(OrderStopLoss() - Ask > Point*trailing || OrderStopLoss() == 0){
               if(trailing >= MarketInfo(Symbol(), MODE_STOPLEVEL) && trailing > MarketInfo(Symbol(), MODE_FREEZELEVEL))
                  if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + (Point*trailing), OrderTakeProfit(), 0))Print(">>> ERROR ", GetLastError());
            }
            return;
         }
      }
      index++;
   }
}
//+------------------------------------------------------------------+

Obviamente, los pedidos deben tener diferentes deslizadores.

 
Por favor, dime por qué no funciona:

OrderSelect(1,SELECT_BY_POS,MODE_TRADES);

código de error 4051. Hay una orden OP_BUY abierta.
Archivos adjuntos:
ma_1.mq4  3 kb
 
itum:

¡Ayúdame a resolver un problema!


Busco las órdenes que están abiertas o pendientes. Si están disponibles, entonces determino qué orden es de compra o de venta. Bajo ciertas condiciones (si una es mayor que la otra o menor que la tercera), quiero cerrar esta orden. Cambia sus parámetros y vuelve a abrirlo.

El problema es que siempre hay una señal para cerrar la orden y para abrirla. Por eso mi orden se cierra, luego se abre de nuevo, y así sucesivamente, se abre y se cierra... )))

¿Cómo resolver este problema? Ga
Creo que es un deja vu... ¿Soy el único? Ya has tenido varias respuestas... ¿Eh?
Ponga aquí su código con las condiciones de apertura y apertura. Vamos a poner el dedo en la llaga... :)
 
an11:
Por favor, dígame por qué no funciona:

OrderSelect(1,SELECT_BY_POS,MODE_TRADES);

código de error 4051. Hay una orden OP_BUY abierta.

El conteo de números en la función OrderSelect( ) comienza desde cero. Y tú tienes 1, lo que significa que estás buscando el segundo pedido, aunque sólo tienes uno en el mercado, por lo que no funciona.

 
Vinin:
Esto se puede hacer con parámetros, pero no con patrones. Primero hay que definir los criterios. Parecido, no similar. Y si es similar, en qué medida. Al menos en cuánto (porcentajes). En un caso el componente de tiempo, en el otro - el de precio. Cómo correlacionarlos entre sí. Aunque puedo adjuntar una capa neuronal. La capa Kohonen lo hace muy bien.

Tengo 12 variantes de un patrón en uno de mis indicadores, el patrón es el mismo pero los valores son siempre diferentes y su proporción es diferente ))), ....) Nunca he trabajado con redes neuronales, creo que mi experiencia en la escritura de algoritmos elementales usando mql no será suficiente, aunque puede ayudarme a solucionarlo. Esta tarea la afronté antes "bárbaramente" sustituyendo a Kohonen, escribiendo todos los parámetros en Exxel en el momento de la aparición del patrón y el resultado si se abría la operación, luego con el análisis de Exxel tenía que buscar más coincidencias en correlación con la rentabilidad. De cualquier forma, conseguí algo y el sistema definió el patrón de forma inteligente, pero aún así no fue muy inteligente).
 
cyclik33: ...

No sé qué función estás usando, pero la idea general es esta: como tu paso no es parejo, te sugiero usar un array, escribes los volúmenes que necesitas en él, y luego usas la función para recorrer su valor.

Ejemplo en mi código:

//+------------------------------------------------------------------+
double getMartinLot(double lot, double arrayLot[]){//ФУНКЦИЯ УПРАВЛЕНИЯ ОБъЕМОМ ТОРГОВ ПО СИСТЕМЕ МАРТИНГЕЙЛА
   static double balance_before, balance_after;    //ДЛЯ ХРАНЕНИЯ СОСТОЯНИЯ БАЛАНСА ДО И ПОСЛЕ СДЕЛОК
   static double save_Lot;   
   static int loop;
   if(loop == ArraySize(arrayLot))loop = 0;   
   balance_after = AccountBalance();               //СОХРАНЕНИЕ ТЕКУЩЕГО СОСТОЯНИЯ БАЛАНСА   
   if(balance_after >= balance_before){            //ПРОВЕРКА ИЗМЕНЕНИЯ БАЛАНСА
      save_Lot = lot;                              //ЕСЛИ ОН НЕ ИЗМЕНИЛСЯ ИЛИ СТАЛ БОЛЬШЕ, ТО СБРАСЫВАЕМ ЛОТ
      loop = 0;
   }else{
      save_Lot = arrayLot[loop];                   //ЕСЛИ СТАЛ МЕНЬШЕ ТО УВЕЛИЧИВАЕМ ЛОТ
      loop++;
   }
   balance_before = balance_after;                 //СОХРАНЯЕМ СОСТОЯНИЕ БАЛАНСА ПОСЛЕ РАБОТЫ
   return(save_Lot);
}
//+------------------------------------------------------------------+
Ejemplo de llamada a una función:
//+------------------------------------------------------------------+
int start()
  {
   double volume[] = {0.1, 0.1, 0.2, 0.3, 0.7};   //создаем массив с объемами

   if(OrdersTotal() == 0){
      OrderSend(Symbol(), OP_BUY, getMartinLot(0.1, volume), Ask, 10, Bid - 25*Point, Bid + 25*Point, "", 777);
   }
}
//+------------------------------------------------------------------+
 
artmedia70:
Creo que es De ja vu... ¿Soy el único? Ya le han contestado varias personas... ¿Eh?
Ponga su código con la condición de abrir y abrir la pose. Vamos a poner el dedo en la llaga... :)
Yo también :))) Valentín, por alguna razón no quiere mostrar el código, probablemente no quiere mostrar sus ideas...
 
ToLik_SRGV:

No sé qué función estás utilizando, pero te doy una idea general: como tu terreno de juego no es plano, te sugiero que utilices un array, que escribas en él los volúmenes que necesitas y que luego utilices la función para recorrer los valores.

Ejemplo en mi código:

Ejemplo de llamada a una función:

¡¡¡¡¡Muchas gracias!!!!!

Yo también uso tu código (y funciona bien por cierto), pero quería instalar el código de Artemis en otro EA, primero, porque tenía más problemas con él, y había una cuestión de principio, por qué no funcionaba correctamente.

¡¡¡¡Muchas gracias de nuevo !!!! ¡Voy a probarlo ahora!

 

La pregunta puede ser trivial, el Asesor Experto está operando en M1, la señal para abrir una orden llegó, supongamos que el stop es corto y la orden se cerró en la sl. pero la condición para abrir una orden sigue existiendo.

¿Cuál es la mejor manera de garantizar que la orden no se abra de nuevo en el mismo minuto?