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

 

itum:

¿Cómo resolver este problema? Ga

Haga la manipulación de la condición sólo una vez al principio de la barra.

Alternativamente, ejecute una bandera que se establezca si se coloca una orden y se restablezca cuando las condiciones hayan cambiado significativamente.

 

Уважаемые програмисты.

Por favor, díganme qué insertar (y dónde insertarlo, si es posible) en el código para que el EA abra una posición con el lote anterior multiplicado por 2 si la operación anterior fue perdedora.

Muchas gracias.

Sólo quiero hacer una pregunta: ¿Qué debo hacer si quiero abrir un puesto?

 
Busque los EA con el nombre de Martingala.
 

Roger:
Ищите советники с кодовым названием Мартингейл.

He estado buscando uno pero no me funciona.

He encontrado uno que debería duplicar un lote si una operación anterior era perdedora, pero no quiere funcionar.


 
Esto probablemente significa que si se le ofrece el código aquí, todavía no puede ponerlo en su EA usted mismo, ¿verdad?
 
Roger:
Esto probablemente significa que si se le ofrece el código aquí, todavía no puede ponerlo en su EA usted mismo, ¿verdad?

No, significa que el EA no funcionaba, y no puedo encontrar uno que funcione con el trozo de código que necesito.
 
 
cyclik33:

No, significa que el EA no funcionaba, y no puedo encontrar uno que funcione con el trozo de código que necesito.

En las variables globales establece el valor inicial del lote:

extern double Lot = 0.1

Allí asignamos este valor a la variable, que pasará el valor del lote a la función de apertura de la posición:

double Lots_New = Lot;
Después de cerrar la posición, comprobemos el beneficio/pérdida:
if (isLossLastPos(NULL, -1, Magic))
   Lots_New *= 2;
else if (!isLossLastPos(NULL, -1, Magic))
   Lots_New = Lot;

Y la función en sí, gracias a Igor Kim...

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      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)) {
    if (OrderProfit()<0) return(True);
  }
  return(False);
}
 

cyclik33:

Estimados programadores.
Por favor, aconséjame qué insertar (y dónde insertarlo si es posible) en el código para que el EA abra una posición con el lote anterior multiplicado por 2, si la operación anterior fue perdedora.
Se lo agradezco de antemano.
Boris.

Boris, no es nada difícil, aquí hay una función simple que implementa el principio de martingala:

//+------------------------------------------------------------------+
double getMartinLot(double lot, double x){         //ФУНКЦИЯ УПРАВЛЕНИЯ ОБъЕМОМ ТОРГОВ ПО СИСТЕМЕ МАРТИНГЕЙЛА
   static double balance_before, balance_after;    //ДЛЯ ХРАНЕНИЯ СОСТОЯНИЯ БАЛАНСА ДО И ПОСЛЕ СДЕЛОК
   static double save_Lot;
   balance_after = AccountBalance();               //СОХРАНЕНИЕ ТЕКУЩЕГО СОСТОЯНИЯ БАЛАНСА
   if(balance_after >= balance_before){            //ПРОВЕРКА ИЗМЕНЕНИЯ БАЛАНСА
      save_Lot = lot;                              //ЕСЛИ ОН НЕ ИЗМЕНИЛСЯ ИЛИ СТАЛ БОЛЬШЕ, ТО СБРАСЫВАЕМ ЛОТ ДО БАЗОВОГО
   }else{
      save_Lot *= x;                               //ЕСЛИ СТАЛ МЕНЬШЕ ТО УВЕЛИЧИВАЕМ ЛОТ НА Х РАЗ
   }
   balance_before = balance_after;                 //СОХРАНЯЕМ СОСТОЯНИЕ БАЛАНСА ПОСЛЕ РАБОТЫ
   return(save_Lot);
}
//+------------------------------------------------------------------+

Pasa el volumen inicial(doble lote), y el paso(doble x) como parámetros.
Inserte el método directamente en OrderSend en lugar del parámetro de volumen.

Ejemplo de llamada a una función:

if(OrdersTotal() == 0){
   OrderSend(Symbol(), OP_BUY, getMartinLot(0.1, 2), Ask, 10, Bid-25*Point, Bid+25*Point);
}
 
¿Alguien conoce un indicador que devuelva varios extremos de ZigZag recientes?