[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 29

 

Hola...

Escribí un EA pero me encontré con este problema:

Tengo órdenes opuestas y, por ejemplo, para la COMPRA tengo 150 pips de stop y 150 pips de beneficio, para la VENTA se establecen los mismos niveles, pero sólo al revés (es decir, lo que es para el beneficio de la compra, luego para el stop de la venta), es decir, en realidad tengo que cerrar todo simultáneamente, tanto la venta con la compra como la compra con la venta..... pero hay otra cosa, el spread!)) Y de esas dos órdenes opuestas ya se abren las otras 8 (por supuesto si se necesitan las ocho, las condiciones son diferentes para ellas, también son opuestas 4/4)


¿Cómo puedo programar correctamente el código para que se cierren todas las órdenes cuando alcancen el mismo precio simultáneamente? Pues en el probador, cuando hago la prueba, el precio a veces llega a un nivel deseado, por ejemplo, vende cerrado (no llega a un nivel predeterminado, creo que es un spread) y compra colgado y al poco tiempo cae y compra cerrado en el stop, por lo que no puedo ver el resultado correcto.


Te agradecería que expresaras tu idea de forma programada, es decir, con código.


Para entenderlo con más detalle, os pongo la parte en la que se abren mis dos órdenes opuestas (las primeras).

if (by == FALSE) 
   {   g_ticket_112 = OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask, Digits), 1, NormalizeDouble(Ask - SL * Point, Digits), 
       NormalizeDouble(Ask + TP * Point, Digits), "", 111, 0, Blue);
   if (g_ticket_112 > 0) by = TRUE;
   } 
     
     if (se == false) 
   {for (g_pos_116 = OrdersTotal() - 1; g_pos_116 >= 0; g_pos_116--) 
   {if (OrderSelect(g_pos_116, SELECT_BY_POS, MODE_TRADES)) 
   {if (OrderSymbol() != Symbol() || OrderMagicNumber() != 111) continue;
    if (se == false) 
   {g_ticket_113 = OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid, Digits), 1, 
    OrderTakeProfit(),OrderStopLoss() , "", 222, 0, Blue);
    if (g_ticket_113 > 0) se = TRUE;}}}} 
 
¿Tenéis un script que extienda el horario a todos los fines de semana, es decir, que el horario no se junte con el lunes, y se queden los días vacíos sábado y domingo.
 

Hola a todos.

La pregunta es si tiene una función que detecte la apertura de una nueva barra(sin importar el marco temporal) o, más precisamente, diferentes variantes de encontrar una nueva barra.

 
dmitriy086:

Hola a todos.

La pregunta es, ¿quién tiene la función que determina el hecho de abrir una nueva barra (no importa qué marco de tiempo), o más precisamente, puede diferentes variantes (remolques) encontrar una nueva barra.


Recordar la hora oldtime = Time[0] y comparar la hora recordada if( oldtime !=Time[0])Print("¡Hurra por un nuevo bar!!");

SZY: los remolques están en la función iTime().

:)

 
//+------------------------------------------------------------------+
bool fNewBar()
  {
   static datetime NewTime=0;
   if(NewTime!=iTime (Symbol(),0,0))
    {
     if(NewTime==0)
      {
       NewTime=iTime (Symbol(),0,1);return(false);
      }      
     NewTime=iTime (Symbol(),0,0);
     return(true);
    }
   return(false);     
  }
//+----------------------------------------------------------------------------+

IgorM, el problema es que esta f-fi está en un gráfico sintético donde iTime[0] puede ser igual a iTime[1], así que ¿cómo podemos deshacernos del tiempo para que el Asesor Experto abra sólo una operación en una nueva barra?
 
dmitriy086:
IgorM, el problema es que este f-fi está en un gráfico sintético donde iTime[0] puede ser igual a iTime[1], así que ¿cómo podemos deshacernos del tiempo para que el EA abra sólo una operación en una nueva barra?


si la hora de las barras 0 y 1 no puede coincidir por alguna razón desconocida - el tipo datetime almacena los datos en segundos, cambie la hora de la barra en al menos 1 segundo

entonces trate de recordar todas las características de la primera barra cerrada, es decir, OHLC, volumen y tiempo de apertura, si cambia incluso un parámetro - significa una nueva barra

iBars() mostrará el número de barras en el marco de tiempo actual, y estará limitado por la configuración de la terminal, puede intentar comparar el número de barras con el número de barras almacenado, y en el momento de una nueva barra, estos valores son diferentes - pero no siempre, a mí me funcionó de esta manera, pero probablemente debido al número de construcción de MT4 esta opción puede no funcionar

 
Por casualidad, ¿tienes un trozo de código preparado? No consigo averiguar cómo recordar OHLC[1] y compararlo con OHLC[0]...
 
dmitriy086:
No tienes un trozo de código listo, ¿verdad? No consigo averiguar cómo memorizar OHLC[1] y compararlo con OHLC[0]...


OHLC es un acrónimo común para Open,High,Low,Close

comparar no con el cero, sino el primero con el memorizado anteriormente, es decir

init(){

oldHigh = High[1];

///

}

start(){

double tmp = High[1];

if(tmp !=oldHigh) {oldHigh = tmp;

//comprobar el resto de los parámetros de la barra

}

}

 

Gracias por el consejo, lo investigaré...

 

Por favor, indique cómo establecer la comprobación correcta en la condición de apertura de la posición - si hay una posición abierta para este instrumento o no. ¿Y si hay una posición para el símbolo (cualquier venta o compra), entonces la apertura no se produce, de lo contrario se activa la señal para abrir la posición?

Aquí está el código (creo que es responsable de la apertura de posiciones):

if (NumberOfPositions("" ,-1,Magic)>=2)  флаг1=1;//если число позиций >= 2
if (NumberOfPositions("" ,-1,Magic)<1 )  флаг1=0;//если нет откр. позиций
if ( TradeDOWN==true && флаг1==0) {//если условия соответствуют заданным  
//продаем 1-й символ и покупаем второй символ
//----------------------------------------
if (NumberOfPositions(Symbol_1,OP_SELL,Magic)<1){//если нет поз.селл и поз.бай по 1-му символу
 if (NumberOfPositions(Symbol_1,OP_BUY,Magic)<1)
 {
 SL=0;TP=0;//открываем позицию, задаем стопы :
if(StopLoss_1>0)   SL=Bid_Tiker1+POINT_Tiker1*StopLoss_1;
if(TakeProfit_1>0) TP=Bid_Tiker1-POINT_Tiker1*TakeProfit_1; 
 ti=OpenPosition(Symbol_1, OP_SELL, Lots_1,0 ,0,Magic);
if(StopLoss_1>0 || TakeProfit_1>0) {//ставим стопы 
if (OrderSelect(ti, SELECT_BY_TICKET)) ModifyOrder(-1, SL, TP, clModifySell);}
                                   }}//если нет поз.селл и поз.бай по 1-му символу
//--------------------------------------
if (NumberOfPositions(Symbol_2,OP_BUY,Magic)<1){//если нет поз. бай и поз. селл по 2-му символу 
 if (NumberOfPositions(Symbol_2,OP_SELL,Magic)<1)
 {
   SL=0;TP=0;//открываем позицию, задаем стопы :
if(StopLoss_2>0)   SL=Bid_Tiker2-POINT_Tiker2*StopLoss_2;
if(TakeProfit_2>0) TP=Ask_Tiker2+POINT_Tiker2*TakeProfit_2;   
ti=OpenPosition(Symbol_2, OP_BUY, Lots_2,0,0,Magic);
if(StopLoss_2>0 || TakeProfit_2>0) {//ставим стопы 
if (OrderSelect(ti, SELECT_BY_TICKET))ModifyOrder(-1, SL, TP, clModifyBuy); }
                                   }}//если нет поз. бай и поз. селл по 2-му символу

Parece correcto por lógica, pero sigue abriendo varias posiciones para un símbolo.

P.D. Yo no soy el programador. Si es posible en más detalles explicar al dummie.

Razón de la queja: