[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 118

 
Shixan:

Por la tarde.

Escribí un código para abrir dos órdenes pendientes (BuyStop y SellStop) en las condiciones a=true y b=true y después de un tiempo el EA cierra ambas órdenes, hasta que aparece una nueva señal, pero a veces el EA abre 2 órdenes pendientes en la misma dirección. ¿Por qué ocurre esto y cómo evitar este "error"?



if (a=true && b=true)
{
int CuentaPedidos = TotalPedidos();
si (OrderCount>1) return(0);
ticket1=OrderSend(Symbol(), OP_BUYSTOP, getLot(), PriceOpen_Buy, slippage, PriceOpen_Sell,0,0,Green);
Sleep(1000);

ticket2=OrderSend(Symbol(), OP_SELLSTOP, getLot(), PriceOpen_Sell, slippage, PriceOpen_Buy,0,0,Green);

Sleep(1000*59*TimeFrame);

for (int i=TotalPedidos()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderType()==OP_BUYSTOP ) OrderDelete(OrderTicket());
if (OrderType()==OP_SELLSTOP ) OrderDelete(OrderTicket());
if (OrderType()==OP_SELL ) OrderClose(OrderTicket(),OrderLots(),Ask, slippage);
if (OrderType()==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),Bid,slippage);
}

return(0);

}


¿Puedes darme una pista?

Gracias de antemano

No he mirado su código, pero... para NO colocar dos o más órdenes en UNA señal, haga una comprobación ANTES de colocar una orden: ¿hay alguna orden ya colocada en esta señal? Si no lo hay, ponlo, si lo hay, echa humo.
 
mario065:

Hola,

¿Es posible introducir un horario con un peso fijo 1:1 en los ajustes?

Si es posible, por favor, dígame cómo.

Gracias de antemano.

Esta biblioteca puede.

Sección "3.3 Función para establecer las propiedades del gráfico" función ServiceSetScaleFix1To1().

La biblioteca sólo funciona con las localizaciones en ruso e inglés. También puede funcionar en el tuyo.

 
Hola, podríais decirme por qué en la nueva build 451 en MetaEditor al compilar no aparece el segundo archivo ex 4 en la carpeta de expertos junto al archivo mq 4
 

Aquí está la función de apertura de pedidos:

//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double price)
{
   int ticket = -1;
   double SL = OrderOpenPrice() + i_sl * pt;
   double TP = OrderOpenPrice() - i_tp * pt;
   
   if (price < Bid)
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(price), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
   {
      if (i_sl > 0 && OrderStopLoss() == 0)
      {
         if (!OrderModify(ticket, OrderOpenPrice(), ND(SL), ND(TP), 0, Red))
         {
            Print ("Ошибка установки первичного стопа для шортов ", OrderType(), " - ", GetLastError());
            Print("pt = ", pt);
            Print("Ask = ", Ask);
            Print("Bid = ", Bid);
            Print("SL_s = ", OrderOpenPrice() + i_sl * pt);
            Print("TP_s = ", OrderOpenPrice() - i_tp * pt);
         }
      }
   }
       return (true);
}

Aquí está la impresión de los parámetros:

2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: TP_s = 1.4499
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: SL_s = 1.4519
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Bid = 1.4513
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ask = 1.4515
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: pt = 0.0001
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ошибка установки первичного стопа для шортов 5 - 4051
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: OrderModify error 4051
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: invalid takeprofit for OrderModify function
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: open #1 sell stop 0.10 EURUSD at 1.45091 ok

Aquí se puede ver claramente que el precio TP y SL están por debajo y por encima del Ask y Bid respectivamente, es decir, todo es correcto. Pero por alguna razón me da un error de modificación porque la parada es incorrecta. ¿Cómo es eso?

 
hoz:

Aquí está la función de apertura de pedidos:

Aquí está la impresión de los parámetros:

Aquí se puede ver claramente que el precio TP y SL están por debajo y por encima del Ask y Bid respectivamente, es decir, todo es correcto. Pero por alguna razón me da un error de modificación porque la parada es incorrecta. ¿Cómo es eso?

¿Acaso lees lo que se regaña?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Valor del parámetro de la función no válido

Si no entiendes nada, lo solucionaremos con el resto del mundo...

ZZY. Cuando se coloca una orden pendiente, la cadena

if (price < Bid)

Cuando se coloca una orden pendiente, la cadena no debería ser muy relevante. Debe comprobarse la correspondencia con la distancia mínima permitida establecida en MarketInfo(Symbol(), MODE_STOPLEVEL). Lo primero que me llamó la atención de inmediato.

La segunda es imprimir el precio al que se fija la orden. El Stop y el Take no deben establecerse en relación con el Ask y el Bid, sino en relación con el precio de establecimiento de la orden

 
Zhunko:

Esta biblioteca puede.

Sección "3.3 Funciones de ajuste de las propiedades del gráfico" función ServiceSetScaleFix1To1().

La biblioteca sólo funciona con localizaciones en ruso e inglés. También puede funcionar en el tuyo.

Gracias Zhunko.
 
artmedia70:

¿Acaso lees lo que se regaña?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Valor no válido del parámetro de la función

Mira los parámetros pasados a la función llamada. Cuando no se aclare nada, lo resolveremos en paz...


Claro que lo estoy leyendo, por eso tengo curiosidad. He desvinculado todos los parámetros de entrada.

Esto es lo que tengo:

bool OpenSell(double price)
{
   int ticket = -1;
   double SL = OrderOpenPrice() + i_sl * pt;
   double TP = OrderOpenPrice() - i_tp * pt;
   
   if (price < Bid)
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(price), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
   {
      if (i_sl > 0 && OrderStopLoss() == 0)
      {
         Print("ND(price) = ", DoubleToStr(ND(price),Digits));
         Print("ND(SL) = ", DoubleToStr(ND(SL),Digits));
         Print("ND(TP) = ", DoubleToStr(ND(TP),Digits));
         Print("ND(OOP) = ", DoubleToStr(ND(OrderOpenPrice()),Digits));
         if (!OrderModify(ticket, ND(OrderOpenPrice()), ND(SL), ND(TP), 0, Red))
         {
            Print ("Ошибка установки первичного стопа для шортов ", OrderType(), " - ", GetLastError());
            Print("pt = ", pt);
            Print("Ask = ", Ask);
            Print("Bid = ", Bid);
            Print("SL_s = ", OrderOpenPrice() + i_sl * pt);
            Print("TP_s = ", OrderOpenPrice() - i_tp * pt);
         }
      }
   }
       return (true);
}

Esto es lo que hay en el registro:

2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: TP_s = 1.4485
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: SL_s = 1.4505
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Bid = 1.4496
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ask = 1.4497
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: pt = 0.0001
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ошибка установки первичного стопа для шортов 5 - 4051
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: OrderModify error 4051
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: invalid takeprofit for OrderModify function
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(OOP) = 1.44946
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(TP) = -0.00100
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(SL) = 0.00100
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(price) = 1.44946
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: open #4 sell stop 0.10 EURUSD at 1.44946 ok

Algunas de las órdenes se modifican y otras no. Los valores de ND(TP), ND(SL) al principio fueron devueltos al azar. ¿Por qué?

La función de normalización, por cierto, es mía:

//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
 
artmedia70:

¿Acaso lees lo que se regaña?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Valor no válido del parámetro de la función

Ver los parámetros que se pasan a la función que se va a llamar.Cuando no hay nada claro...

ZS. Cuando se coloca una orden pendiente la línea

if (price < Bid)

Esto no es muy apropiado. Debe comprobar si la distancia mínima permitida corresponde a la especificada en MarketInfo(Symbol(), MODE_STOPLEVEL). Lo primero que me llamó la atención de inmediato.



Suelo encontrarme con comprobaciones similares para la modificación del pedido, pero no para la apertura. Ya lo he visto. Si pongo el precio pendiente en bystop, será un error. Y si pongo un stop de 10 pips seguramente será mayor que el valor de StopLoss. No comercio con ticks :)
 
artmedia70:


En segundo lugar, imprime el precio al que se fija la orden. Los Stop y Take no deben colocarse en relación con el Ask y el Bid, sino en relación con el precio al que se establece la orden



¿Supongo que esto es para modificar? Al fin y al cabo, lo que nos importa al abrir la orden es la oferta y la demanda. He aclarado todo con el post anterior.
 

Buenas tardes,

Quiero hacer que un EA funcione en varias ventanas al mismo tiempo. Pero sólo se puede abrir una orden para cada instrumento. Por lo tanto, ahora hay una condición:

int total = OrdersTotal();

si (total<1) { análisis y bloqueo de posición de apertura} si no { análisis y bloqueo de posición de cierre }

Ahora, si se abre en dos símbolos al mismo tiempo, la apertura en uno se bloqueará en el otro. Por eso me he inventado algo parecido:

int total = OrdersTotal();

int cnt;

if(total>0)
{
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol())
{
Symbol_FLAG = true;
}
}
}

if(total<1 || total>0 && Symbol_FLAG == false) { análisis y apertura del bloque ptposition}

pero no funciona en el probador...

Tal vez puedas decírmelo, ¿quizás estoy tramando algo irrealizable?