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

 
wishmast:

Chicos, ya me he devanado los sesos. ¿Cómo puedo hacer que el EA coloque órdenes pendientes en los máximos y mínimos, por ejemplo en 8 velas, con un take profit de 1/4?

Hago algo así:

double Vhod1=iHighest(Symbol(),0,MODE_HIGH,8,0);

double Vhod2=iLowest(Symbol(),0,MODE_LOW,8,0);

doble TP=((Vhod1-Vhod2)/4)+Vhod1;


He intentado cambiar los parámetros, pero sigue obteniendo paradas erróneas o establece el precio en 7,00000; no está claro de dónde viene

iHighest, iLowest le dará la dirección de la vela, pero no el precio.
 
evillive:
iHighest, iLowest dará la dirección de la vela, no el precio.

Así es. Necesitamos

double Vhod1=iHigh(Symbol(), 0, iHighest(Symbol(),0,MODE_HIGH,8,0));

double Vhod2=iLow(Symbol(), 0, iLowest(Symbol(),0,MODE_LOW,8,0));

 
alvlaf:


Lo puse mal, pero igual no hubiera funcionado bien porque... Porque). De todos modos, debería ser así:

1) crear una variable AllowNewOrders en el inite (si no existe)

2) Crear una nueva orden, hasta que se cierre, OnTick de este símbolo está inactivo, pero se ejecutará OnTick de otro símbolo

3) Realice el paso 2 para los demás símbolos hasta alcanzar el límite de MaxOpenOrders

4) cuando la orden termine, si es perdedora o tiene valor cero, prohibir la apertura de nuevas órdenes para todos los ejemplares a través de AllowNewOrders

[aquí está el problema inmediato - cuando la serie perdedora termina, AllowNewOrders=1, pero ¿qué pasa si MaxOpenOrders>1 y hay varias de estas sesiones?]

5) Si el punto 4 no se cumple, entonces puede abrir nuevos pedidos.

El programa DEBE funcionar cuando MaxOpenOrders=1. Tal vez, habrá un problema si prohibimos nuevas órdenes después de una orden no rentable AllowNewOrders=0 y el siguiente OrderSend, por alguna razón, no abre la orden. A continuación escribo cómo me cubro para este caso...

int OnInit()                     
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders", 1);
   return(INIT_SUCCEEDED);
}
//----------------------------------------------------------------------
void OnTick()
{
   if (CountTrades() == 0)  // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 
      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }
      else GlobalVariableSet("AllowNewOrders", 1);
      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))
      || CountHistTrades() == 0)
      // Если последняя сделка прибыльная или это первая сделка, то открывается ордер
      {
         if (OrdersTotal() >= MaxOpenOrders || GlobalVariableGet("AllowNewOrders") == 0) return;
         if (SignalBuy())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
         if (SignalSell())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
         }
      }
   }
}
 
A13ksandr:

A continuación escribo cómo me cubro para esta eventualidad...

int Tries = 5;
ResetLastError();
do
{
   // решение ошибок с предыдущей попытки открытия ордера, например:
   if (_Error == 134)
   {
      _Lot = NormalizeDouble(_Lot / 2, 2);
      if (_Lot < SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)) _Lot = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);
   }
   if (_Error == 138) RefreshRates();
   Ticket = OrderSend(Symbol(), OP_BUY, _Lot, Ask, 3, 0, 0, NULL, 0, 0, clrNONE);
   if (Ticket < 0)
   {
      _Error = GetLastError();
      Sleep(100);
   }
   Tries--;
}
while (Ticket < 0 && Tries > 0);

Si se prevé adecuadamente la solución del error, aumenta el porcentaje de éxito de la apertura de una orden.

 
Hola! Por favor, aconséjame si utilizo la función del post (cada pedido tiene su propio mago) - http://forum.forexpeoples.ru/showthr...=1#post1715092 , cómo quedaría para encontrar los últimos pedidos de ventas o compras, o actualizar una serie de pedidos, si no cada pedido tiene su propio mago, sino que cada serie de pedidos tiene su propio mago. Es decir, se supone que cuando se abre una nueva serie de órdenes con su propio magik, la antigua serie de órdenes sigue abriendo sus propias órdenes con sus propios magiks. Se espera que cada serie tenga su propio beneficio y hay muchas series de pedidos de este tipo.

¡¿Cómo puede cambiar el código siguiente en estas condiciones?
for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol()) continue; if(OrderMagicNumber() < startMagicNumber || OrderMagicNumber() >= startMagicNumber + MaxTrades) continue;

He puesto el código para generar un magik al abrir las primeras órdenes de una serie, pero aquí está el problema al abrir nuevas órdenes en la misma serie.

El código propiamente dicho para generar la magia desde el puesto:
//+------------------------------------------------------------------+
// obtener la siguiente magia de la serie
int getNextMagicNumber(){
int magic = EMPTY;

if (OrdersTotal() == 0) {
return(startMagicNumber);
}

for (int i = startMagicNumber; i < startMagicNumber + MaxTrades; i++){
magic = checkMarketByMagic(i);
if (magic != EMPTY) break;
}

¡if (magic == EMPTY){
magic = startMagicNumber; // el primero de la serie
} else {
magic++; // el siguiente de la serie
}

return(magic);
}
//+------------------------------------------------------------------+
// keekkenen: buscar una orden en el mercado con una magia determinada
int checkMarketByMagic(int magic){
for(int = 0; i < OrdersTotal(); i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber() == magic) return(magic);
}
return(EMPTY);
}
//+------------------------------------------------------------------+
 
Buenas tardes señores del foro,
disculpen si he confundido los hilos, pero no he encontrado el lugar correcto para publicar el TEMA, así que no me echen.

A veces, navegando por Internet en busca de nuevos Asesores Expertos, me encuentro con uno al que no le presté atención, porque su descripción era estándar, de las que hay muchas, pero no me fijé en su nombre.

Si no lo había visto o leído, por favor dame el nombre, y google hará su trabajo o si lo tengo, lo tomaré como un regalo. Tal vez haya un asesor que realice acciones similares.

Voy a describir el significado del Asesor Experto (no hay nada muy sofisticado, lo que necesito ahora).

A grandes rasgos, el trabajo sería el siguiente:

1. Abrir una posición manualmente, por ejemplo comprar.
2. El Asesor Experto establece el Stop Loss y el Take Profit de acuerdo con la configuración.
3. La orden se cierra en el takeprofit - el EA abre inmediatamente otra compra y establece el mismo stoploss y takeprofit hasta que alcanza el primer stoploss o si hay un takeprofit final.
4. Si la posición se cierra con el Stop Loss, el robot no hace nada más. El Asesor Experto espera a que la siguiente orden se abra manualmente.

Eso es todo.

Se lo agradecería mucho.
 
A13ksandr:


Lo inserté mal, pero seguía sin funcionar bien, porque... Porque). En fin, la cosa va así:

1) crear una variable AllowNewOrders en el initem (si no existe)

2) Crear una nueva orden hasta que se cierre OnTick de este símbolo está inactivo, pero OnTick del otro símbolo funcionará

3) Realice el paso 2 para los demás símbolos hasta alcanzar el límite de MaxOpenOrders

4) cuando la orden termine, si es perdedora o tiene valor cero, prohibir la apertura de nuevas órdenes para todos los ejemplares a través de AllowNewOrders

[aquí está el problema inmediato - cuando la serie perdedora termina, AllowNewOrders=1, pero ¿qué pasa si MaxOpenOrders>1 y hay varias de estas sesiones?]

5) Si el punto 4 no se cumple, entonces puede abrir nuevos pedidos.

El programa DEBE funcionar cuando MaxOpenOrders=1. Tal vez, habrá un problema si prohibimos nuevas órdenes después de una orden no rentable AllowNewOrders=0 y el siguiente OrderSend, por alguna razón, no abre la orden. A continuación escribo cómo me cubro para este caso.

Gracias Alexander, lo comprobaré mañana. [de ahí que el problema sea inmediato: cuando se terminan las series perdedoras, AllowNewOrders=1, y si MaxOpenOrders>1 y hay varias sesiones...]. Si MaxOpenOrders>1 por algún valor, entonces en idea AllowNewOrders=1 también debe ser mayor por el mismo valor. Pero no necesitamos molestarnos con esto y MaxOpenOrders debería ser eliminado en absoluto, porque en esta versión del programa no se planea más de una serie de todos modos.
 
alvlaf:
Gracias Alexander, lo comprobaré mañana. [de ahí el problema inmediato: cuando se termina la serie de pérdidas, AllowNewOrders=1, pero si MaxOpenOrders>1 y hay más de una sesión...]. Si MaxOpenOrders>1 por algún valor, entonces en idea AllowNewOrders=1 también debe ser mayor por el mismo valor. Pero no necesito molestarme con ello por ahora y MaxOpenOrders debería omitirse por completo, porque en esta versión del programa no se planea más de una serie de todos modos.
Lo probé, funcionó bien los primeros cinco minutos, luego empecé a abrir varias ofertas (4) a la vez y para el mismo par con lote más grande. Alexander, no entiendo muy bien cómo la variable global obtiene y cambia su valor en tu versión.
 

Hola a todos.

Aquí hay un objeto gráfico en un gráfico.

Sus parámetros son el tiempo, el valor y el código. El valor corresponde al precio al que se encuentra el objeto.

¿Hay alguna manera de obtener su tiempo y valor (a través de una función o algo más)?

\\\\\

O, en un sentido más amplio, ¿hay algún objeto (aparte de las líneas de tendencia, las líneas de Fibonacci, los Gannets) que nos permita obtener su tiempo y su precio al instante?

Necesito colocar algunos marcadores en el gráfico y obtener información de ellos. Dibujar líneas de tendencia, fibo, etc... - Es terriblemente engorroso y lento...

Gracias por las respuestas.

PS Acaba de empezar a estudiar...

 
ilmel:

Hola a todos.

Aquí hay un objeto gráfico en un gráfico.

Sus parámetros son el tiempo, el valor y el código. El valor corresponde al precio al que se encuentra el objeto.

¿Hay alguna manera de obtener su tiempo y valor (a través de una función o algo más)?

\\\\\

O, en un contexto más amplio, ¿hay algún objeto (aparte de las líneas de tendencia, las líneas de Fibonacci, los Gannets) que pueda derivarse inmediatamente al tiempo y al precio?

Necesito colocar algunos marcadores en el gráfico y obtener información de ellos. Dibujar líneas de tendencia, fibo, etc... - Es terriblemente engorroso y lento...

Gracias por las respuestas.

PS Acaba de empezar a estudiar...

https://docs.mql4.com/ru/objects/objectgetdouble
https://docs.mql4.com/ru/objects/objectgetinteger