Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 198

 
Atlis:

Buenas tardes.

Por favor, indique cómo se puede aplicar lo siguiente:

El precio se mueve entre 1,9047 y 1,9080 (las cifras son arbitrarias). Si el precio de apertura de la siguiente vela se mueve fuera de este rango - emite una Alerta. Si no lo hace, espera a la siguiente vela. Y así hasta que el precio salga de la gama.

Gracias de antemano.


   if (Open[0]<1.9047) Alert("Цена ниже заданного диапазона");
   if (Open[0]>1.9080) Alert("Цена выше заданного диапазона");
Esto es sólo un concepto. Habrá alertas en cada tic si se cumple la condición.
 

Este es un fragmento de código, cuyos datos se utilizan para el análisis:

   if (CurTime() == tm2)              //tm1 и tm2 - заданное время
   {
   //ObjectCreate("line2",OBJ_VLINE,0,tm1,0);
   price1=iHigh(Symbol(),PERIOD_M30,1);
   //ObjectCreate("highLine",OBJ_HLINE,0,0,price1);
   price2=iLow(Symbol(),PERIOD_M30,1);
   //ObjectCreate("lowLine",OBJ_HLINE,0,0,price2);
   Alert("price1=",price1);
   Alert("price2=",price2);
   }

Es decir, más adelante el código se verá así:

 if (Open[0]<price2) Alert("Цена ниже заданного диапазона");
 if (Open[0]>price1) Alert("Цена выше заданного диапазона");

Y aquí está la cuestión: ¿cómo y dónde debemos ponerlo? Si está dentro de la condición, no se imprimirá ninguna alerta, y si está fuera de la condición, las alertas se imprimirán en cada tick.

Pido disculpas por mi pregunta mal formulada.

 
Atlis:

Este es un fragmento de código, cuyos datos se utilizan para el análisis:

es decir, más adelante el código se verá así:

Y aquí está la cuestión: ¿cómo y dónde debemos ponerlo? Si está dentro de la condición, no se imprimirá ninguna alerta, y si está fuera de la condición, las alertas se imprimirán en cada tick.

Pido disculpas por mi pregunta mal formulada.

Si pone la condición de comprobación de tiempo dentro, las alertas de precio sólo aparecerán si el precio está fuera de los límites del rango
 
Gracias, creo que lo he solucionado. Pero una pregunta más: ahora las alertas se emiten a partir de un intervalo de tiempo determinado y cuando se sobrepasa el rango hasta la "parada". ¿Hay alguna forma de detener esta "búsqueda" cuando el primer valor satisface la condición?
 
Atlis:
Gracias, lo he solucionado. Aquí hay otra pregunta: las alertas se generan ahora a partir de un intervalo de tiempo especificado y cuando se supera el rango hasta el "tope". ¿Hay alguna manera de detener esta "búsqueda" cuando el primer valor satisface la condición?

Pues bien, hay que entender la condición principal que se cumple todo el tiempo, durante un periodo de tiempo. Por ejemplo, comparando los tiempos. Después de emitir todas las alertas, hay que asignar un nuevo valor a la variable con la que se compara la hora actual. Busca una función que defina una nueva barra. El concepto de su construcción debería ayudarte.

¿Lo has leído aquí?

 

¿Cómo puedo saber la distancia mínima del mercado para colocar una orden pendiente?

 
Elektronik:

¿Cómo puedo saber la distancia mínima del mercado para colocar una orden pendiente?

int level=MarketInfo(Symbol(), MODE_STOPLEVEL);

si el StopLevel es cero, entonces lo más probable es que level=MarketInfo(Symbol(), MODE_SPREAD)*2;

Alpari utiliza precisamente el doble spread como StopLevel.

Para determinar la distancia lea aquí.

 

Gracias artmedia70:

 
artmedia70:

OK, mucho tiempo sin respuesta, te daré una pista: cuando devuelve el valor verdadero de la función isCloseLastPosByStop (), devuelve un valor más, que es el tamaño del lote de la última posición encontrada.

¿Cómo hacerlo? Pase una variable a la función por referencia, en la que escribirá el tamaño del lote en la propia función. Para ello, deberá modificar ligeramente la función isCloseLastPosByStop ()

Si no entiendes nada, busca una función que devuelva el tamaño del lote de la última posición cerrada. O puedes hacer uno tú mismo. Y utilizarlo, pero esto es más costoso que pasar el valor del lote junto con true

He modificado la función para que en lugar de True la función devuelva una variable lote, en la que la propia función he escrito el tamaño del lote.

Todo se compila, pero los pedidos no se abren:

2013.10.23 20:57:46 2011.02.24 16:25 GMT EURUSD,M5: OrderSend error 4051

2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5: cantidad de lotes no válida para la función OrderSend

if(isCloseLastPosByStop ()== lot )         //если последний ордер закрылся по стопу
{
P=lot*2;                                      //открыть ордер объемом = объему закрытому по стопу ордеру умноженному на 2                                  
OrderSend(Symbol(),OP_SELL,P,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else                                         //если последний ордер закрылся не по стопу
{

P=0.1;  
OrderSend(Symbol(),OP_SELL,1,Bid,P,Ask+1500*Point,Ask-300*Point,"jfh",123 );   //открыть ордер обычным объемом 0.1
}
   return(0);
  }
//============================================================  
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp,lot, osl;                                             // добавил переменную - количество лотов в оредере
  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);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl)
    lot=OrderLots( ) ;                              //добавил вычисление количества лотов в ордере который закрылся по стопу.
    return(lot);                                    // вместо возвращаемого функцией значения True вставил переменную lot со значением количества лотов
  }
  return(False);
}

Por favor, dígame cuál es mi error.

Gracias.

 
solnce600:

He modificado la función para que en lugar de True la función devuelva una variable lote, en la que he escrito el tamaño del lote en la propia función.

Todo se compone, pero las órdenes no se abren en el diario dice:

2013.10.23 20:57:46 2011.02.24 16:25 PM EURUSD,M5: OrderSend error 4051

2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5: cantidad de lotes no válida para la función OrderSend

Por favor, aconséjeme cuál es mi error.

Gracias.


La función que determina la última posición cerrada por parada tiene un tipo bool, mientras que usted está intentando devolver el tipo double. En consecuencia, devuelve 0 o 1.

Escribí que deberíamos añadir el paso de una variable por referencia en ella:

//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      t, dg, i, j=-1, k=OrdersHistoryTotal()-1;

   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op           continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss()<0.5*pt)) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
//+----------------------------------------------------------------------------+

Ahora comprueba el último Buy, por ejemplo:

//+----------------------------------------------------------------------------+
double Lot=MarketInfo(Symbol(), MODE_MINLOT);            // задаём минимальное значение переменной
if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot)) {// в переменную Lot будет записано значение лота закрытой позиции
   // Если последний закрытый Buy закрыт по стопу
   Lot= //... эта переменная содержит размер лота закрытой позиции, выполняете нужные вычисления с этой переменной
   }
//+----------------------------------------------------------------------------+

Así...

Razón de la queja: