Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 135

 
Vitaly Muzichenko:
¿Pones los precios de una vez o los obtienes y luego los pones en el cálculo?
Vitaly Muzichenko:
¿Se fijan los precios de una vez, o se obtienen y luego se pegan en el cálculo?
int k=periodo;
for(int i=1; i<=periodo; i++)
{
H1_Close[i]=Close[k];
k--;
}
Tomo un trozo de timesession igual al periodo que empieza desde la última barra cerrada y lo volteo en el array, porque 1 es la penúltima barra en timesession y el cálculo debe empezar desde i-ésima
Es decir, mi función debería devolver el valor SMMA de la última barra cerrada.
 
Buenas tardes a todos.
El código siguiente codifica una idea sencilla.
Si la última orden cerrada fue en SEL
Si la última orden cerrada estaba en la NEL
Abrir una orden NEL
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                            
if ( OrderType ()==OP_SELL)                                            
X = OrderProfit( );                                            

if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                            
if ( OrderType ()==OP_BUY)                                              
if(X < 0)                                              

OrderSend(Symbol(),OP_SELL,0.1,Bid ,3,Ask+400*Point,Ask-200*Point,"17-10",123 );



PREGUNTA
¿Qué construcción del lenguaje se puede utilizar para añadir dos condiciones más a este código (marcado en rojo)?

Si la última orden cerrada es NEL
Si la última orden CEL se cerró
Si la última orden cerrada se ha cerrado en la NEL
Si la última orden cerrada se ha cerrado en unSL

Graciaspor su ayuda.


Te agradecería mucho que escribieras el código y no te limitaras a explicar lo que hay que hacer.
 
Hola. Estoy escribiendo un script para eliminar todas las órdenes pendientes. Sin embargo, sólo borra una orden. Siempre tengo dos órdenes pendientes o una. En cualquiera de los dos casos sólo se borra una Buy Stop. Para eliminar el Sell Stop hay que volver a ejecutar el script, siempre que no haya otras órdenes de Buy Stop. Por favor, indique dónde está el error.

void EliminarPedidos()
{
int Total=Total de pedidos();
for(int i=0;i<Total;i++)
if(OrderSelect(i,SELECT_BY_POS))
{
int type=Tipo de pedido(), ticket=Ticket de pedido();
bool c;
interruptor(tipo)
{
caso 4:
c=OrderDelete(ticket);
si(!c)
Print(GetLastError());
romper;
caso 5:
c=OrderDelete(ticket);
si(!c)
Print(GetLastError());
romper;
}
}
}
 
0B53RV3R:
Hola. Estoy escribiendo un script para eliminar todas las órdenes pendientes. Sin embargo, sólo borra una orden. Siempre tengo dos órdenes pendientes o una. En cualquiera de los dos casos sólo se borra una Buy Stop. Para eliminar el Sell Stop hay que volver a ejecutar el script, siempre que no haya otras órdenes de Buy Stop. Por favor, indique dónde se encuentra el error.

void EliminarPedidos()
{
int Total=Total de pedidos();
for(int i=0;i<Total;i++)
if(OrderSelect(i,SELECT_BY_POS))
{
int type=Tipo de pedido(), ticket=Ticket de pedido();
bool c;
interruptor(tipo)
{
caso 4:
c=OrderDelete(ticket);
si(!c)
Print(GetLastError());
romper;
caso 5:
c=OrderDelete(ticket);
si(!c)
Print(GetLastError());
romper;
}
}
}
Cambia la dirección de la búsqueda for(i=total-1;i>=0;i--)
 
Maxim Kuznetsov:
cambiar la dirección de la búsqueda for(i=total-1;i>=0;i--)
Gracias, ahora funciona. ¿Estoy en lo cierto al entender que cuando se elimina una orden con índice 0, se le asigna el índice 0 a una orden con índice 1, y en la siguiente iteración i == 1, y dicha orden no existe. ¿Puede decirme si es así?
 
0B53RV3R:
Gracias, ahora funciona. ¿Entiendo correctamente que cuando se elimina una orden con índice 0, se le asigna el índice 0 a una orden con índice 1, y en la siguiente iteración i == 1, y no aparece dicha orden. ¿Puede decir si este es el caso?
Sí.
 

Hay una función de fractal personalizable, bueno, eso es muy pesado. He dejado el dibujo de los objetos sólo para mostrar visualmente si los fractales se están formando correctamente - no va a suceder.

Pregunta: cómo podemos facilitarlo, porque las pruebas visuales son estúpidas:

extern int FrLeft=15; // Баров слева
extern int FrRight=5; // Баров справа

//-----------------------------------------------------------------------------------------------
void OnTick()
{
int nFrUp= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_UPPER); // Возвращает номер бара
int nFrDn= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_LOWER); // Возвращает номер бара
double FrHigh = High[nFrUp]; // Цена верхнего фрактала
double FrLow  = Low [nFrDn]; // Цена нижнего фрактала

SetArrow("FrUp"+"_"+(string)Time[nFrUp], Time[nFrUp], High[nFrUp], clrDeepSkyBlue, 217, 2, ANCHOR_BOTTOM);
SetArrow("FrDn"+"_"+(string)Time[nFrDn], Time[nFrDn], Low[nFrDn], clrDeepPink, 218, 2, ANCHOR_TOP);

// Comment("Price: ",FrHigh,", Num: ",nFrUp,"\nPrice: ",FrLow,", Num: ",nFrDn);
}

//----------------------------------------------------------------------------------------------+
//---------------------- Возвращает номер бара фрактала (настраиваемый) ------------------------+
//----------------------------------------------------------------------------------------------+
int GetBarFractal(string symb,ENUM_TIMEFRAMES tf=0,int nLeft=2,int nRight=2,int numFr=0,int mode=MODE_UPPER) {
int i=0,cn=0,pos=0,r=0,l=0,e=0,equals,bars;
double _high[], _low[];
nLeft=nLeft<=2?2:nLeft;
nRight=nRight<=2?2:nRight;
equals=nLeft+nRight;
bars=Bars(symb,tf)-equals;
ArraySetAsSeries(_high,true);
ArraySetAsSeries(_low,true);

  for(pos=nRight+1; pos<bars; pos++) {
   r=nRight;
   if(mode==MODE_UPPER) {
    CopyHigh(symb,tf,0,pos+equals+1,_high);
    for(i=1; i<=r; i++) {
     if(_high[pos]<=_high[pos-i]) break;
   }}
   if(mode==MODE_LOWER) {
    CopyLow(symb,tf,0,pos+equals+1,_low);
    for(i=1; i<=r; i++) {
     if(_low[pos]>=_low[pos-i]) break;
   }}
   //--
   if(i==r+1) {
    l=nLeft;
    e=equals;
     for(int j=1; j<=l+equals; j++) {
      if(mode==MODE_UPPER) {
       if(_high[pos]<_high[pos+j])  break;
       if(_high[pos]>_high[pos+j])  l--;
       if(_high[pos]==_high[pos+j]) e--;
      }
      if(mode==MODE_LOWER) {
       if(_low[pos]>_low[pos+j])  break;
       if(_low[pos]<_low[pos+j])  l--;
       if(_low[pos]==_low[pos+j]) e--;
      }
      if(l==0) {
       cn++;
       if(cn>numFr) return(pos);
      }
      //--
      if(e<0) break;
   }}
  }
   Print(__FUNCTION__": Фрактал не найден");
  return(0);
}

//----------------------------------------------------------------------------------------------+
//------------------- Функция рисования значка на графике, объект OBJ_ARROW --------------------+
//----------------------------------------------------------------------------------------------+
void SetArrow(string nm="", datetime t1=0, double p1=0, color col=clrRed,
                                           int code=252, int width=1, int anchor=0) {
if(ObjectFind(0,nm)==-1) {
    ObjectCreate(0,nm,OBJ_ARROW,0,0,0);
    ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
    ObjectSetInteger(0,nm,OBJPROP_ARROWCODE,code);
    ObjectSetInteger(0,nm,OBJPROP_ANCHOR,anchor);
    ObjectSetInteger(0,nm,OBJPROP_WIDTH,width);
    ObjectSetInteger(0,nm,OBJPROP_SELECTED,false);
    ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
    ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
    ObjectSetDouble(0,nm,OBJPROP_PRICE,p1);
    ObjectSetInteger(0,nm,OBJPROP_TIME,t1);
   }
}

Gracias.

 
Vitaly Muzichenko:

Hay una función de fractal personalizable, bueno, eso es muy pesado. He dejado el dibujo de los objetos sólo para mostrar visualmente si los fractales se están formando correctamente - no estará allí.

Pregunta: cómo puedo hacerlo más fácil, porque es estúpido probarlo visualmente:

Gracias.

Sólo se puede facilitar convirtiendo todo en un indicador. Incluso el comentario en la esquina superior izquierda del gráfico y, sobre todo, las marcas de apertura y cierre de la posición, que pone el propio probador, están ralentizando las pruebas.
 

Hola. ¿Podría aconsejar a un recién llegado?

He aquí un ejemplo:

si(Condición1)

si(Condición2)

{

}

si no

{

}

Según el código, Else debe referirse a if(condition1) y se ejecutará si no se cumple la condición1

Pero en realidad también se ejecutará si no se cumple la Condición2.

 
Andy-D:

Hola. ¿Podría aconsejar a un recién llegado?

He aquí un ejemplo:

si(Condición1)

si(Condición2)

{

}

si no

{

}

Según el código, Else debe referirse a if(condition1) y se ejecutará si no se cumple la condición1

Pero en realidad se ejecutará si la Condición2 no se cumple.


Acostúmbrate a poner los frenos rizados inmediatamente con la condición

si(Condición)

{

}

A de acuerdo con su pregunta

if(Условие1)
   {
       if(Условие2)

        {

        }
    }
   else

    {

    }